Journal Nouveautés issues du petit monde du FORTH

Posté par  . Licence CC By‑SA.
Étiquettes :
36
15
juil.
2024

Le langage FORTH, inventé par Charles Moore dans les années 1960, pourrait facilement laisser penser qu'il est devenu totalement désuet : en effet, sa dernière version officielle, FORTH 2012, date de 2014, et il en va de même pour son implémentation libre la plus avancée, GNU FORTH (gforth 0.7.3), qui remonte également à la même année.

Qu'en est-il ?

Dans les faits, il semble effectivement un peu passé de mode, et ne possède évidemment pas l'engouement actuel pour Python ou Rust, ni la formidable quantité de bibliothèques additionnelles qui forment un écosystème pour du développent moderne. Est-ce un avantage, ou un inconvénient ?

Le Forth est un langage à pile possédant un dictionnaire de mots agissant sur cette pile. Un programme Forth définit de nouveaux mots qui s'ajoutent à ce dictionnaire. De part sa forte expressivité, il est possible de l'étendre et de le personnaliser facilement, aussi ce langage organique voire anarchique a été standardisé en 1994 et adopté en tant que standard international en 1997.

Les critiques que l'on fait souvent au Forth c'est que c'est un langage parfois en « lecture seule », dans le sens où le code peut devenir difficile à suivre et relire s'il n'est pas suffisamment commenté, notamment pour suivre les échanges avec la pile.

Néanmoins, sa force est également l'extrême liberté que l'on peut ressentir en l'utilisant, car il n'y a pas de garde-fou ni de limite à ce que l'on peut faire avec.

Ainsi si par exemple on redéfinit un nombre (dans l'exemple plus bas 8 en 4), il prendra pour la suite la nouvelle valeur assignée à ce symbole :

: 8 4 ; 
*terminal*:1:7: warning: defined literal 8 as word ok
5 8 + . 9  ok

On peut ensuite revenir au symbole d'origine :

: 8 #8 ." c'est redevenu un huit ! " cr ; 
*terminal*:12:38: warning: redefined 8
*terminal*:10:3: warning: original location ok
5 8 + . c'est redevenu un huit ! 
13  ok

C'est un exemple extrême, mais qui illustre bien que tout est possible en Forth : on définit les nouveaux mots du vocabulaire avec la notation :
:
définition
;

Ce qui est appréciable également avec cette notion de mots à créer, c'est que contrairement à d'autres langages, il n'y a pas obligatoirement de parenthèses pour indiquer les passages de paramètres, et cela rend l'écriture plus directe et expressive. Pour certains programmeurs, Forth c'est un mode de vie, et c'est également un retour aux fondations de l'informatique.

Les communautés existantes se comptent en quelques milliers d'adeptes seulement (sur reddit, sur facebook ou ailleurs), malgré tout elles sont dynamiques et originales. Il ressort également que beaucoup de monde a écrit "son" propre FORTH, comme une sorte de rite de passage. Et le fait est que même si c'est sans doute pas trivial, ça ne semble pas être si compliqué que ça. La recette, c'est un cœur souvent écrit en assembleur ou en C, avec quelques mots de base permettant de définir de nouveaux mots.

Un exemple : milliforth, dérivé de sectorforth, le coeur est en asm : https://github.com/fuzzballcat/milliForth/blob/master/sector.asm
le reste de la programmation s'effectuera en forth pur, à partir des quelques 13 mots de base :
https://github.com/fuzzballcat/milliForth/blob/master/hello_world.FORTH

Et la petite cinquantaine de mots rajoutés dans ces définitions permettront de sortir enfin un "hello world".

En plus de la gymnastique mentale qu'implique de l'utiliser sur son PC, et qui reste d'actualité, il y a quantité d'excellents FORTH sur les microcontrôleurs de type Arduino, ESP32 ou Raspberry Pico, et ils présentent des avantages en terme d'empreinte mémoire ou de praticité (on peut éditer le code directement sans reflasher la carte). Voici un site complet sur le sujet, en français, avec de nombreuses documentations et didacticiels : https://esp32.arduino-forth.com/

Ce système a donc ses partisans, souvent de vieux geeks pionniers de l'informatique qui ne jurent que par FORTH, mais aussi ses détracteurs qui notent également à juste titre un héritage un peu lourd et qui peut s'avérer obsolète ou fastidieux.

Mais on trouve également de nouveaux adeptes qui viennent apporter un sang neuf à la communauté du FORTH. Je vais lister ici quelques projets qui ont attirés mon attention récemment :

Il y a pléthore de logiciels permettant de faire tourner FORTH, certains sont compatibles entre eux, d'autres moins ou pas du tout, certains donnent accès à l'interface graphique et d'autres pas du tout. Il est difficile de s'y retrouver, mais l'exploration et la découverte sont un exercice divertissant, voire rafraîchissant. Je n'ai pas réellement trouvé de logiciel tout en un qui réunit toutes les qualités pour permettre de développer facilement des logiciels avec des interfaces modernes, même si gforth semble s'en rapprocher le plus. D'ailleurs si vous souhaitez vous lancer dans cette aventure, je vous conseille de compiler la version de développement de gforth, qui a beaucoup plus de fonctionnalités que la version stable d'il y a 10 ans. Parfois je me dis que plutôt que de m'obstiner dans la voie du FORTH, je ferais mieux d'étudier python (mais je n'aime pas du tout), ou ruby, ou autre chose, mais malgré tout, on retrouve une sorte d'ascèse qui m'attire encore et toujours dans le FORTH…

J'ai réalisé un petit site qui présente mes recherches, pour le moment surtout dans des essais graphiques en mode turtue, des aventures textuelles, donc ça ne va pas bien loin, mais je m'amuse bien avec tout ceci :

Le plus complexe que j'ai pu réaliser jusqu'à présent c'est un petit générateur de schéma en origami pour réaliser des pochettes de cartes (à partir de la largeur et l'épaisseur), ainsi que l'ébauche d'un petit jeu (du cochon) tournant sur Nintendo DS via la machine virtuelle UXN.

FORTH est une sorte d'ovni dans le paysage de l'informatique, plus en avance que le Basic dans les années 70 et 80, mais également plus complexe, il a toujours été un marché de niche, et il peut sembler anachronique de continuer à l'utiliser en 2024. Pourtant FORTH a et aura toujours sa raison d'être, il semble indéboulonnable et continue d'attirer la curiosité.

  • # Merci pour la news

    Posté par  . Évalué à 7.

    J'ai toujours aimé ce langage et je le suis toujours un peu. Et aussi surprenant que celà puisse paraître, apprendre Forth a changé ma manière de développer dans tous les langages que j'utilisais : ça m'a appris à avoir un certain nombre bonnes pratiques générales telles que faire des choses simples, ne pas avoir de code trop long pour un mot (une fonction dans les autres langages), ne pas passer trop de paramètres ni avoir trop de valeurs de retour à un mot ou fonction (s'il y a besoin de beaucoup de paramètres, c'est bien souvent qu'une structure serait mieux adaptée). Avec Forth (peut-être plus qu'avec d'autres langages), si on ne respecte pas ces pratiques, on se perd bien plus vite qu'avec d'autres langages.

    • [^] # Re: Merci pour la news

      Posté par  (site web personnel) . Évalué à 4.

      À avaler, c'est un langage un peu forth de café.

      Adhérer à l'April, ça vous tente ?

    • [^] # Re: Merci pour la news

      Posté par  . Évalué à 2.

      le livre "Starting Forth" de Leo Brodie est considéré comme un modèle du genre (https://www.forth.com/starting-forth/) mais il a également écrit un autre, intitulé "Thinking Forth", qui est une réflexion sur la manière de programmer, j'ai commencé à le lire, et les concepts sont très intéressants : https://thinking-forth.sourceforge.net/ (c'est sous licence CC-BY-NC-SA)

      En gros ça met l'emphase sur le fait de simplifier au maximum le problème en le découpant en plusieurs éléments (méthode agile ?), et que chaque élément doit avoir une entrée et une sortie pour le passage des paramètres. Ensuite, le design de FORTH permet de décrire et appeler les différentes phases sans que chaque phase soit nécessairement codée.

      Je ne suis pas spécialement un bon programmeur, mais j'imagine que des développeurs pro peuvent en retirer des idées intéressantes.

      « Le pouvoir des Tripodes dépendait de la résignation des hommes à l'esclavage. » -- John Christopher

      • [^] # Re: Merci pour la news

        Posté par  . Évalué à 3.

        C'est effectivement par ces deux livres (je ne sais plus dans quel ordre) que je me suis mis à Forth. Ils sont très bien faits (+1 aux illustrations pour décrire les mots : les petits personnages qui amenaient les valeurs sur la pile, pour ensuite les dépiler et y empiler le résultat de ses actions …).

  • # gforth 0.7.9

    Posté par  (site web personnel) . Évalué à 4.

    En fait, moi aussi j'ai une 0.7.3 sur ma distribution…

    Pour autant, à regarder les snapshots, il y a une 0.7.9 en cours (depuis pas mal de temps)
    à partir de https://www.gnu.org/software/gforth/

    il y a des snapshots référencés pour la 0.7.9 : https://www.complang.tuwien.ac.at/forth/gforth/Snapshots/

    et le git indique de l'activité récente : https://git.savannah.gnu.org/cgit/gforth.git
    des tar.gz sont disponibles dans le git…

    • [^] # Re: gforth 0.7.9

      Posté par  (site web personnel, Mastodon) . Évalué à 2.

      D’après repology, pratiquement tout le monde reste en 0.7.3 :

      gforth packages versions.

      • [^] # Re: gforth 0.7.9

        Posté par  (site web personnel) . Évalué à 3.

        oui, c'est une version en cours de développement…
        J'ai essayé de l'empaqueter pour Mageia/Cauldron, mais ça ne compile pas avec un rebuild :/ Va falloir que je creuse du côté upstream pour voir quels changements sont nécessaires pour compiler selon leur méthode (il y a peut-être quelques changements de dépendances).
        Il ne me génère même pas le configure… en même temps yavait déjà un patch pour cela dans le gforth.spec

        Il y a la procédure sur
        https://git.savannah.gnu.org/cgit/gforth.git/tree/BUILD-FROM-SCRATCH

        Si quelqu'un veut essayer sur debian, ça passera peut-être mieux (je regarderai peut-être semaine prochaine sinon).

        • [^] # Re: gforth 0.7.9

          Posté par  . Évalué à 2.

          je ne connais pas trop l'empaquetage Debian, en tout cas ça compile facilement sur ce système. Je n'ai pas trop compris ce qui bloquait sur cette vieille version, parce qu'elle est largement obsolète, la version 0.7.9 possède une aide intégrée, une barre de tâche avec les diverses piles etc.

          Peut-être qu'ils attendent que 0.7.3 sorte de stable et que la 0.7.9 soit considérée comme la nouvelle version stable.

          « Le pouvoir des Tripodes dépendait de la résignation des hommes à l'esclavage. » -- John Christopher

  • # écriture seule

    Posté par  (site web personnel, Mastodon) . Évalué à 6.

    Les critiques que l'on fait souvent au Forth c'est que c'est un langage parfois en « lecture seule », dans le sens où le code peut devenir difficile à suivre et relire s'il n'est pas suffisamment commenté, notamment pour suivre les échanges avec la pile.

    C'est pas plutôt «écriture seule» ?

    J'ai plus qu'une balle

  • # The Forth Legacy

    Posté par  (site web personnel) . Évalué à 5.

    Comme sans doute quelques autres ici, j'ai adoré l'utilisation de piles et la notation polonaise inversée héritées de Forth sur mes calculateurs HP

    Pour nous émanciper des géants du numérique : Zelbinium !

    • [^] # Re: The Forth Legacy

      Posté par  (site web personnel, Mastodon) . Évalué à 2.

      Ce n’est pas hérité… Une calculatrice RPN est une calculatrice Forth tout simplement. Et quand on regarde le RPL (arrivé avec le modèle 28C), en interne c'est du Forth-object en quelque sorte, avec une interface type Lisp pour les nouveaux objets utilisateurs (listes, vecteurs, matrices, algébriques, chaînes) :)

      “It is seldom that liberty of any kind is lost all at once.” ― David Hume

  • # Postscript

    Posté par  . Évalué à 3.

    Dans le genre langage inattendu et sympa, il existe aussi Postscript qui s'inspire très forthement de Forth, si je puis dire…

  • # Ça ne nous rajeuni pas

    Posté par  . Évalué à 3.

    Si je ne me trompe pas, la dernière fois que j'ai fait du Forth c'était sur un Palm Pilot.

  • # Merci pour les nouvelles

    Posté par  (site web personnel) . Évalué à 6. Dernière modification le 20 juillet 2024 à 00:02.

    Je suis aussi un grand fan de Forth sous toutes ses formes depuis de nombreuses années. Je pense aussi, comme totof2000 au dessus, qu'il a eu une grande influence sur ma manière de coder. Méthode très bien résumée ici Forth Methodology Applied to Programming. Comme dans le livre Thinking Forth.

    Le Forth est un vrai terrier de lapin (en bon français) : on trouve toujours des choses super intéressantes dans les différentes implémentations (Gforth, pForth, zForth, retroForth, eForth, Dragon Forth et j'en passe d'autres milliers).
    La dernière en date pour ma part étant Forsp qui mêle le Forth, le Lisp et le Lambda-calcul en ~700 lignes de C. Impressionnant !

    De même que ce port d'eForth sur une machine SUBLEQ à 1 seule instruction. Ce qui prouve que le Forth peut vraiment tourner sur n'importe quelle machine ! Certain (ici présent) en ont même fait un OS bootable sur un vrai PC.

    J'aime bien aussi la blague de 2 + 2 = 5 :

    2 2 + . => 4
    : 2 dup 2 = if 3 else 2 then ;
    2 2 + . => 5

    Ou dans une version en colorForth custom : asciicast

    Ce qui est rigolo avec le Forth c'est qu'on peut le transformer à sa manière. On veut des coroutines, il suffit de les ajouter. Des quotations (une forme de lambdas en Forth), pareil, quelques lignes.

    Bref d'énormes possibilités d'exploration. Toujours un truc à trouver !

    • [^] # Re: Merci pour les nouvelles

      Posté par  . Évalué à 3.

      merci pour ton témoignage :)

      Intéressant ce colorforth, il faudra que je l'essaye, de même que retroforth qui semble avoir un développement continu et des facilités pour inclure du graphisme.

      Ces machines subleq semblent au moins aussi compliquée que du brainfuck ! 🫠

      Je n'avais pas trop compris ton exemple (qui ne fonctionne pas avec gforth, sauf si la pile n'est pas vide initialement), jusqu'à ce que je remarque que dans la plupart des FORTH, sauf gforth, DUP ne se plaint pas d'être appelé si la pile est vide. D'un autre côté, s'il n'y a rien à dupliquer, cela peut sembler logique de retourner 0. Cela fait la même chose avec OVER, mais retourne un "stack underflow" en cas de DROP.

      Et pour ceux qui se demanderaient comment le 2 numéral peut encore être utilisé en tant que 2 (et non pas appelé une nouvelle fois) une fois qu'il a été "transformé" en mot forth avec la définition : 2 dup 2 = if 3 else 2 then ; c'est juste que lors de la définition, si je ne me trompe pas, le 2 qui est comparé (avant le =) et celui qui est renvoyé (après le "else 2") sont les versions d'origine, donc numérales.

      « Le pouvoir des Tripodes dépendait de la résignation des hommes à l'esclavage. » -- John Christopher

      • [^] # Re: Merci pour les nouvelles

        Posté par  (site web personnel) . Évalué à 2.

        Ce colorForth est un fork de celui là. Je l'étend au grès des envies. Ce que je trouve sympa c'est qu'il tourne aussi bien sur un PC 64 bits que sur Arduino, sous DOS ou sur le web en webAssembly. J'ai encore quelques idées à mettre dedans avant de le considérer comme fini (au moins la partie centrale).

        Désolé pour le 0 manquant. Il est très discrètement mis au début sur le screencast.

        Et oui, avec un Forth standard, la définition courante est insérée avec le mot ;.
        Le colorForth utilisé ici est 'tail call' optimisé. C'est pour ça qu'il faut commencer par garder l'ancienne référence two au 2 d'origine.
        Écrire :2 ^2 ; ~2 fait partir en boucle infinie (qui n'explose pas le stack). Mais c'est volontaire d'avoir ce type de récursion.

        Une interrogation que j'ai à propos du Forth (ou des logiciels maison en général) est de savoir à quel point on doit / peut communiquer dessus.
        Ce Forth est tellement custom et adapté à ce que je recherche que je ne suis pas sûr qu'il convienne à quelqu'un d'autre ou que ça vaille le coup d'en parler.
        D'un autre côté j'ai été super content d'avoir trouver la version d'Esr35 : c'était la version minimale d'un colorForth en C sur laquelle je suis tombé.
        Il y a sûrement un juste milieu à trouver (ici mettre les sources sous licence libre).

  • # Utilisation

    Posté par  . Évalué à 4.

    il peut sembler anachronique de continuer à l'utiliser en 2024

    Pardon mais est-ce qu'il est utilisé ? Les exemples que tu donne et que je trouve sur internet donnent l'impression qu'il y a plus d'implémentations que de programmes pour tourner dessus. La plupart si ce n'est tous les programmes que je trouvent ont plus l'air de toy project fait pour s'amuser avec que pour répondre à un besoin autre que d'avoir une excuse pour écrire du forth.

    Ce n'est pas un mal en soit, mais c'est juste mon impression quand je tente de comprendre l'écosystème.

    https://linuxfr.org/users/barmic/journaux/y-en-a-marre-de-ce-gros-troll

    • [^] # Re: Utilisation

      Posté par  (site web personnel) . Évalué à 2.

      Si on en croit ce que disent les personnes de chez MPE, oui il semble utilisé : https://www.mpeforth.com/sample-page/46-2/ et https://www.mpeforth.com/sample-page/about-forth-2/
      GreenArrays a toujours l'air vivant https://www.greenarraychips.com/index.html
      Et des fois il y a des descendants du Forth qui sortent du garage. Comme Factor par exemple https://factorcode.org/. (juste un cas au hasard)

      • [^] # Re: Utilisation

        Posté par  . Évalué à 2.

        Oh c'est intéressant. De ce que je comprends ils font du matériel embarqué avec support (uniquement ?) de forth.

        https://linuxfr.org/users/barmic/journaux/y-en-a-marre-de-ce-gros-troll

        • [^] # Re: Utilisation

          Posté par  (site web personnel) . Évalué à 2.

          Oui embarqué avec support+consulting pour MPE.
          GreenArrays est à un tout autre niveau : la boite a été créée par Charles Moore, l'inventeur du Forth. Ils développent leur propre stack hardware basée sur des mini ordinateurs en parallèle, qui consomment très peu, programmés en colorForth.

    • [^] # Re: Utilisation

      Posté par  (site web personnel, Mastodon) . Évalué à 2.

      Les exemples que tu donne et que je trouve sur internet donnent l'impression qu'il y a plus d'implémentations que de programmes pour tourner dessus.

      La plupart des programmes sont souvent soumis à des clauses ou sont dans des contextes qui rendent difficile la communication dessus.
      Ceci dit, c'est effectivement plus présent dans l'embarqué où les constructeurs ont l'implémentation minimale qui répond à leur besoin (au passage ça n'aide pas à communiquer sur Forth de façon globale et générique) quitte à ce que d'autres qui vont utiliser le produit final programment avec une pile qui n'a plus rien à voir.
      Du coup, ton impression n'est ni fausse ni vraie.

      “It is seldom that liberty of any kind is lost all at once.” ― David Hume

  • # Forth GA144

    Posté par  . Évalué à 2.

    Salut a tous ,

    j'ai mis en ligne un simple article et lien vers mon site et github concernant le forth , en particulier le forth embarque avec le chip GA144.

    https://www.elektormagazine.com/labs/ga144-forth-144-processeurs-programmable-en-langage-forth

    http://esaid.free.fr/tutoriel_arrayforth/tutoriel_arrayforth.html

    bonne lecture

Suivre le flux des commentaires

Note : les commentaires appartiennent à celles et ceux qui les ont postés. Nous n’en sommes pas responsables.