Scripting en Forth : présentation du projet

1. Intentions
2. Contraintes techniques
3. Pistes poursuivies
4. Les aides reçues
5. Documentations en ligne
6. Documentation de Gforth
7. Premiers essais de scripts



Dernière intervention le : 16/11/2003

1. Intentions


Au départ, l'intention était de trouver un hébergeur amical permettant d'installer un site consacré au langage Forth, avec la possibilité d'avoir des rédacteurs multiples et la gestion d'un ou de plusieurs forums (foras ?).
La solution libre et gratuite SPIP semblait évidente, jusqu'à ce qu'un copain bien intentionné me dise : "Et pourquoi tu ne le ferais pas en Forth... cela aurait au moins le mérite de la cohérence...".

Pourquoi non ? la réponse est évidente : je ne sais pas faire, alors que pour SPIP, j'ai une longue pratique et que je sais qu'il est facile ensuite de le transmettre à d'autres sans douleur.

Pourquoi ne pas essayer tout de même ? La seule chose que cela va coûter, c'est du temps, or du temps, précisément je peux en libérer pour ce projet.

Ce qui suit est un bloc-note des expérimentations, au fil du temps. Cela vaut ce que ça peut... A vous de voir si vous y trouverez quelque chose d'utile.
Retour au menu

2. Contraintes techniques


Avant de pouvoir mettre en place chez un hébergeur, il faut pouvoir expérimenter en local à partir des possibilités de sa propre machine. Voici donc la liste des "contraintes" imposées par l'équipenment personnel ainsi que par l'hébergeur pressenti (il n'en sera pas question ici, cela reste dans le "domaine réservé").

Système Linux

Système de la famille UNIX, libre et gratuit, très répandu chez les hébergeurs. Installé sur ma machine personnelle ainsi que chez l'hébergeur pressenti. Le Forth retenu devra fonctionner avec ce système, ce qui exclut les versions Dos.

La distribution actuellement installée sur la machine est la Mandrake 9.1, mais toute distribution de Linux correctement installée et configurée fera l'affaire.

Forth

Le dialecte Forth retenu devait fonctionner sous Linux et éventuellement sous Windows (y compris les Windows serveurs). Il devait surtout être bien documenté et être assez utilisé dans le monde pour qu'il soit possible de récupérer de l'info à l'occasion sur les mailing-lists.

Pour ces raisons, j'ai retenu Gforth, peut être par ignorance d'un meilleur candidat. La version téléchargeable inclut une documentation hypertextuelle relative à Gforth ainsi qu'à la norme ANSI.

Apache

Pas le choix ici : c'est le serveur de l'hébergeur.
Pas de regrets à avoir : un ami expert à qui je demandais :
"Et Apache, c'est un bon cheval ?"
m'a simplement répondu :
"C'est Le cheval !". (sous-entendu : rien d'autre qui vaille...)
Alors, ce sera Apache.

La Mandrake 9.1 propose deux versions d'Apache : 1.3.27 et 2.0...
La version utilisée ici est la 1.3.27
Apache est fourni avec une documentation en ligne importante (en anglais) et il existe au moins un livre copieux chez O'Reilly...
Retour au menu

3. Pistes poursuivies


Quand on ne sait pas, on peut emprunter plusieurs cheminements, qui, par la suite, permettront de bâtir une démarche méthodologique. Le tout est ici de ne pas se faire trop d'illusion sur soi-même... J'insiste ici sur la notion de bloc-notes, qui est comme une sorte de cahier d'expériences.
Jusqu'à présent, j'ai procédé ainsi :

Ce point sera, bien sûr modifié en fonction de l'évolution du travail.
Retour au menu

4. Les aides reçues


Les différents camarades qui ont accepté de m'aider dans ma démarche sont désignés ici par des initiales. Ils se reconnaîtront mais leur anonymat est ainsi préservé. Les extraits de messages sont donnés ici sans "charcutage" afin de respecter les écrits des auteurs mais aussi de façon à ce que toute personne intéressée puisse trouver une information pas trop incohérente..

Quant à savoir si j'ai tout compris, et dans quels délais, c'est une autre histoire.

M.O. :

... Je suis tombé sur ce site:
http://arizona.speedchoice.com/~scudders/Zen_Soft/
en cliquant sur download on peut récupérer forthwsrc.zip (...)
dans ce fichier, c'est surtout le httpd.conf qui est intéressant : l'exemple est en "oui une dose !" , mais ça se converti très bien en pingoin l'extension des fichiers forth est .4hf

F.D. :


D'après mes quelques notions et sous toute réserve:
Le mécanisme du CGI fait en sorte qu'un programme exécutable est appelé avec passage de paramètres, typiquement récupérés dans une FORM.
Il existe 2 méthodes, GET et POST. L'une fait passer les paramètres par l'environnement, l'autre les fait passer sur la ligne de commande. De l'autre côté, le serveur récupère la page génèrée par l'exécutable sur la sortie standard.
L'exécutable peut être à peu près n'importe quoi: programme en C, script shell, etc. Du moment que Linux le reconnait habituellement en tant que "truc" exécutable. Dans le cas des langages ionterprétés, c'est l'interpréteur qu'il faut lancer. Il faut bien entendu en même temps alimenter cet interpréteur avec un source, typiquement celui qui génère la page à afficher.
Je crois qu'une méthode possible est de faire en sorte que gforth ( ou un autre) exécute automatiquement un fichier source forth au démarrage ( la plupart le font). Dans ce fichier, on peut mettre le source qui génère le code HTML comme vous l'avez montré dans ce fichier, et au niveau de la page qui déclenche le CGI, il suffit d'appeler l'executable Forth.

A.V. :


Un site en Forth fait en Forth. Tu montres que tu y crois vraiment.

A ma question
> Cela s'est déjà fait ?
Il n'y a pas de raison : si tu peux récupérer les variables d'environnement et écrire sur la sortie standard, tu peux faire du CGI. Retour au menu

5. Docs en ligne


Forth


J'ai cherché de la documentation sur d'autres Forth mis en ligne qui pourraient convenir.
La page
http://www.forth.org/compilers.html propose de nombreux outils, avec, pour certains le code source (souvent des compilateurs écrits en langage C).
Au bout de nombreuses heures d'essais et de lectures, j'ai ressenti du découragement.
Il existe bien des Forth tels que Aforth, pfeforth, eforth... et leur code source est fourni. Mais ces outils, souvent réalisés à partir de Windows ne sont pas facilement compilables avec Linux, dans la mesure où ils n'intègrent pas la logique confortable :
./configure ; make ; make install
du monde Linux. Non pas que ce soit insurmontable, mais je n'ai pas envie de perdre du temps : je n'ai pas de Windows sur ma machine d'assembleur (n'ayant jamais acheté de license) et n'ai pas envie d'en payer une (trop cher !) ni d'en faire un usage illégal (affaire de respect de soi : pirater ce qu'on méprise, c'est assez pitoyable, non ?). Retour au menu

6. La documentation de Gforth


Elle est en anglais... comme on s'en serait douté.
Il s'agit d'un ensemble touffu de fichiers HTML, ce qui donne une impression de parcellisation, mais aussi parfois offre une "seconde chance" de trouver ce qu'on cherche.
A titre d'exemple, un extrait qui m'intéresse beaucoup :

Gforth in pipes
Gforth can be used in pipes created elsewhere (described here). It can also create pipes on its own (see Pipes).
If you pipe into Gforth, your program should read with read-file or read-line from stdin (see General files). Key does not recognize the end of input. Words like accept echo the input and are therefore usually not useful for reading from a pipe. You have to invoke the Forth program with an OS command-line option, as you have no chance to use the Forth command line (the text interpreter would try to interpret the pipe input).
You can output to a pipe with type, emit, cr etc.
.....
Pipes involving Gforth's stderr output do not work.
Retour au menu

7. Premiers essais de scripts


Rien, Nada...

Soyons honnête ici : au début, parti sur la piste de la configutation d'Apache, je n'arrivais à rien. Rien.
Afin de ne pas perdre totalement mon temps, j'ai travaillé sur la possibilité de fabriquer automatiquement des pages HTML à partir de scripts écrits en Forth. Assez rapidement, je suis parvenu à quelque chose... Sans être certain que l'essentiel était là... mais au moins je sortais du découragement et pouvais commencer à réfléchir.

Squelette d'un script pour Gforth

Voici le code source d'un fichier texte appelé "bonjour.fs" :
#! /usr/local/bin/gforth
s" Coucou les amis " type cr
." Hello les amis" CR cr cr
." Coucou les amis "
cr
bye
Ce fichier une fois saisi avec un éditeur de texte, ouvrir une fenêtre console et lui appliquer la commande suivante :
chmod +x bonjour.fs
Toujour dans la fenêtre console, entrer :
./bonjour.fs

Le script va :
Remarque et critique :
Le texte s'affiche effectivement, mais dans la console texte, à la suite de la commande ./bonjour.fs. Pas sûr que ce soit une bonne solution.

Un script qui écrit tout seul un fichier HTLML

Soit le texte contenu dans le fichier hello.fs
#! /usr/local/bin/gforth
s" /var/www/html/blabla.html" w/o create-file throw Value fd-out
s" <html> <body>Ceci est ma page Zeb" fd-out write-file throw
s" Et qu'elle est belle..." fd-out write-file throw
s" </body></html>" fd-out write-file throw
fd-out close-file throw
bye
Remarque et critique :
La syntaxe est celle de Gforth (lire la documentation ou me demander des éclaircissements)
Il serait mieux de désigner la cible /var/www/html/blabla.html en faisant appel à une variable ou à une constante.
Il s'agit là d'un exemple de faisabilité très minimaliste, mais qui donne un résultat.

Incorporer un fichier texte dans une page HTML

Afin d'améliorer la lisibilité, on va créer un mot qui remplacera
fd-out write-file throw
Appelons-le ecri-dans. Cela donne :
: ecri-dans fd-out write-file throw ;
Le fichier texte, appelé ici page.txt contient le début d'une chanson de Montéhus qui commémore la révolte d'un régiment en 1907, dans le midi vinicole :
Gloire au dix-septième

Chanson de Montéhus (1907)

Salut, salut à vous,
Braves soldats du dix-septième
Salut, braves Piou-pious
Chacun vous admire et vous aime
Salut, salut à vous,
A votre geste magnifique.
Vous auriez, en tirant sur nous
Assassiné la République.

Le texte du script Forth, appelé creepage.fs, est le suivant :

#! /usr/local/bin/gforth

256 Constant max-line
Create line-buffer max-line 2 + allot
( ouverture des fichiers cible et source )
s" /home/alain/siteforth/salut.html" w/o create-file throw Value fd-out
s" page.txt" r/o open-file throw Value fd-in

: ecri-dans ( écrit dans le fichier cible ) fd-out write-file throw ;
: ferm-dans ( ferme le fichier cible ) fd-out close-file throw ;
: ferm-source ( ferme le fichier source ) fd-in close-file throw ;
: vide-fichier ( effectue le transfert source vers cible )
begin
line-buffer max-line fd-in read-line throw
while
line-buffer swap ecri-dans
repeat ;

( création de la page web cible )
s" <html> <body>" ecri-dans
vide-fichier
s" </body> </html>" ecri-dans

( fermeture des deux fichiers )
ferm-source
ferm-dans

bye

Remarque et critiques :
Le programme fonctionne, ce qui démontre qu'il est possible de générer à la volée des pages web en utilisant un script en Forth.
Ce résultat est très positif, si l'on considère les faibles moyens mis en oeuvre.
Moins encourageant est le fait que la structuration du texte est perdue.
Restons modeste :
- ce qui vient d'être fait pouvait l'être tout aussi bien en C, en Basic, avec Perl ou PhP, avec Python...
- le code Forth du dernier script fait assez baclé, ce n'est pas "du beau Forth"... mais il est assez compréhensible pour quelqu'un qui vient d'un autre langage.

A suivre donc.
Retour au menu