Vous êtes sur la page 1sur 26

Le langage Forth

Brique ROSE Samuel Tardieu sam@rfc1149.net


cole Nationale Suprieure des Tlcommunications

Samuel Tardieu (ENST)

Le langage Forth

1 / 45

Quest-ce que Forth ?

Langage sans syntaxe


Mots spars par des espaces Tous les autres caractres sont des identicateurs valides : drop , ( , s" Chaque nouveau mot devient partie intgrante du langage Le principe de Forth est dcrire des phrases dcrivant le problme : le langage devient spcique lapplication

Historique
Cr par Charles H. Moore en 1968 Noyau extrmement petit (typiquement quelques Ko) Pas de cycle diter/compiler/excuter/dbugger

Samuel Tardieu (ENST)

Le langage Forth

2 / 45

Test interactif

Les mots peuvent tre appels de manire interactive ds quils sont dnis Les mots : et ; commencent et terminent une dnition partir des mots saisir, tourner et lacher, on peut dnir le mot deplacer : : deplacer saisir tourner lacher ; Le mot deplacer est insr dans le dictionnaire. Lorsque lutilisateur tape ce mot, il est recherch dans le dictionnaire et soit appel (mode interprt) soit compil (lors de la dnition dun nouveau mot)

Samuel Tardieu (ENST)

Le langage Forth

4 / 45

Le systme Forth

Mlange un interprteur et un compilateur Chaque nouveau mot (quivalent dune fonction en Forth) est compil immdiatement et devient instantanment disponible Les mots sont spars par un blanc ou un retour la ligne Un dictionnaire contient ladresse du code de chaque mot Une pile de donnes sert passer les paramtres entre les mots

Samuel Tardieu (ENST)

Le langage Forth

5 / 45

Utilisation de la pile

En Forth, chaque mot manipule les objets au sommet de la pile (de donnes) contenant des entiers. Certaines oprations manipulent la pile.
4 4 4 8 12

12 4

12

dup

12

12

swap

drop

dup *

64

4 -

60

Samuel Tardieu (ENST)

Le langage Forth

7 / 45

Exemples

Dnition dun mot carre qui lve au carr : carre dup * ; Dnition dun mot cube qui lve au cube : cube dup carre * ; La phrase suivante ache 27 (le mot . ache (en le consommant) lentier au sommet de la pile) 3 cube . Note : seul le haut de la pile est important

Samuel Tardieu (ENST)

Le langage Forth

9 / 45

Modes

Forth dispose de deux modes. Le cur lit un mot, puis agit :


Interprtation : cest le mode par dfaut ; tout mot qui est tap est excut, tout nombre est plac sur la pile Compilation : chaque mot ajoute un appel ce mot dans la compilation courante, chaque nombre gnre le code ncessaire pour placer ce nombre sur la pile

Le mot immediate rend le dernier mot dni immdiat :


en mode compilation comme en mode interprtation, le mot est excut immdiatement ce mode sert implmenter de nouvelles constructions du langage

Samuel Tardieu (ENST)

Le langage Forth

10 / 45

Changement de mode

: toto dmarre la gnration du mot toto ; termine la compilation du mot courant : carre dup * ; gnre en mmoire, une adresse libre A, lquivalent de call dup call mult ret et rajoute une entre dans le dictionnaire pour carre pointant sur ladresse A.

Samuel Tardieu (ENST)

Le langage Forth

12 / 45

Avantages du modle

Parseur simplissime (blanc ou retour-chariot) Interprteur simplissime Compilateur simplissime (un systme Forth complet tient typiquement en quelques Ko) Le systme est rexif Code trs compact
La pile de donnes permet de ne pas grer le passage de paramtres Un mot machine par mot appel

Pas dallocation de registres (voir cours de compilation)

Samuel Tardieu (ENST)

Le langage Forth

13 / 45

Commentaires

\ demande au parseur de vider le buer dentre drop dup \ Commentaire ( cherche le caractre ) dans le ux dentre et positionne le parseur aprs drop ( supprime ) dup ( duplique ) On indique souvent leet sur la pile de chaque mot dans des commentaires : calcule ( n -- x ) ... ;

Samuel Tardieu (ENST)

Le langage Forth

15 / 45

Structure de test

if . . .then
if teste le sommet de la pile (et le consomme), et saute aprs le then sil vaut zro Exemple : test if agir then Le sens de then est celui de puis ensuite ( loppos dautres langages ou il signie alors )

if . . .else . . .then
Si le test est ngatif, if saute aprs le else Exemple : test if agir else dormir then

Samuel Tardieu (ENST)

Le langage Forth

17 / 45

Boucles

do . . .loop
Les bornes (suprieure non inclues puis infrieure) sont places sur la pile i permet de rcuprer lindice de boucle le plus interne Exemple : 10 0 do quelquechose loop

do . . .+loop permet de prciser lincrment avant +loop ?do . . .loop permet de ne pas excuter une boucle si les deux bornes sont gales

Samuel Tardieu (ENST)

Le langage Forth

19 / 45

Boucles (2)

begin . . .again
Boucle innie Sortie possible par exit (sort du mot courant)

begin . . .while . . .repeat


Boucle conditionnelle Exemple : begin test while quelquechose repeat Exemple : 7 n va excuter xyz 7 fois : n begin dup while xyz 1- repeat drop ;

begin . . .until attend quune condition soit vraie

Samuel Tardieu (ENST)

Le langage Forth

21 / 45

Exemple : PGCD
Algorithme dEuclide pour calculer le PGCD (tuck duplique le sommet de la pile aprs le deuxime lement, par exemple 1 2 3 tuck donne 1 3 2 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 ) ;

Samuel Tardieu (ENST)

Le langage Forth

23 / 45

En vrai
Un programmeur Forth lcrirait plutt 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 ;
Samuel Tardieu (ENST) Le langage Forth 25 / 45

Manipulation

Le nombre doctets dun entier est appele la taille de cellule (par exemple 4 sur un systme 32 bits) Les mots @ et c@ lisent respectivement une cellule ou un mot ladresse se trouvant sur le sommet de la pile Les mots ! et c! crivent respectivement une cellule ou un mot ladresse 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)

Samuel Tardieu (ENST)

Le langage Forth

27 / 45

Test de priphriques

Les entres/sorties sont gnralement des adresses mmoire Supposons quun ensemble de 8 LEDs soient ladresse 0x1234 et quon souhaite les tester. On peut faire :
hex ff 1234 c! 0 1234 c! aa 1234 c! 55 1234 c! 1234 c@ invert 1234 c! \ \ \ \ \ \ 16 base ! Allume les 8 leds ^^c9teint les 8 leds Une sur deux Allume les autres Inverse les leds

Samuel Tardieu (ENST)

Le langage Forth

29 / 45

Allons plus loin

hex : led@ ( -- n ) 1234 c@ ; : led! ( n -- ) 1234 c! ; : masque ( n -- 1<<n ) 1 swap lshift ; : allume ( n -- ) masque led@ or led! ; : eteint ( n -- ) masque invert led@ and led! ; : inverse ( n -- ) masque led@ xor led! ; 0 allume 3 eteint 7 inverse \ Allume la led 0 \ Eteint la led 4 \ Inverse la led 7

Samuel Tardieu (ENST)

Le langage Forth

31 / 45

Les blocs

Sur certains systmes sans chiers, des blocs sont utiliss Un bloc fait 1024 octets (16 lignes de 64 caractres) Les blocs encourage la factorisation Les blocs sont rarement utiliss lorsquun systme dexploitation est prsent

Samuel Tardieu (ENST)

Le langage Forth

32 / 45

Les chanes de caractres

Elles sont reprsentes par deux cellules : adresse et longeur Le mot type permet dacher une chane. cr passe la ligne suivante. s" cr une chane allant jusquau " suivant. ." ache la chane allant jusquau " suivant. Exemple :
: hello ." Hello world!" cr ;

ou
: msg s" Hello world!" ; : hello msg type cr ;

Samuel Tardieu (ENST)

Le langage Forth

34 / 45

Exemple : Manipulation de chanes


Que font les mots suivants ?
: lower? ( c -- f ) 97 123 within ; ( a b c within teste si b <= a < c ) ( 97 est lASCII de a, 122 de z, 65 de A ) : : : ( upper ( c -- c ) dup lower? if 32 - then ; upper! ( a -- ) dup c@ upper swap c! ; to-upper ( a n -- ) bounds ?do i upper! loop ; bounds remplace a b par a a+b )

: test s" hElLo WorLd!" 2dup to-upper type cr ; ( 2dup recopie les deux elements au sommet )

Samuel Tardieu (ENST)

Le langage Forth

36 / 45

Les dirents Forth

Forth est un standard international depuis 1994 Linventeur de Forth (Chuck Moore) sen plaint. Selon lui
cela alourdit le langage cela freine linnovation

Beaucoup de Forth ne sont pas conformes au standard (exemple : PicForth) Forth a maintenant de la couleur : ColorForth
Une couleur dnit le rle du mot : dnition, utilisation immdiate, compilation, la base dun nombre (dcimal ou hexadcimal) Plus de : et de immediate

Samuel Tardieu (ENST)

Le langage Forth

38 / 45

Structures simplies

Sur les Forth de Chuck Moore, une partie des structures de contrle nexistent plus else est supprim : il sut de factoriser
: mot test if action1 else action2 then action3 ;

devient
: sous-mot test if action1 exit then action2 ; : mot sous-mot action3 ;

Samuel Tardieu (ENST)

Le langage Forth

40 / 45

Structures simplies (2)

begin...again nexiste plus :


: mot xyz begin action again ;

devient
: actions action recurse ; : mot xyz actions ;

begin...until non plus :


: mot begin action condition? until ;

devient
: mot action condition? if exit then recurse ;

Samuel Tardieu (ENST)

Le langage Forth

42 / 45

Exemple en ColorForth

Bras articul : commande de pince en 0xABCD, commande de moteur en 0x8A00, capteur de position en 0x83FA serrer-pince 1 ABCD ! ; ouvrir-pince 0 ABCD ! ; droite 1 8A00 ! 0 8A00 ! ; position 83FA @ ; positionner dup position = if drop exit then droite positionner ; saisir 1 positionner serrer-pince ; tourner 5 positionner ; lacher ouvrir-pince ; deplacer saisir tourner lacher ;

Samuel Tardieu (ENST)

Le langage Forth

43 / 45

En Forth classique
hex : serrer-pince 1 abcd ! ; : ouvrir-pince 0 abcd ! ; : droite 1 8a00 ! 0 8a00 ! ; : position 83fa @ ; : positionner begin dup position <> while droite repeat drop ; : saisir 1 positionner serrer-pince ; : tourner 5 positionner ; : lacher ouvrir-pince ; : deplacer saisir tourner lacher ;
Samuel Tardieu (ENST) Le langage Forth 45 / 45

Vous aimerez peut-être aussi