CODINGCLASSEURS WEKA ★ Comment exploiter toutes les ressources et augmenter les performances de votre AMSTRAD CPC ★

4/5.2 - Le compilateur ForthCoding Classeurs Weka
4/5.2 Le compilateur Forth

Le langage Forth est d'un fonctionnement tout à fait paradoxal car il intègre à la fois un interpréteur, un compilateur et un assembleur. La version F83 dispose même de trois interpréteurs :

  • l'interpréteur externe (voir Partie 4, chap. 5.1) ;
  • l'interpréteur d'exécution pas à pas qui opère sur une définition et permet la mise au point des routines délicates ;
  • l'interpréteur d'adresse interne.

Les deux premiers sont écrits en Forth, le dernier est écrit en langage machine.

Le compilateur Forth travaille en une seule passe et sans gérer de table de référence. Ce compilateur est plus exactement un pseudo-compilateur dont la seule fonction est d'accroître les fonctions disponibles dans le dictionnaire

L'assembleur Forth travaille également en une seule passe et sans gérer de table de référence. Il peut traiter les branchements avant en utilisant des structures de contrôle évoluées à la place d'étiquettes. Une séquence peut être assemblée entre deux définitions compilées en Forth.

Au démarrage de Forth, tout part de l'interpréteur externe (celui qui vous dit OKI et dont le fonctionnement est très simple :

si un mot est tapé au clavier
et si ce mot existe
et si on est en interprétation
alors on l'exécute
sinon si on est en compilation
alors on le compile
sinon on essaie de le convertir en nombre 16 ou 32 bits
et si c'est un nombre
et si on est en interprétation
alors on empile ce nombre 16 ou 32 bits
sinon si on est en compilation
alors on compile ce nombre 16 ou 32 bits
sinon si ce n'est ni un mot ni un nombre,
alors on envoie un message d'erreur.

I. Compilation de votre première définition

A titre d'exemple, nous allons compiler une définition que l'on appellera AFFICHE-BINAIRE et dont le rôle sera d'afficher en binaire un nombre préalablement déposé au sommet de la pile de données :

: AFFICHE-BINAIRE
2 BASE ! . DECIMAL ;

Le mot : (deux-points) ouvre une séquence de compilation et est suivi du libellé du mot à définir. Le nom peut être composé de tous les caractères ASCII dont le code est compris entre 33 et 126 à l'exclusion de tout espace ou caractère de contrôle. La longueur d'un mot est comprise entre 1 et 32 caractères.

Le nom est suivi de la définition :

2 BASE ! passage en base numérique binaire
.    affichage du nombre précédemment empilé
DECIMAL restitution de la base numérique décimale

La fin de la séquence de compilation est marquée par le mot ; (point-virgule). Vous êtes à nouveau en mode interprétation.

Maintenant votre nouvelle définition fait partie du dictionnaire Forth, comme vous pouvez le voir en tapant WORDS. Pour essayer le fonctionnement du mot que vous venez de créer, il suffit de taper :

14 AFFICHE-BINAIRE affiche 1110
756 AFFICHE-BINAIRE affiche 1011110100

Si vous trouvez qu'AFFICHE-BINAIRE est trop long, réécrivez votre définition en l'appelant B. ou mieux, en définissant

B. comme suit :

: B. AFFICHE-BINAIRE ;

Tout mot compilé dans le dictionnaire Forth peut être intégré à une nouvelle définition.

II. Les constantes et les variables simple précision

Tout programme écrit en Forth, aussi sophistiqué soit-il, ne peut pas toujours traiter des données provenant de la pile de données. Dans certains cas on fera appel à des constantes et des variables. Les constantes sont définies à l'aide du mot CONSTANT:

1988 CONSTANT ANNEE

Les variables sont définies à J'aide du mot VARIABLE:

VARIABLE JOURS

La constante ANNEE et la variable JOURS figurent maintenant dans le dictionnaire Forth, c'est-à-dire qu'elles sont disponibles au même titre qu'un mot compilé par : (deux-points) ou n'importe quelle autre primitive déjà définie dans Forth. Seule l'exécution de ces mots diffère de celle d'un mot défini par : (deux-points).

Une constante dépose au sommet de la pile de données la valeur affectée au moment de sa définition :

ANNEE . affiche 1988

Une variable dépose au sommet de la pile de données l'adresse contenant la valeur qui lui a été aflectée ou qui devra y être affectée.

JOURS . affiche une adresse 16 bits

Le contenu de cette adresse est déposé sur la pile par l'exécution du mot @ :

JOURS @ . affiche 0

Une valeur numérique 16 bits peut être stockée dans une variable par l'exécution du mot ! :

15 JOURS! puis

JOURS @ . affiche 1 5

En fait, les mots @et ! agissent sur n'importe quelle adresse mémoire. Si vous tapez :

256 @ .

Forth affichera le contenu 16 bits des adresses 256 et 257 et dont voici le mécanisme d'exécution :

adresses: 256 257 n n = b * 256 + a

    ______   ______
MEMOIRE | a | b || b | a | PILE
     | |______|  |
     \____________/

L'inversion des valeurs a et b est valable pour les versions F83 tournant sur des systèmes équipés de microprocesseurs Z80, 8080 ou 8086. Sur les autres systèmes, le mécanisme diffère mais le résultat figurant au sommet de la pile de données sera identique.

Forth dispose d'un certain nombre de variables pré-définies et utilisées par le système. L'une d'elle, la variable BASE que nous avons déjà utilisée, peut être modifiée au gré de l'utilisateur. Voyons, avec un nouvel exemple, comment afficher un nombre dans une base numérique autre que la base numérique courante, ceci quelle que soit la base de départ et sans altération de celle-ci :

VARIABLE NOUVELLE-BASE 2 NOUVELLE-BASE !
: NB. ( n ---)
BASE @ NOUVELLE-BASE @ BASE !
SWAP ( on récupère la valeur n)
. BASE ! ;

Exemple d'utilisation :

DECIMAL 355 NB  affiche 101100011
HEX 2DF NB.  affiche 1011011111

Dans le second cas, on sélectionne la base hexadécimale, on empile un nombre hexadécimal et on exécute NB. On modifie la base numérique dans laquelle le nombre sera affiché en affectant une nouvelle valeur à la variable NOUVELLE-BASE.

Remarquez qu'un nombre n'a pas de syntaxe particulière désignant la base numérique à laquelle il appartient. C'est la base numérique que l'on sélectionne avant empilage du ou des nombres. Cette simplicité fait partie de la philosophie du langage Forth.

III. Les constantes et les variables double précision

Si l'intervalle de définition d'une constante ou d'une variable définie par CONSTANT ou VARIABLE est trop restreint pour une application particulière, on peut faire appel aux constantes et aux variables double précision.

Une constante double précision est définie par le mot 2CONSTANT:

1 50000. 2CONSTANT JACKPOT

Et une variable double précision est définie par 2VARIABLE:

2VARIABLE SCORE

Une valeur double précision est affectée à une variable double précision par le mot 2! :

120000. SCORE 2!

Et le contenu d'une variable double précision est empilé par le mot 2@ : SCORE 2@ D. affiche 120000

★ NOTE: 8e Complément

Je participe au site:

» Vous avez remarqué une erreur dans ce texte ?
» Aidez-nous à améliorer cette page : en nous contactant via le forum ou par email.

CPCrulez[Content Management System] v8.73-desktop
Page créée en 412 millisecondes et consultée 607 fois

L'Amstrad CPC est une machine 8 bits à base d'un Z80 à 4MHz. Le premier de la gamme fut le CPC 464 en 1984, équipé d'un lecteur de cassettes intégré il se plaçait en concurrent  du Commodore C64 beaucoup plus compliqué à utiliser et plus cher. Ce fut un réel succès et sorti cette même années le CPC 664 équipé d'un lecteur de disquettes trois pouces intégré. Sa vie fut de courte durée puisqu'en 1985 il fut remplacé par le CPC 6128 qui était plus compact, plus soigné et surtout qui avait 128Ko de RAM au lieu de 64Ko.