Forth est un langage de programmation interactif atypique, découvert (comme il aime à le dire) par Charles H. Moore dans les années 1960.
En 1958, un jeune informaticien nommé Charles Moore, chargé de calculer des trajectoires de satellites, entreprend pour faciliter son travail quotidien la construction d'une boîte à outils sous la forme d'un interpréteur de commandes. D'année en année, cet interpréteur est amélioré et rendu indépendant de la machine hôte. En 1968, il prend le nom de Forth, et en 1970, il est suffisamment mature pour faire l'objet d'une première publication comme "Langage pour calcul interactif".
1971 voit la première application d'envergure : Moore utilise Forth pour développer le logiciel de pilotage du radio-télescope de Kitt Peak (Arizona) sur deux mini-ordinateurs 16 bits. Il y est bientôt rejoint par Elizabeth Rather, qui devient le deuxième programmeur Forth. 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.
Après une première modernisation du logiciel de Kitt Peak en 1973, Moore et Rather 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.
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é, FORTH79. Ce standard évolue 4 ans plus tard en FORTH83, 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.
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.
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
À 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 )
Une conséquence importante de l'utilisation d'une pile est la quasi-suppression des noms de variables locales, qui deviennent inutiles.
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.
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).
Il n'y a pas d'instruction GOTO. 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.
Il n'y a pas d'opérateur d'affectation "=". Les variables ne sont pas des données, mais des pointeurs vers des zones de mémoire allouées explicitement par le programmeur, qui contiennent les données. 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.
VARIABLE toto toto 3 ! ( déclare et initialise toto ) VARIABLE titi ( déclare titi ) toto @ titi ! ( recopie toto dans titi )
L'invocation de toto pousse l'adresse de la variable toto sur la pile. @ remplace cette adresse par la valeur contenue dans toto, à savoir 3. A son tour, l'invocation de titi pousse l'adresse de titi sur la pile, qui contient à ce moment les deux valeurs 3 et adr(titi). Enfin, ! écrit 3 en mémoire à l'adresse titi, et laisse la pile vide.