Sa Majesté ... Le FORTH, dans toute sa splendeur de la "flibuste"
yanolezard
"Votre Sire est bien bonne" ... Sa Majesté ... Le "FORTH",
Quoi de plus naturel que de te souhaiter tous mes meilleurs vœux 2024 dans ces mondes merveilleux et industriels et pas que, car même présent un peu partout sur la planète, on peut te trouver à des endroits où l'on s'y attendrait le moins.
FORTH (a été) et est utilisé principalement dans des systèmes embarqués et des (micro)contrôleurs, en raison de leur caractère compact et de la facilité d'utiliser des mots définis en assembleur dans des programmes de plus haut niveau.
Parmi les applications les plus prestigieuses, on relèvera ta présence :
Sur quelques missions de la NASA.
Sur les ROM (Read Only Memory).
En "Open Firmware" des produits Apple et Sun Microsystems (racheté par l'Oracle),
Sur les parties du boot de FreeBSD (écrites en Forth), permettant la portabilité du code de bas niveau entre les processeurs.
Pour la petite histoire :
• Le premier logiciel commercial d'automatisation de mesures par PC avec calcul en virgule flottante et un tas de possibilités très puissantes a été conçu entièrement en FORTH : il s'appelait "ASYST" et fonctionnait sur un PC "XT" (cela ne me rajeunit pas)
• Le moteur du langage de programmation des contrats intelligents (smart contracts) de Bitcoin et autres blockchains, appelé "script", est écrit et développé en FORTH, avec notation polonaise inversée et des piles.
Pour les "jeunes générations", je te propose, Majesté, de revenir un peu sur ton modeste sujet :
"FORTH" est un langage de programmation à pile, inventé par notre émérite Charles H. MOORE, vers les années 1960.
Standardisé par l'ANSI (American National Standards Institute) en 1994 (à ne pas confondre avec l'ANSSI), puis adopté tel quel par la non moins célèbre "ISO" (International Standard Organization) en 1972 et une nouvelle version, FORTH 2012, a été publiée en 2014.
Au fait, comment se prononce le petit nom de sa Majesté ?
Il s'agit d'une contraction de l'anglais "fourth" (quatrième) : notre bon Charles H.MOORE le voyait comme un langage pour les ordinateurs de 4ième génération.
À l'époque, la machine utilisée était un IBM 1130 qui ne permettait que des noms de 5 lettres.
Comment en est-on arrivé là ?
En 1958, un jeune et brillant informaticien (Charles H. MOORE), chargé de calculer des trajectoires de satellites, entreprend, pour faciliter son travail quotidien, la construction d'une boîte à outils à base d'interpréteurs de commandes.
• Au fil des ans, l'interpréteur s'améliore et rend indépendant de la machine hôte.
En 1968, notre ami Charles lui donne un nom : FORTH, et en 1970, il est suffisamment mûr pour faire l'objet d'une première publication comme « Langage pour calcul interactif ».
En 1971, la première application majeure de FORTH :
Charles H. MOORE et une charmante développeuse, Elizabeth RATHER, développent le logiciel de pilotage du radiotélescope de la ville de "Kitt Peak" (dans l'Etat de l'Arizona) sur 2 mini-ordinateurs 16 bits.
• Par ses performances et sa souplesse d'emploi, l'application intéresse rapidement d'autres observatoires, et en 1976, FORTH est adopté comme standard par l'Union Internationale d'Astronomie (UIA) .
Après une première modernisation du logiciel en 1973, l'ami Charles H.MOORE et l'amie Elzabeth RATHERr fondent "Forth, Inc.", pour promouvoir le langage et ses applications.
• En 1976, une première version exécutable sur microprocesseurs 8-Bits est disponible sous le nom de "MicroFORTH" (une pure merveille à l'époque)
En 1978 est créée une association, le "Forth Interest Group (FIG)", pour promouvoir une version « domaine public » du langage sur un maximum de processeurs, et publier la revue "Forth Dimensions".
Le "FIG-FORTH", légèrement différent du "MicroFORTH", contribuera grandement à la diffusion du langage.
Le besoin de standardisation d'un langage que chacun peut modifier à sa guise devient manifeste :
• Une première tentative (FORTH77) aboutit au premier standard largement diffusé.
• Le FORTH79 devient un standard qui évolue 4 ans plus tard.
• Le FORTH83 est né, mais des incompatibilités entre les deux versions engendrent des problèmes de portabilité, et sont à l'origine d'un clivage dans la communauté des programmeurs FORTH.
OK et ça marche comment ?
FORTH repose sur l'utilisation explicite de piles, alors que les autres langages utilisent des piles invisibles au programmeur.
Une des importantes caractéristiques du langage est l'utilisation d'une pile de données pour passer des arguments entre les mots, qui sont les constituants d'un programme Forth.
Exemple :
L'expression 2+3*4 sera traduite par la suite 2 3 4 * +, dans la notation polonaise inversée.
Cette suite de mots agit sur la pile de données. Son effet est :
• d'empiler successivement les valeurs 2, 3, puis 4 ;
• de remplacer ensuite les deux nombres du sommet de la pile (3 et 4) par leur produit, 12 ;
• et enfin de remplacer les deux nombres en haut de pile (2 et 12) par leur somme, 14.
À partir des mots prédéfinis du langage, comme +, *, DUP (qui duplique l'élément en sommet de pile), SWAP (qui échange les deux éléments du sommet), etc., le programmeur construit le vocabulaire de son application en définissant ses propres mots, qu'il réutilise ensuite :
Exemple :
: CARRE DUP * ; (définition de CARRE)
11 CARRE (on obtient 121 au sommet de la pile)
: CUBE DUP CARRE * ; (usage de CARRE dans une définition)
2 CUBE (on obtient 8 au sommet de la pile)
Une conséquence importante de l'utilisation d'une pile est la quasi suppression des noms de variables locales, qui deviennent inutiles.
Une fois le travail accompli, quid de la Pile de retour ?
Comme dans la quasi-totalité des langages, Forth utilise une pile pour stocker les adresses de retour des sous-programmes en cours d'exécution.
L'originalité ici est de mettre cette pile à la disposition du programmeur, principalement pour un stockage temporaire de données, au moyen de deux opérateurs permettant les transferts "pile de données – pile de retour".
Tiens, des Sous-Programmes ?
Un mot Forth est l'équivalent des sous-programmes, fonctions ou procédures dans les autres langages.
Cependant, notre ami Moore décrit les mots plus comme des abréviations que comme des fonctions à la "C".
Le mot d'ordre en Forth est la factorisation, c'est-à-dire le découpage de l'application en petits mots dont la définition tient sur une ligne ou deux.
Les « mots » de Forth sont « compilés », c'est-à-dire convertis en une forme exécutable et ajoutés au dictionnaire des mots.
La forme exécutable diffère suivant le compilateur ou l'interpréteur utilisé : génération directe de code machine ou bytecode par exemple (il existe de nombreuses variantes intermédiaires).
Dans les autres langages, un sous-programme s'utilise avec une syntaxe différente des fonctions de base du langage :
Dans Forth, un sous-programme est un mot de plus, que l'on utilise de la même façon que les mots de base du langage : ce comportement identique des fonctions de base et des sous-programmes permet de redéfinir facilement une fonction de base pour améliorer un programme.
Encore des secrets ... intéressants ?
Il n'y a pas d'instruction "GOTO" (le langage "Basic" en utilise de trop).
La syntaxe particulière de l'instruction "IF...ELSE...THEN" permet de résoudre de façon élégante le problème des « n+1/2 itérations » qui, en programmation structurée, aboutit à l'introduction d'une variable booléenne supplémentaire si l'on veut absolument éviter le "GOTO".
Et les Variables ?
Il n'y a pas d'opérateur d'affectation à deux opérandes (incarné par = dans de nombreux autres langages).
Les variables sont toujours conçues comme des adresses dans la mémoire, et non comme la valeur stockée dans la mémoire.
Le transfert des données se fait par les deux opérateurs @ (fetch) et ! (store), qui correspondent aux instructions "LDA" (Load Accumulator) et "STA" (Store Accumulator) d'un assembleur, la pile jouant ici le rôle de l'accumulateur.
Quelques exemples
VARIABLE A 3 A ! (déclare et initialise A)
VARIABLE B (déclare B)
A @ B ! (recopie A dans B)
Sur la dernière ligne :
L'invocation de « A » pousse l'adresse « A » sur la pile.
@ remplace cette adresse par la valeur contenue à cet endroit de la mémoire, à savoir 3.
À son tour, l'invocation de « B » pousse l'adresse « B » sur la pile. Celle-ci contient à ce moment la valeur 3 et l'adresse « B ».
Enfin, ! écrit 3 en mémoire à l'adresse « B », et laisse la pile vide.
Alors, comment mettre en œuvre FORTH et tout ce petit monde ?
Le mélange interprétation/compilation, associé à des techniques de compilation efficaces et à la possibilité offerte par nombre de systèmes de définir aussi de nouvelles primitives en assembleur, fait de « Forth » l'un des langages interprétés et compilés les plus rapides et les plus compacts.
Très proche du matériel, le Forth est un langage que l'on peut qualifier de bas niveau, mais qui dispose de ressources qui lui permettent de se rapprocher du haut niveau.
Le langage est en effet basé sur un petit nombre de primitives suffisamment élémentaires pour être implémentées directement « dans le silicium » (c'est-à-dire être les instructions d'un processeur matériel.
Les primitives de Forth sont donc bel et bien un « langage assembleur » pour ces processeurs. Il existe quelques exemples de processeurs Forth.
Dans le même temps, le langage permet de définir des mots qui ont une action sur la compilation :
On peut ainsi définir de nouvelles structures de contrôle (exemple : la structure "switch/case" peut s'écrire à partir de la structure "if/then/else").
Cette caractéristique fait de Forth un langage extensible.
C'est ainsi qu'à partir de quelques primitives écrites en langage machine, on peut construire un interpréteur en ligne de commande, un assembleur, un compilateur, un éditeur de source.
La compacité est extrême :
Sur une machine 8 bits, 7 kilooctets suffisent pour avoir un interpréteur en ligne de commande, dont 700 octets seulement de code machine, le reste étant constitué de tables de pointeurs.
En ajoutant environ 5 ko, on dispose de l'éditeur, d'un assembleur, et d'un système rudimentaire de stockage sur disquettes, le tout fonctionnant sans système d'exploitation avec quelques kilooctets de mémoire vive, et tenant sur une simple disquette (source intégrale incluse).
Autrement dit un micro-environnement de développement capable de s'auto-compiler à partir de son propre source, depuis une plateforme disposant de ressources modestes comme les applications embarquées.
Il y a de nombreux Forth ...
Le langage Forth a fait l'objet d'une normalisation officielle, l'ANS-FORTH, fondée sur les standards officieux précédents Forth-79 et Forth-84.
La plupart des Forth commerciaux suivent cette norme. Du fait de l'extrême facilité d'implémentation d'un interpréteur pour ce langage, il existe un très grand nombre de systèmes Forth de domaine public, qui sont :
soit alignés sur le standard ANS-Forth (gforth de GNU),
soit ce sont des dialectes + ou - éloignés de Forth (ColorForth de Charles Moore)
et ce pour à peu près toutes les plateformes, de l'Intel 8051 à Windows, en passant par Linux.
Comment utiliser Forth ?
Forth a été utilisé principalement dans des systèmes embarqués et des contrôleurs, en raison de leur caractère compact et de la facilité d'utiliser des mots définis en assembleur dans des programmes de plus haut niveau.
L'augmentation de performance des micro-contrôleurs permettant désormais la programmation des applications de ce type en langage C, désormais érigé en assembleur universel, l'utilisation de Forth est conjointe (c'est encore dans les vieux pots que l'on fait les meilleures soupes).
Bien que la mort de Forth ait été annoncée maintes et maintes fois (comme le couple Mainframe/Cobol), et que d'aucuns le qualifieraient de moribond, de nouveaux programmeurs de divers horizons curieux et attirés par ses performances et ses conceptions remarquables s'y intéressent régulièrement et s'en inspirent :
La survie de quelques sociétés prestataires de services qui basent leur offre sur Forth et réalisent des développements pour des projets de pointe (gestion de trafic aérien par exemple), laissent à penser que Forth n'est pas une langue morte.
Quelques-une de mes réalisations en Forth :
- Simulateur de mécanique des fluides et de matériaux, avec points de contention, sur les fuselages des avions gros porteurs militaires, en 3D filaire.
- Serveur vidéotex, BBS (Bulletin Board System) et leurs outillages.
- Analyseur dynamique de protocoles réseaux industriels avec obsfucation.
- Logiciel embarqué pour pesons industriels.
- Logiciel embarqué pour balances électroniques et caisses enregistreuses.
- Automates de laboratoires (médical, nucléaire, biologique).
- Interfaces de communication entre serveurs industriels et commandes robotiques/machines spéciales.
- Logiciel simple de CAO électronique (typon, routage et chevelu) embarqué en ROM.
- Générateur d’IHM industrielles pour automates et autres PLC,
Internet des Objets pour l'industrie (microcontrôleurs, capteurs intelligents)
- Outillage logistique pour le pilotage de production.
Envie de « Forth », comme de fraises ou de pissenlit, n’hésitez plus : la demande est en voie de reprise car il y a énormément de sujets industriels à migrer, à maintenir, à développer, pour qui veut s’y mettre vraiment.
Je remercie Sa Majesté le FORTH pour le temps accordé à son histoire.
Bien à vous Toutes et Tous,
Yanolezard.