Question

Je souhaiterais mettre en place un système Forth pour acquérir de l'expérience dans la construction d'une machine virtuelle simple et d'un environnement d'exécution.

Lors du démarrage dans Forth, on en apprend généralement d’abord sur la pile et ses opérateurs (DROP, DUP, SWAP, etc.). Il est donc naturel de penser à ceux-ci parmi les opérateurs primitifs. Mais ils ne sont pas. Chacun d'entre eux peut être décomposé en opérateurs manipulant directement la mémoire et les pointeurs de pile. Plus tard, on en apprend plus sur store (!) Et fetch (@), qui peuvent être utilisés pour mettre en œuvre DUP, SWAP, etc. (ha!).

Alors, quels sont les opérateurs primitifs? Lesquels doivent être implémentés directement dans l'environnement d'exécution à partir duquel tous les autres peuvent être construits? La haute performance ne m'intéresse pas; Je veux quelque chose dont je (et d'autres) peux apprendre. L’optimisation des opérateurs peut venir plus tard.

(Oui, je sais que je peux commencer avec une machine de Turing et partir de là. C'est un peu extrême.)

Modifier: Ce que je vise ressemble à l’amorçage d’un système d’exploitation ou d’un nouveau compilateur. Qu'est-ce que j'ai besoin de mettre en œuvre, au minimum, pour pouvoir construire le reste du système à partir de ces blocs de construction primitifs? Je ne vais pas implémenter ceci sur du matériel nu; comme exercice éducatif, j’écrirais ma propre machine virtuelle minimale.

Était-ce utile?

La solution

Ce fil couvre votre question exacte. Voici une implémentation soupe-à-noix avec une documentation complète.

J'ai écrit un sous-programme lié à Forth ciblant 68K lorsque j'étais à l'université. J'ai défini l'environnement d'exécution et le format du dictionnaire, puis j'ai écrit du code C qui démarrait une application Macintosh chargée d'un dictionnaire par défaut, rempli des vecteurs d'E / S et obtenu l'exécution du code. Ensuite, j'ai pris le livre de Leo Brodie, Starting Forth , et j'ai commencé à implémenter le dictionnaire de base en 68K langage d'assemblage. J'ai commencé avec les mots arithmétiques / logiques, puis j'ai contrôlé les structures puis les mots de définition / manipulation. Si j'ai bien compris, vous avez besoin au minimum de @,!, +, -, * et /. Le reste peut être implémenté en termes de ceux-ci, mais c'est comme essayer d'écrire une bibliothèque graphique complète basée sur SetPixel et GetPixel: cela fonctionnera, mais bon, pourquoi?

J'ai apprécié le processus car il existait des énigmes vraiment intéressantes, comme par exemple DOES> parfaitement (et une fois que j'ai eu une mise en œuvre <=> solide, j'ai créé des fermetures qui se sont transformées en minuscules quantités de code).

Autres conseils

Il y a longtemps, j'ai publié un livre intitulé & "Langages d'interprétation filetés &"; publié par Byte, qui expliquait comment implémenter un langage de type Forth (je ne pense pas qu'ils jamais appelé cela) dans l’assemblage du Z80.

Vous n’avez peut-être pas un Z80 à portée de main, ou vous en voulez un, mais le livre pourrait être instructif.

Ce billet de comp.lang.forth répertorie quelques & "minimes Forths &";.

.

http://groups.google.com/group/comp .lang.forth / msg / 10872cb68edcb526

Pourquoi je le sais? Mon frère, Mikael, a écrit le n ° 3 et un article sur la création d'un & "minime Forth &"; (en suédois, cependant). Si je me souviens bien, il souhaitait obtenir un ensemble minimal d'opérateurs pouvant être construits en silicium.

Je ne suis toujours pas convaincu que la question est bien formée. Par exemple, les instructions de Plinth peuvent être réduites. après tout, * et / peuvent être implémentés en termes de + et de -, mais ensuite '+' peut être implémenté en termes de fonction successeur (voir le Axiomes Peano .) Ce qui vous place au voisinage d’une machine de Turing. Comment savez-vous où vous arrêter?

Vous pouvez également consulter le compilateur 4tH de Hans Bezemer <. / p>

Quelle implémentation Forth utilisez-vous qui ne fournit pas ces informations dans la documentation? Étant donné la nature de Forth, il est possible que cela dépende de la mise en œuvre. Le dictionnaire contient un ensemble standard de mots, mais peu importe qu’ils y soient arrivés par assembleur / C / peu importe ou par Forth n’a aucune importance, car Forth est par définition un langage auto-extensible.

Contrairement à ce que vous dites, DROP SWAP, etc. sont généralement considérés comme des opérations de base pour Forth. La raison en est que si vous les implémentez en utilisant des opérations de mémoire comme vous le suggérez, le système global devient plus compliqué. De plus, il n'y a pas de distinction claire dans Forth entre ce qui est fondamental et ce qui ne l'est pas. Dans les années 80, une recherche dans le dictionnaire serait basique et codée en assembleur pour plus de rapidité, alors qu'un linux hébergé moderne peut se permettre de coder cela en haut niveau. De plus, les Forthers ont tendance à recoder systématiquement les mots assembleur en haut et les mots haut niveau dans assembleur. Je suis l'auteur de Ciforth et yourforth. Il est possible de définir & Lt; = comme & Quot; & Gt; pas " comme je l'ai fait dans ciforth. Mais dans votre temps, j'ai décidé d'avoir & Lt; < = > > = de manière similaire, de petites routines d’assemblage uniformes était en réalité plus simple. C'est un jugement, et une question de goût, certainement pas une question de principe.

Dans le contexte, j'interprète la question comme suit: & "Quelle est la taille raisonnable pour que le nombre d'opérations primitives aboutisse à un Forth puissant et raisonnable avec une vitesse raisonnable? &"; Il est évident que vous n'êtes pas intéressé par des astuces astucieuses pour vous débarrasser d'un seul mot assembleur au détriment d'une surcharge considérable, comme le montrent certains des sujets abordés à ce sujet.

Maintenant, vous pouvez regarder un certain nombre de petits Forth comme jonesforth yourforth eforth et conclure que la plupart du temps, on en arrive à environ 50 à 100 primitifs. Celles-ci sont définies dans l'assembleur. Si vous souhaitez définir vos primitives en c, python ou Java, la situation est à nouveau différente. Maintenant pour par exemple Dans la recherche par dictionnaire ci-dessus, vous avez le choix entre c et Forth. Des considérations qui n'ont rien à voir avec la conception de la langue entrent en jeu. Vous pouvez être un c-programmeur prolifique ou insister pour le coder dans Forth car il s’agit d’un projet d’apprentissage.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top