Que le Forth soit avec vous
Avec l'avènement de Windows et des langages visuels,
beaucoup
de programmeurs amateurs se sont détournés de cette activité.
Les langages objets, très attirants au demeurant, masquent en réalité
une bonne partie du travail nécessaire - un programme se résumant
à l'utilisation de bibliothèque de fonctions déjà
développées. Nous allons tenter dans cette rubrique de vous
faire découvrir quelques langages qui vous donneront à nouveau
le goût de la programmation et de mettre les mains dans le cambouis
informatique. Le Forth fut créé dans les années 60,
par un homme seul : Charles Moore. Ses caractéristiques étant
très différentes des langages disponibles à ce moment,
il fut nommé Fourth pour langage de quatrième génération.
Mais programmant sur un IBM 1130 qui n'acceptait pas les
identificateurs
de plus de 5 caractères, le nom fut tronqué en Forth. On le
voit, IBM bridait déjà la créativité des programmeurs...
Comme tous les langages de cette époque, mais plus particulièrement
pour le Forth, la faible puissance de calcul et les quelques
kilo-octects
de mémoire des machines obligeaient à utiliser un code compact,
optimisé afin d'utiliser au mieux les ressources disponibles. Comme
vous avez pu le remarquer, Bill n'a jamais été un accroc du
Forth... Même si nos ordinateurs sont bien plus puissants maintenant,
cette compacité et cette optimisation sont toujours de réels
avantages. Quel utilisateur se plaindra d'une vitesse accrue ? Et côté
programmeur, une application écrite en Forth demande quelques lignes
là où en Pascal, plusieurs procédures avec échange
de paramètre seraient nécessaires. De plus, le Forth fonctionne
à la fois de manière interprétée et compilée.
Il cumule ainsi les avantages de la souplesse de débogage et de la
rapidité d'exécution (une fois qu'on est sûr de soi).
Enfin, c'est un langage qui s'adapte très bien aux contraintes des
petites et anciennes machines, PC XT d'origine avec 64 ko (!) de Ram ou
même aux portables de poches du type Atari Portfolio.
Un langage de 4ème dimension
Regardons de plus près les particularités de ce langage.
La grande différence de conception avec les autres est l'utilisation
explicite d'une pile. Non, non, rangez votre Duracell bâton AA 1,5
V et laissez votre micro branché sur le secteur 220 V... Cette pile
est l'endroit où sont stockées vos variables. Pour ceux qui
ne pigent pas les piles, l'analogie classique se fait avec une pile
d'assiette.
Seule l'assiette supérieure est accessible, les autres se découvrant
au fur et à mesure du dépilage. L'utilisation de cette pile
force à une optimisation de chaque instant des variables utilisées
et rend l'accès aux données extrêmement rapide, le microprocesseur
sait toujours où les chercher. Dans cette pile, les valeurs stockées
peuvent être de différents types : numériques, alphanumériques
ou adresses mémoire d'une variable de n'importe quel type.
Une autre différence est l'utilisation de la notation
polonaise
inverse qui, même si elle peut être déconcertante pour
nous autres habitués à la notation classique, permet de régler
définitivement les problèmes de priorité des opérateurs
arithmétiques et de ne plus utiliser de parenthèses. Chaque
expression en notation polonaise inversée est univoque.
Comme tous les langages, le Forth contient un certain
nombre
de fonctions
qui forment son dictionnaire. A ce dictionnaire, viendront s'ajouter
toutes
les procédures que vous allez créer. La conception d'un programme
consistera donc à enrichir ce dictionnaire.
Une gymnastique intellectuelle
Conséquence : le programmeur habitué au C ou au Pascal
devra faire quelques efforts pour s'adapter à ce mode de pensée.
Occuper au minimum la pile, ne conserver que le nécessaire et utiliser
la notation polonaise inverse rend la programmation propre et optimisée
obligatoire. Dans un premier temps, le travail sera peut être plus
long mais au final on gagnera du temps. Un proverbe ne dit-il pas "
on ne programme qu'une fois alors qu'on exécute le
programme
plusieurs
fois " ? Les quelques exemples joints illustrent la puissance
du
Forth, mais également le raisonnement particulier qu'il faut suivre
pour programmer dans ce langage.
Dernier avantage du Forth et non le moindre :
complètement
délaissé
par les grands éditeurs de logiciels, le langage est à un
prix accessible de tous. Vous trouverez des compilateurs dans le
domaine
public (gratuits) ou à des prix très réduits : environ
100 F pour le Turbo Forth (édité par MP7), y compris dans
sa version Windows ! Comme rien n'est rose, je garde le défaut pour
la fin. Trop rapide, ce langage est inutilisable sur Pentium. Je
recherche
donc pour un usage personnel un 8088 à 4,77 Mhz qui me sera amplement
suffisant. (écrire à la rédaction qui transmettra).
Sylvain Cadet
Les secrets d'une telle vitesse
Utilisation de pile, langage semi-compilé, préférence
pour les entiers... Les raisons de la vitesse exceptionnelle du Fort
sont
nombreuses. En voici une autre qui risque d'en choquer certains parmi
vous
: il n'y a aucun contrôle sur la validité des opérations.
En effet, ces contrôles se paient par une perte de temps. A
l'utilisateur
donc de savoir s'ils sont utiles ou non et de les placer lui même.
Un exemple : tapez 1 0 / . (diviser 1 par 0), vous
n'obtiendrez aucun
message d'erreur mais -1. Un résultat négatif ? Les initiés
auront compris qu'il s'agit aussi du plus grand nombre connu par leur
ordinateur
sur 16 bits non signé, c'est à dire 65535. L'ordinateur essaie
donc de s'approcher au mieux de l'infini, véritable résultat
de l'opération précédente. Moi, je dit bravo.
Premiers pas
On arrête le verbiage et on regarde à quoi cela
ressemble.
Tous ces exemples sont en Turbo Forth, une évolution du Forth
83-standart.
Commençons par un exemple de polonaise inverse. En mode direct
interprété,
calculons :
5 8 *
Cette ligne empile 5, puis 8 et enfin multiplie ces deux
valeurs, le
résultat est stocké au sommet de la pile.
La commande '.' dépile et affiche le sommet de la pile.
C'est
à dire : 40.
Mettons tout ça en procédure, que l'on appelle " mot
" en Forth.
: addition
+ . ;
Entre les deux points et le point virgule, Forth
compile,
avant et après,
il interprète. On a donc défini le mot addition, par l'addition
des deux valeurs au sommet de la pile et l'affichage du résultat.
5 8 addition
affiche 13.
addition fait maintenant parti du dictionnaire de votre
Forth.
La commande
dark words qui liste le dictionnaire vous le confirmera.
Un peu plus dur :
: carre
dup * . ;
Plusieurs commandes manipulent la pile : drop, swap,
over,
rot, -rot,
pick, roll, etc. Dup duplique le sommet de la pile. Carre calcule donc
le
carre du sommet de la pile.
Encore mieux :
: debile
dup 1 - dup 1 >
IF RECURSIVE THEN *;
Debile duplique le sommet de la pile, lui soustrait 1,
le
compare à
1, puis si la comparaison est vrai, debile multiplie le sommet de la
pile,
sinon il recommence. Vous avez trouvé à quoi sert ce mot ?
Allez, un petit effort... Le mot RECURSIVE devrait vous aider.
Factorielle
remplace débile pour ceux qui ont trouvé, les autres le gardent.
Ces mauvais exemples n'ont pour simple but que d'attiser
votre
curiosité
sur cette syntaxe particulière et de vous inciter à redécouvrir
le plaisir de programmer soi-même. Souvenez vous de votre premier
Print, de vos Goto et autres If then else... N'hésitez pas, apprenez
un nouveau langage, et cela vous réconciliera avec votre Pentium
W95.
|