Les premiers pas
Chaque langage informatique possède son propre terme pour décrire ce qu'il faut saisir pour exécuter une action. En langage assembleur, on parle d'«instruction». En BASIC on parle de commande, et Pascal, on parle d'«instruction». En FORTH, on parle de «mot».
Tout est une question de mots
Un mot est une séquence d'un ou plusieurs caractères qui identifie une procédure d'exécution. Autrement dit, il s'agit d'une étiquette indiquant ce qui doit se produire lors de son exécution. Chaque système FORTH possède un ensemble de mots intégré. Chacun de ces mots entraîne une action spécifique.
Par exemple, le mot FORTH + provoque l'addition de deux nombres en mémoire, puis le retour de la somme en mémoire. Un autre mot, TYPE, provoque l'affichage d'une chaîne de caractères en mémoire.
Si vous souhaitez réaliser une tâche plus complexe qu'un seul mot, vous pouvez écrire plusieurs mots consécutivement pour former un programme. C'est tout ce que la programmation FORTH propose : combiner les mots à votre disposition de manière à obtenir l'effet souhaité.
La somme de tous les mots d'un système FORTH est contenue dans ce qu'on appelle, à juste titre, son dictionnaire. Lorsque vous achetez un système FORTH, le dictionnaire ne contient que les mots fournis par le fabricant. Si le logiciel que vous avez acheté est conforme à la norme FORTH-79, il contiendra l'ensemble de mots requis FORTH-79. Sinon, il contiendra un ensemble de mots fig-FORTH, polyFORTH ou d'un autre dialecte FORTH.
Dans tous les cas, le dictionnaire ne se limite pas aux mots intégrés au système que vous avez acheté. Par nature, l'ensemble de mots requis FORTH fonctionne sur les nombres, des valeurs pouvant être contenues dans 16 bits de la mémoire d'un ordinateur. Comme 16 bits peuvent représenter des valeurs ne dépassant pas 65 535, l'équipe de normalisation FORTH a défini un ensemble de mots pouvant fonctionner sur les nombres doubles, des valeurs occupant 32 bits en mémoire. Ces mots, constituant l'ensemble de mots doubles, sont répertoriés dans le tableau suivants :
| Catégorie | Description |
|---|---|
| Mots clefs | | * */ */MOD + +! +loop- / /MOD 0< 0= 0> 1+ 1- 2+ 2- < = > >R
?DUP @ ABS AND begin C! C @ colon CMOVE constant create D+ D< DEPTH DNEGATE do does> DROP DUP else EXECUTE EXIT FILL I si J
LEAVE literal loop MAX MIN MOD MOVE NEGATE NOT OR OVER PICK
R> R@ repeat ROLL ROT semicolon SWAP then U* U/ U< until variable while XOR Remarque : les entrées en minuscules font uniquement référence au code d'exécution correspondant à un mot de compilation. |
| Mots d'interprétation | # #> #S ' ( -TRAILING . 79-STANDARD <# >IN ? ABORT BASE BLK CONTEXT COUNT CR CURRENT DECIMAL EMIT EXPECT FIND FORTH HERE HOLD KEY PAD QUERY QUIT SIGN SPACE SPACES TYPE U. WORD |
| Mots du compilateur | + LOOP , ." : ; ALLOT BEGIN COMPILE CONSTANT CREATE DEFINITIONS DO DOES ELSE FORGET IF IMMEDIATE LITERAL LOOP REPEAT STATE THEN UNTIL VARIABLE VOCABULARY WHILE [ [COMPILE] ] |
| Mots relatifs aux périphériques | BLOCK BUFFER EMPTY-BUFFERS LIST LOAD SAVE-BUFFERS SCR UPDATE |
L'ensemble de mots assembleur permet d'intégrer des programmes en langage assembleur à un programme FORTH, afin d'effectuer des tâches impossibles à réaliser efficacement en FORTH. Comme le montre le tableau suivant, l'ensemble de mots assembleur ne comprend que quatre mots : trois décrivent le code assembleur et un appelle l'assembleur. Bien entendu, les instructions en langage assembleur varient d'un système à l'autre (selon le microprocesseur utilisé), tout comme les détails de l'assembleur ; ces quatre mots suffisent donc à la norme.
| Catégorie | Description |
|---|---|
| Ensemble de mots à double nombre | 2! 2@ 2CONSTANT 2DROP 2DUP 20VER 2ROT 2SWAP 2VARIABLE D+ D- D. D.R D0= D< D= DABS DMAX DMIN DNEGATE DU< |
| Ensemble de mots assembleur | ;CODE ASSEMBLER CODE END-CODE |
L'ensemble de mots de référence
L'équipe de normalisation FORTH a inclus dans la norme FORTH-79 un groupe de mots à utiliser strictement à titre de référence. Certains mots de cet ensemble de mots de référence sont apparus dans des versions antérieures de la norme et ont des définitions de mots normalisées approuvées. D'autres ont des définitions «non contrôlées» ; ils sont largement utilisés par les éditeurs de logiciels et/ou sont candidats à une normalisation future. Les deux types de mots de référence sont répertoriés dans les deux tableaux précédent et le tableau suivant.
Afin d'éviter toute confusion, les mots d'extension et de référence seront identifiés ainsi.
Voici l'ensemble de mots de référence :
| Catégorie | Description |
|---|---|
| Définitions de mots standard | --> AGAIN BL BLANKS DUMP EDITOR END ERASE HEX OFFSET SP@ U.R |
| Définitions de mots non contrôlés | IBITS ** +BLOCK - MATCH -TEXT .R/LOOP 1 +! 1 -! 2* 2/ ;: ;S <> <BUILDS <CMOVE >MOVE< @BITS ABORT" AGAIN ASCII ASHIFT B/BUF BELL C, CHAIN COM CONTINUED CUR DBLOCK DPL FLD FLUSH H. I' IFEND IFTRUE INDEX INTERPRET K LAST LINE LINELOAD LOADS MAPO MASK MS NAND NOR NUMBER O. OCTAL OTHERWISE PAGE READ-MAP REMEMBER REWIND ROTATE SO SET SHIFT TEXT THRU USER VLIST WHERE \ LOOP |
Ce que vous obtenez dans la VLIST
Pour consulter la liste de tous les mots disponibles dans votre système FORTH, saisissez simplement le mot et appuyez sur la touche Enter de votre clavier. FORTH listera alors les mots de son dictionnaire, un par un, jusqu'à ce que le dictionnaire soit épuisé ou que vous appuyiez sur ESC, Break ou Reset (liste exhaustive).
Si vous avez ajouté vos propres mots au dictionnaire, ils seront également inclus dans la VLIST. La liste commencera par le mot le plus récemment défini, le cas échéant, et descendra à partir de là.
PILES
Pour programmer en FORTH, il est essentiel de savoir ce qu'est une pile. Pourquoi ? Parce que pratiquement toutes les opérations FORTH impliquent une pile d'une manière ou d'une autre. Par exemple, avant d'additionner deux nombres, les deux doivent être sur la pile, et le résultat est renvoyé sur la pile. Il en va de même pour la soustraction, la multiplication, la division, l'impression de nombres, et à peu près tout le reste. En FORTH, c'est la pile qui est au coeur de l'action !
Une pile n'est pas une simple composante matériel, mais simplement une zone de la mémoire de l'ordinateur où les nombres sont temporairement entreposés. Dans cette zone mémoire, les nombres sont empilés les uns sur les autres, comme des assiettes dans une cuisine. Autrement dit, le premier nombre se place en bas de la pile, et chaque nouveau nombre est déposé directement au-dessus (ou au-dessus) du précédent. Et comme pour une pile d'assiettes, le dernier nombre placé sur la pile sera le premier à en être retiré.
Ce type de pile est généralement qualifié de pile «dernier entré, premier sorti» (ou LIFO). Le dernier nombre entré est toujours le premier nombre sorti.
La figure suivante illustre l'impact d'une simple opération de soustraction (3-2) sur la pile. En haut à gauche dans le figure, trois nombres sont sur la pile, mais leur nature importe peu. Dans les haut à droite de la figure et dans le bas à gauche de la figure, les deux opérandes sont «poussés» sur la pile. Dans la bas à droite de la figure, après l'opération de soustraction, les opérandes ont disparu et seul le résultat reste sur la pile. Notez que la pile se «construit» vers la mémoire basse ; chaque nombre est poussé sur la pile à une adresse inférieure à celle du nombre précédent :
Placer des nombres sur la pile
Comment placer des nombres sur la pile en FORTH ? Faut-il une commande un peu particulière comme «PUT 3 ONSTACK» ? Non, rien de plus compliqué. FORTH étant un langage orienté pile, presque toutes les opérations impliquent de «faire ceci sur la pile». Par conséquent, pour placer un nombre sur la pile, il suffit de le saisir et d'appuyer sur la touche Enter (ou, sur certains ordinateurs, sur la touche Enter).
Par exemple, si vous saisissez les chiffres :
123et appuyez sur Enter; la valeur décimale 123 sera placée en haut de la pile. Si plusieurs nombres doivent être placés sur la pile, saisissez-les simplement sur une seule ligne (séparés par au moins un espace) et appuyez sur Enter une fois le nombre final saisi. Par exemple, si vous saisissez :
123 456 789et appuyez sur Enter, trois valeurs décimales seront poussées sur la pile : 123, suivi de 456, suivi de 789. La valeur 789 sera en haut de la pile, car elle a été spécifiée en dernier.
Affichage des valeurs de la pile
Comment connaître les valeurs de la pile à un instant donné ? FORTH fournit un mot affichant le nombre le plus élevé de la pile, en l'écrivant sur le périphérique de sortie actif de votre système (écran et/ou imprimante). Ce mot est tout simplement un « point » [.], c'est-à-dire un « point » sur votre clavier.
Pour reprendre un exemple précédent, si vous saisissez les chiffres :
123et appuyez sur Enter, la valeur décimale 123 sera placée en haut de la pile. Si vous saisissez plutôt :
123 .et appuyez sur Enter; la valeur 123 sera placée sur la pile, puis immédiatement retirée et affichée. L'affichage sera au format suivant :
123 OKIl est important de garder à l'esprit que tout ce qui est affiché avec un «point» n'est plus sur la pile. Il existe des moyens d'afficher les valeurs de la pile de manière non destructive.
Le point peut également être utilisé pour afficher plusieurs valeurs sur la pile, en répétant le mot «point». Par exemple, si vous saisissez :
123 456 789 . .et appuyez sur Enter, vous recevrez cet écran :
789 456 OKQuelle est la valeur la plus haute de la pile après cette séquence ? Il s'agit du nombre 123, car les nombres 456 et 789 ont été retirés de la pile par les deux opérations d'affichage.
À ce stade, la pile ne contient plus qu'un seul nombre, 123. Vous pouvez saisir un point supplémentaire pour afficher ce nombre, mais que se passe-t-il si vous saisissez deux points ? Si vous saisissez deux points :
..et appuyez sur Enter, vous aurez tenté d'afficher une valeur inexistante, donc FORTH affichera un message d'erreur tel que :
| ? STACK EMPTY |
NOTATION POLONAISE INVERSE
Dans la plupart des langages informatiques, comme le BASIC, l'opération de soustraction précédente s'écrit sous la forme suivante :
3-2Tout comme on l'écrit avec un crayon et du papier. Cependant, comme FORTH opère toujours sur des nombres déjà présents sur la pile, il est plus efficace de placer l'opérateur après les opérandes plutôt qu'entre eux. Par conséquent, notre opération de soustraction se présenterait comme suit :
3 2 -dans un programme FORTH !
Notez que nous avons en fait montré trois opérations distinctes ici :
- Le nombre « 3 » place la valeur 3 sur la pile.
- Le nombre « 2 » place la valeur 2 sur la pile, au-dessus de la valeur 3.
- Le mot [-] soustrait l'élément le plus haut de la pile (la valeur 2, dans ce cas) du deuxième élément (la valeur 3), et ne laisse que le résultat (la valeur 1) sur la pile.
Cette notation particulière, avec opérateur en dernier, est appelée notation polonaise inversée (RPN). Elle est couramment utilisée sur les machines orientées pile. La gamme de calculatrices programmables Hewlett-Packard, par exemple, est orientée pile et nécessite la saisie des opérations en notation polonaise inversée.
Bien que la notation RPN puisse paraître un peu étrange après une vie passée à utiliser la notation standard opérande-opérateur-opérande, vous devriez commencer à vous y familiariser après avoir exécuté quelques programmes FORTH. Il vous suffit de vous rappeler qu'un élément doit être présent sur la pile avant d'appliquer un opérateur et que les opérandes doivent être dans l'ordre prévu. Autrement dit, le nombre supérieur est le nombre auquel FORTH additionne, soustrait, divise ou multiplie par le deuxième nombre.
DÉCRIRE LES MOTS FORTH
Pour vous aider à comprendre les relations entre les mots, les mots ayant des fonctions similaires seront décrits ensemble, par groupes. Ainsi, ceux effectuant des opérations arithmétiques (comme additionner, soustraire, multiplier et diviser) seront décrits dans un groupe, ceux qui effectuent des opérations de mémoire (comme entreposer, extraire et déplacer un bloc) dans un autre groupe, et ainsi de suite.
Chaque description de groupe fonctionnel sera accompagnée d'un tableau récapitulant les mots de ce groupe. Ce tableau détaillera la syntaxe du mot, son effet sur la pile et son action. De plus, pour les mots non obligatoires, le tableau comprendra une note indiquant si le mot est défini dans un ensemble de mots d'extension, ou s'il s'agit d'un mot standard ou non contrôlé défini dans l'ensemble de mots de référence.
Par exemple, l'entrée du tableau pour le mot non contrôlé 2* se présentera comme suit :
| MOT | PILE | ACTION | NOTES |
|---|---|---|---|
| 2* | * n---2*n | Multiplie le nombre par 2. | (1) |
La colonne MOT indique la syntaxe du mot, la colonne PILE indique qu'un nombre n en haut de la pile sera remplacé par la valeur 2*n après l'exécution du mot (les trois tirets «-» sont la séparation habituelle des valeurs «avant» et «après» dans la littérature FORTH), la colonne ACTION indique la fonction du mot, en langage clair, et la colonne NOTES renvoie à une note en fin de tableau. Dans ce cas, la note appropriée pour le mot 2* sera :
- (1) Inclus dans l'ensemble de mots de référence comme définition de mot non contrôlée.