AIDE ET MISE AU POINT

Tout langage de développement doit offrir des outils d'aide et de mise au point. De l'efficacité de ces outils dépendent les performances des programmes, la rapidité de développement et la sécurité de fonctionnement. TURBO-Forth est à cet égard très performant, car il dispose d'un décompilateur extensible en désassembleur, débogueur-traceur exécutant les définitions pas à pas avec visualisation de la pile, une aide en ligne contextuelle et divers outils d'assistance utilisables en interprétation ou en compilation.

A. Le moniteur de pile et de base numérique.

FORTH permet bien des hardiesses, mais peut aussi faire parfois perdre pied dans des situations délicates. Dans le cas d'une compilation qui échoue, le changement de base numérique, autorisé en compilation comme en interprétation, peut se retourner contre le programmeur:

: TEST ( ---) [ HEX ] ASCII A DDUP [ DECIMAL ] ; \ DDUP n'existe pas

A la compilation, l'échec essuyé au moment de la tentative de traitement du mot DDUP laissera le système en base numérique hexadécimale. Si ensuite on tente des accès mémoire en invoquant des adresses en base numérique décimale, on subira de petits désagréments.

Pour ne pas se perdre, l'indicateur de disponibilité de l'interpréteur FORTH, marqué par 'OK', peut être complété par des indications complémentaires en positionnant le flag booléen STATUS? à ON. exemple:

STATUS? ON

A partir de cet instant, l'indicateur de disponibilité de l'interpréteur FORTH indique le nombre de paramètres actuellement disponibles sur la pile de données et la base numérique courante:

0 (dec) OK

Si on empile une valeur 16 bits, l'indicateur affiche:

35
1 (dec) OK

Le nombre 1 indique qu'il y a maintenant une valeur au sommet de la pile de données. Le passage dans une autre base numérique est possible:

HEX
1 (hex) OK

Le nombre de paramètres disponibles au sommet de la pile de données n'a pas varié. Le mot (hex) indique que FORTH traite maintenant les nombres dans la base numérique hexadécimale:

3A
2 (hex) OK

L'indicateur situé entre parenthèse indique trois états prédéfinis en fonction de la base numérique sélectionnée:

(dec) pour la base numérique décimale
(hex) pour la base numérique hexadécimale
(oct) pour la base numérique octale

Pour toute autre base numérique, l'indicateur sera affiché sous forme numérique, précédé du signe #, le tout placé entre parenthèses:

2 BASE !
2 (#02) OK

Le nombre de paramètres disponibles au sommet de la pile de données est toujours deux, la base numérique courante étant maintenant la base binaire. Le nombre de paramètres et la base sont toujours indiqués en décimal quelle que soit la base numérique sélectionnée.

L'indicateur de disponibilité de l'interpréteur complété des indicateurs de nombre de paramètres et de base numérique courante seront d'un grand secours pour les programmeurs débutants. Pour exemple, quelle action produit la séquence suivante:

En décomposant chaque action, il est plus aisé de comprendre chaque phase:

B. Surveillance de la compilation.

Dans certains cas, il est intéressant de savoir ce qui se passe lorsque le compilateur traite un fichier source:

- si le programme est particulièrement long
- si la mise au point est délicate, en cas de plantage pour repérer la zone incriminée.

Pour celà, TURBO-Forth dispose d'une directive de compilation:

ECHO ON active le mode traçage de la compilation
ECHO OFF désactive le mode traçage de la compilation

La variable ECHO est testée à chaque ligne chargée et lue par l'interpréteur/compilateur. Si ECHO est ON, l'interpréteur/compilateur affiche la ligne en cours de traitement. Si ECHO est OFF, la ligne est interprétée ou compilée sans affichage à l'écran. La directive ECHO ON ECHO OFF peut être utilisée en début de programme, mais également à n'importe quel autre endroit dans le programme source.

Un autre mot, EOF, placé dans le fichier source, provoque l'arrêt définitif de la compilation du contenu du fichier. Tout texte placé après EOF ne sera pas interprété ou compilé. En cas d'appels de fichiers imbriqués (INCLUDE en cascade), EOF renvoie le compilateur vers le programme appelant.

Un fichier peut contenir plusieurs directives EOF. Dans ce cas, seul la première directive EOF sera prise en compte.

Le mot EOF s'avère utile dans les cas suivants:

- intégrer des séquences de commandes à interpréter, placées en fin de fichier, destinées à tester les définitions qui les précèdent. L'action de ces lignes sera neutralisée en plaçant EOF avant la première ligne de commande à interpréter.

- placer un commentaire particulièrement long, le mode d'emploi ou des fichiers d'application dans le fichier principal.

Pratiquement tous les fichiers contenus dans les disquettes du package TURBO-Forth exploitent la directive EOF. De nombreux programmes sont documentés de cette manière.

C. L'auto-documentation.

TURBO-Forth est un langage particulièrement compact. Cette compacité est d-e à la séparation des fonctions d'édition, de compilation et d'aide. Cette dernière tient en six fichiers portant les mêmes noms que les vocabulaires résidant au moment du lancement de TURBO-Forth:

HIDDEN BUG ROOT USER ASSEMBLER FORTH

A chaque vocabulaire est associé un fichier d'extension .VOC contenant des explications sur les mots du vocabulaire correspondant:

vocabulaire fichier associé
   
HIDDEN HIDDEN.VOC
BUG BUG.VOC
ROOT ROOT.VOC
USER USER.VOC
ASSEMBLER ASSEMBLE.VOC
FORTH FORTH.VOC

Pour se faire expliciter un ou plusieurs mots, il suffit de taper HELP suivi du ou des mots à expliciter:

HELP DUP
affiche
DUP (n--n,n) duplique une cellule 16 bits sur la pile

HELP : BOUCLE 10000 0 DO LOOP ;
affiche :

Si HELP ne trouve pas un mot dans la documentation, il précise si c'est un nombre ou un mot non documenté.

Si HELP n'est pas suivi d'un mot, il passe en mode entrée de caractères. A partir de ce moment, tout mot tapé sera explicité. Pour sortir de ce mode, il suffit de taper sur la touche <RET> sans entrer de caractères.

Les fichiers .VOC sont structurés de la manière suivante:

- le mot à documenter est placé en début de ligne, séparé du reste de la ligne par un ou plusieurs espaces. Chaque ligne est terminée par un retour chariot. Un groupe de lignes séparées par un seul retour chariot entre chaque ligne constitue une "fiche". La taille d'une fiche est indéterminée.

- chaque "fiche" est séparée de la suivante et éventuellement de la précédente par un double retour chariot. Les fichiers d'extension .VOC étant des fichiers ASCII, donc constitué par des enregistrements de longueur variable, il faut "apprendre" à FORTH la documentation afférente à chaque vocabulaire.

Si l'utilisateur modifie le contenu d'un fichier .VOC à l'aide d'un éditeur ASCII, il doit faire réapprendre cette documentation à TURBO-FORTH:

FORTH LEARN fait apprendre la documentation contenue dans le fichier FORTH.VOC. ASSEMBLER LEARN fait apprendre la documentation contenue dans le fichier ASSEMBLE.VOC.

Le mot à documenter doit toujours être placé en début de fiche. Si ce mot n'existe pas dans le vocabulaire à documenter, sa documentation est ignorée. Les mots peuvent être placés dans n'importe quel ordre: ordre alphabétique, ordre de définition dans le vocabulaire, ordre par classes de mots, etc...

Lorsque l'utilisateur définit un nouveau vocabulaire, il peut documenter les mots définis dans celui-ci en créant un fichier d'extension .VOC portant le même nom de fichier que le nom du nouveau vocabulaire, à concurrence de huit caractères pour le nom du fichier:

VOCABULARY LOGO
LOGO DEFINITIONS
: POUR [COMPILE] : ; IMMEDIATE

crée le vocabulaire LOGO. A partir de cet instant, on peut créer et éditer le fichier LOGO.VOC:

********* DOCUMENTATION LOGO *************
POUR Mot de définition d'une procédure LOGO
FIN Mot clôturant la définition d'une procédure

Le mot FIN, bien que non défini peut déjà être documenté. Ensuite, il faut quitter l'éditeur et revenir soius TURBO-Forth pour définir FIN:

POUR FIN [COMPILE] ; ; IMMEDIATE

Pour apprendre la documentation LOGO, il suffit de taper:

LOGO LEARN HELP POUR
affiche
POUR Mot de définition d'une procédure LOGO

TURBO-Forth dispose ainsi de deux mode de documentation des procédure:

- une méthode statique sous forme de commentaires inclus dans le fichier source;

- une méthode dynamique où des explications peuvent être fournies sur demande.

HELP est contextuel. Deux mots ayant le même libellé mais définis dans des vocabulaires différents n'auront pas la même documentation:

FORTH HELP C,
C, (o--) compile un octet dans le dictionnaire

ASSEMBLER HELP C,
C, o --- Mot vectorisé assemblant un octet: l'octet est compilé à l'adresse donnée par HERE et le pointeur d'assemblage qui délivre HERE est incrémenté de 1. Cette primitive fondamentale d'assemblage est vectorisée sur son homonyme du vocabulaire FORTH pour les définitions par CODE dans le dictionnaire.

TURBO-Forth n'exige pas la présence des fichiers d'extension .VOC pour fonctionner. En l'absence de ceux-ci, TURBO-Forth affiche simplement:

: TTT ;
HELP TTT
TTT mot non documenté du vocabulaire FORTH

D. Le décompilateur.

Dans un compilateur conventionnel, le code source est transformé en code objet contenant les adresses de référence à une bibliothèque équipant le compilateur. Pour dosposer d'un code exécutable , il faut linker le code objet. A aucun moment le programmeur ne peut avoir accès au code exécutable contenu dans ses bibliothèque avec les seules ressources du compilateur.

Avec TURBO-Forth, le développeur peut décompiler ses routine, mais également visualiser les primitives prédéfinies donc comprendre le fonctionnement de son programme ou de FORTH dans son intégralité. En ne gérant ni bibliothèque ni table de référence, TURBO-Forth se situe à part dans la grande famille des compilateurs.

Pour compiler un mot ou une définition, il suffit de taper SEE suivi du mot à décompiler. Exemple:


affiche

Le décompilateur affiche le code contenu dans une définition tel qu'il se présente dans la zone paramétrique di mot à décompiler. Dans l'exemple ci-dessus, on constate la présence de mots placés automatiquement par le compilateur:

10000 devient (LIT) 10000
DO devient (DO)
LOOP devient (LOOP)

Ceci s'explique aisément:

- une valeur littérale ne peut être reconnue en exécution quisi elle est marquée. Le marquer est (LIT) pour les nombres littéraux. (") pour les chaînes de caractères littérales, etc...

- le mot DO, comme beaucoup d'autres mots comme IF, THEN, BEGIN, WHILE, etc... sont des mots d'exécution immédiate, c'est à dire qu'ils sont chargés de placer dans la définition un ou plusieurs mots exécutable par l'interpréteur interne de FORTH.

Le décompilateur marque les valeurs de branchement par des numéros:


affiche

La définition de JOUR sous sa forme compilée semble avoir peu de rapport avec la définition de dépard. L'interpréteur PORTH ne connaît que deux types de branchements, BRANCH pour les chanchements inconditionnels et ?BRANCH pour les branchements conditionnels. Toutes les structures de contrôle telles IF..THEN, IF..ELSE..THEN, BEGIN..UNTIL, etc... placent un code branchement BRANCH ou ?BRANCH suivi d'une longueur de branchement vers l'avant ou l'arrière.

Le décompilateur analyse le type du mot à décompiler: définition deux-points, constante, variable, variable chaîne, vecteur, etc... dans le cas des variables chaînes, des variables numériques et des vecteurs, TURBO-Forth indique le contenu de ces trois types de mots:


affiche

E. Le déssassembleur.

Le décompilateur reconnaît tous les mots, mais ne décompile que ceux définis en FORTH. Pour les primitives définies en langage machine, il faut utiliser le déssassembleur:

SEE DUP
affiche
DUP est en code machine

Pour permettre à SEE de désassembler une définition en code machine, il faut charger le désassembleur

INCLUDE DISASS86

Grâce aux technique de vectorisation, SEE peut maintenant désassembler un mot défini en code machine:

SEE DUP
affiche

Le désassembleur s'arrête lorsqu'il rencontre un saut vers l'adresse pointée par les macro-instructions 1PUSH, 2PUSH ou NEXT.

En dehors de SEE, le désassembleru FORTH sait traiter n'importe quelle adresse mémoire, intra-segment ou extra-segment, ainsi que toure interruption en utilisant l'un des mots suivants:

DIS pour désassembler dans le segment contenant TURBO-Forth. Ce mot doit être précédé d'un valeur indiquant l'adresse intra-segment:

HEX 100 DIS désassemble le moteur FORTH, c'est à dire l'interpréteur interne de FORTH.

LDIS pour désassembler du code extra-segment. Cemot doir être précédé de deux valeurs indiquant le segment et le déplacement dans ce segment:

HEX 2F40 0 LDIS désassemble lecode situé dans le segment 2F40hà l'adresse 0

IDIS pour désassembler une interruption ce mot est précédé du numéro d'interruption:

HEX 10 IDI désassemble lu code machine puinté par l'interruption 10h.

Dans le cas d'un désassemblage d'une procédure particulièrement longue, l'affichage est suspendu par appui sur une touche quelconque du clavier (l'appui sur la touche <ret> interrompt définitivement le désassemblage). Pour reprendre un désassemblage à partir de ce point d'arrêt,exécuter NDIS.

F. Le traçage en exécution.

La panoplie des outils d'aide au développement ne serait pas complète sans un débogueur. Le mot DEBUG suvi du mot à exécuter en mode traçage permet de suivre l'exécution de ce mot lorsqu'il sera exécuter:


affiche

Ledébogueur attend l'appui sur une touche quelconque, la barre d'espace par exemple, pour exécuter le prochain mot de la définition à tracer.

L'appui sur C passe en traçage continu, l'appui sur une autre touche repasse en mode pas à pas.

L'appui sur F donne lamain à TURBO-Forth. Cet étatparticulier doitêtreréservé à la modification du contenu de la pile de données, modification des variables numériques ou alphanumériques. Pour reprendre le taçage, taper RESUME.

L'appui sur Q interrompt définitivement le traçage d'une définition.

En fin de traçage d'une définition, le mot à déboguer peut être désélectionné manuellement en exécutant UNBUG.

Le mot sélectionné par DEBUG apparaîtra en surintensité.Ceci permet de retouver le mot dans les autres définitions:

DEBUG EMIT SEE CR
affiche .....
je vous laisse découvrir. Mais le groupe Forth@club.voila.fr vous donne quelques renseignement supplémentaire:

Le mot EMIT positionné en mode traçage par DEBUG apparaît en surintensité dans la définition compilée de CRLF qui est le vecteur de CR.

L'éxécution de UNBUG conserve au mot précédemment tracé la propriété de s'afficher en surintensité.

 

Voilà, c'est la fin de cette apprentissage en Forth. Maintenant si vous voulez plus de détails, le Guide de référence pourra vous aider encore plus.

A bientôt.

 

 

-- hautdepage -- sommaire -- page d'accueil --