Cours langage Forth Brique ROSE

Modes

Forth dispose de deux modes. Le c÷ur lit un mot, puis agit :
InterprØtation : c’est le mode par dØfaut ; tout mot qui est tapØ est exØcutØ, tout nombre est placØ sur la pile Compilation : chaque mot ajoute un appel à ce mot dans la compilation courante, chaque nombre gØnŁre le code nØcessaire pour placer ce nombre sur la pile Le mot immediate rend le dernier mot dØ ni immØdiat :
en mode compilation comme en mode interprØtation, le mot est exØcutØ immØdiatement
ce mode sert à implØmenter de nouvelles constructions du langage

Changement de mode

: toto dØmarre la gØnØration du mot toto ; termine la compilation du mot courant
: carre dup * ; gØnŁre en mØmoire, à une adresse libre A, l’Øquivalent de
call dup
call mult
ret et rajoute une entrØe dans le dictionnaire pour carre pointant sur l’adresse A.

Avantages du modŁle

Parseur simplissime (blanc ou retour-chariot)
InterprØteur simplissime
Compilateur simplissime (un systŁme Forth complet tient typiquement en quelques Ko)
Le systŁme est rØ exif
Code trŁs compact
La pile de donnØes permet de ne pas gØrer le passage de paramŁtres Un mot machine par mot appelØ
Pas d’allocation de registres (voir cours de compilation)

Commentaires

\ demande au parseur de vider le bu er d’entrØe drop dup \ Commentaire
( cherche le caractŁre ) dans le ux d’entrØe et positionne le parseur aprŁs
drop ( supprime ) dup ( duplique )
On indique souvent l’e et sur la pile de chaque mot dans des commentaires
: calcule ( n — x ) … ;

Structure de test

if . . .then
if teste le sommet de la pile (et le consomme), et saute aprŁs le then s’il vaut zØro
Exemple : test if agir then
Le sens de then est celui de puis ensuite (à l’opposØ d’autres langages ou il signi e alors )
if . . .else . . .then
Si le test est nØgatif, if saute aprŁs le else Exemple : test if agir else dormir then

Boucles

do . . .loop
Les bornes (supØrieure non inclues puis infØrieure) sont placØes sur la pile
i permet de rØcupØrer l’indice de boucle le plus interne Exemple : 10 0 do quelquechose loop
do . . .+loop permet de prØciser l’incrØment avant +loop
?do . . .loop permet de ne pas exØcuter une boucle si les deux bornes sont Øgales
begin . . .again
Boucle in nie
Sortie possible par exit (sort du mot courant)
begin . . .while . . .repeat
Boucle conditionnelle
Exemple : begin test while quelquechose repeat
Exemple : 7 n va exØcuter xyz 7 fois
: n begin dup while xyz 1- repeat drop ; begin . . .until attend qu’une condition soit vraie
Exemple : PGCD
Algorithme d’Euclide pour calculer le PGCD (tuck duplique le sommet de la pile aprŁs le deuxiŁme Ølement, par exemple 1 2 3 tuck donne
1 32 3):
: pgcd (a b — n ) (avec a >= b)
begin ( a b )
dup ( a b b )
while ( a b )
tuck ( b a b )
mod ( b (a mod b) ) -> ( a b )
repeat ( a b )
drop ( a )
;
En vrai
Un programmeur Forth l’Øcrirait plutôt comme :
: pgcd ( a b — n )
begin dup while tuck mod repeat drop ;
ou le factoriserait comme
: step ( a b — b a%b ) tuck mod ;
: pgcd ( a b — n )
begin dup while step repeat drop ;
ou, sans le mot mod, ferait
: order ( a b — a’ >= b’ ) 2dup < if swap then ;
: step ( a b — b a-b ) tuck – ;
: pgcd ( a b — n )
begin order dup while step repeat drop ;

Manipulation

Le nombre d’octets d’un entier est appelØe la taille de cellule (par exemple 4 sur un systŁme 32 bits)
Les mots @ et c@ lisent respectivement une cellule ou un mot à l’adresse se trouvant sur le sommet de la pile
Les mots ! et c! Øcrivent respectivement une cellule ou un mot à l’adresse se trouvant sur le sommet de la pile
Les mots lshift, rshift, and, or, xor et invert permettent de manipuler les bits 5 2 lshift
La variable base contient la base courante (de 2 à 36)

Cours gratuitTélécharger le cours complet

Télécharger aussi :

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *