2017-05-17 7 views
2

Forth a une pile et une pile de retour. Pour autant que je sache, le point de la pile de retour est de stocker les valeurs précédentes du compteur de programme. C Les programmes C placent la valeur précédente du compteur de programme sur la pile et n'utilisent pas de pile de retour. Est-ce que Forth a seulement besoin d'une pile de retour parce qu'elle retourne le (s) résultat (s) sur la pile, et donc que la valeur précédente du compteur de programme peut être enterrée?Est-ce qu'un langage de type Forth peut être implémenté avec une seule pile?

+1

Je ne suis pas un expert, mais je suppose que dans C il est utile que la taille des paramètres (qui sont les données que vous devez passer pour "obtenir" l'adresse de retour) est connue à la compilation, et statique. Ainsi est la taille de la valeur de retour. Dans Forth, les deux ne sont pas connus. – unwind

+1

En C, généralement, la pile de retour et la pile de paramètres sont identiques. Les arguments et l'adresse de retour sont (généralement, ce n'est pas une nécessité) sur la pile de la machine. Mais C peut tout aussi bien passer des arguments dans des registres, et les renvoie aussi dans les registres. C'est pourquoi C n'est pas un langage basé sur une pile comme Forth.Dans Forth, la pile (s) sont cruciales pour la langue. –

+1

Dans Forth, la pile de retour est également souvent utilisée comme stockage temporaire, par ex. pour extraire des valeurs de la pile de données, les valeurs "en dessous" sont plus facilement accessibles. Et il joue généralement un rôle dans la gestion des exceptions. Ce n'est pas seulement utilisé pour se souvenir des adresses de retour. En fait, il n'est même pas obligatoire que de telles valeurs de retour y soient stockées. –

Répondre

5

Le "langage d'assemblage portable" devrait être proche. C'est un concept pour un compilateur pour un langage presque identique à Forth standard/traditionnel. Il y a quelques restrictions pour quels types de programmes peuvent être écrits. La plupart du temps, vous devez éviter les situations où la profondeur de la pile ne peut pas être déterminée statiquement.

Ce langage peut être compilé d'une manière qui ne nécessite qu'une seule pile.

http://www.complang.tuwien.ac.at/anton/euroforth/ef13/papers/ertl-paf.pdf

3

Préface: J'ai écrit des extensions pour débogueurs de matériel pour tracer quelques problèmes avec les piles d'appel foiré, donc je l'ai vu quelques décharges hexagonales de C réelles piles.

La pile C se compose d'un mélange d'adresses de retour, de variables locales et de paramètres de fonction. Pour chaque fonction, vous pouvez savoir où elle attend quelle valeur, mais cette connaissance s'arrête à la portée de la fonction.

Vous pouvez également le faire avec forth, mais cela signifie un surcoût géant: vous pouvez placer vos paramètres sur la pile et appeler la fonction en plaçant l'adresse de retour au-dessus de la même pile. Pas de problème: Chaque commande sait que les opérandes sont en second et suivent sur la pile. Mais maintenant la commande veut appeler une autre commande avec ces valeurs: Cela rend nécessaire de changer l'ordre de la pile pour remettre les valeurs au-dessus, car la commande appelée ne peut pas savoir où elles sont enterrées dans la pile, comme vous a écrit.

Un compilateur forth plus complexe peut garder une trace du nombre de valeurs que chaque commande prend et trier la pile avant chaque appel de commande. Mais à quel prix!

Bien entendu, les programmes C ont également cette surcharge. Si vous voyez des appels de fonction non-inline dans l'assembly en ligne, il y a toujours un overhead de permutation de registre. Mais les bons programmes forth consistent en de minuscules fonctions, de sorte que vous avez beaucoup plus d'appels de fonctions et beaucoup plus de frais généraux. Et sans aucun avantage, comme dans l'architecture informatique moderne, chaque registre peut être utilisé comme pointeur de pile, de sorte que vous pouvez avoir une poignée de piles sans aucun problème. Donc, finalement, la réponse à votre question est: Oui, vous pouvez implémenter une dérivée d'une pile de forth, mais c'est une douleur sans gain.