Programmation Forth/Introduction

<< Retour au sommaire

Forth est un langage de programmation interactif atypique, découvert (comme il aime à le dire) par Charles H. Moore dans les années 1960.

Une de ses importantes caractéristiques est l'utilisation d'une pile de données pour passer des arguments entre les mots, qui sont les constituants d'un programme Forth.

Un simple 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 2 nombres du sommet de la pile (3 et 4) par leur produit 12, et enfin de remplacer les 2 nombres en haut de pile (2 et 12) par leur somme 14.

4
3
2

Opérandes sur la pile.


12
2

Multiplication des 2 opérandes du haut.


14

Addition des 2 opérandes du haut.

À 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 sommets), etc. le programmeur construit le vocabulaire de son application en définissant ses propres mots, qu'il réutilise ensuite :

: CARRE DUP * ; ( définition de CARRE )
11 CARRE ( on obtient 121 en sommet de la pile )
: CUBE DUP CARRE * ; ( usage de CARRE dans une définition )
2 CUBE ( retourne 8 )

Un mot Forth est l'équivalent des sous-programmes, fonctions ou procédures dans les autres langages. Cependant, 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/interpréteur utilisé : génération directe de code machine ou "bytecode" par exemple (il existe de nombreuses variantes intermédiaires).


Implémentations

modifier

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, font de Forth l'un des langages interprété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 "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 (par exemple la structure switch/case peut s'écrire à partir de la structure if/else/then). 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, le tout pouvant fonctionner avec quelques kilo-octets de mémoire vive, et tenant sur une simple disquette (source intégral compris) ; autrement dit un micro-environnement de développement capable de s'autocompiler à partir de son propre source depuis une plateforme disposant de ressources modestes comme les applications embarquées.

Un des aspects de Forth est de tenter de trouver un juste milieu entre la langue naturelle du programmeur et la "langue" artificielle du processeur, contrairement aux autres langages qui prennent nettement le parti du programmeur au détriment du processeur. Ce compromis donne au langage son aspect exotique et déroutant de prime abord, et requiert sans conteste une certaine capacité d'adaptation de la part du programmeur.

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. De par l'extrême facilité d'implémentation d'un interpréteur pour ce langage, il existe un nombre incalculable de systèmes Forth de domaine public, qui sont soit alignés sur le standard ANS-Forth (comme gforth de GNU), soit sont des dialectes plus ou moins éloignés de Forth (notamment ColorForth de Charles Moore), et ce pour à peu près toutes les plateformes, du 8051 à Windows, en passant évidemment par Linux.

Utilisations

modifier

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. Parmi les applications les plus prestigieuses, on relèvera sa présence sur quelques missions de la NASA. Les ROMs Open Firmware des produits d'Apple et de Sun, ainsi qu'une partie du boot de FreeBSD, étaient jusqu'à récemment écrites en Forth, permettant la portabilité du code de bas niveau entre les processeurs.

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 régresse sur son terrain de prédilection. Plus généralement, la tendance étant à ce que le programmeur devienne une ressource interchangeable (ce qui permet déjà l'externalisation de certains développements) au détriment de l'expérience et de la compétence, l'utilisation de Forth ne peut que décliner. Bien que la mort de Forth ait été annoncée maintes et maintes fois, et que d'aucuns le qualifieraient de moribond, de nouveaux programmeurs de divers horizons curieux et attirés par ces performances et ces 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