Mon premier language qui devrait être enseigné à tous : le Reverse Polish Lisp

Je m'aperçois que ce n'est pas le basic de mon commodore 64 quand j'avais 12 ans, où le pascal de mon PC quand j'en avais 14 qui m'a amené à coder, mais le langage de ma calculatrice HP48GX et ce pour des raisons d'avancées techniques que nul autre ordinateurs et langage de programmation n'ont atteinte aujourd'hui.

Déjà, j'ai toujours aimé allumer et éteindre des pixels sur les écrans, et aucun autre langage ne faisait ça aussi simplement de base.

Commençont par une revue de ce langage sans prétention : on a une pile d'appel visualisée en écran principale dans laquelle on peut visuellement introduire du code et des données.

C'est la seule UX où la pile d'appel est au centre de l'expérience du développeur.

LA PILE

Dans cette pile inversée par rapport à la convention des langages dits infixe on commence par empiler PUIS on appelle les fonctions. L'intérêt pour le concepteur du langage c'est que le parseur de commandes est dit de gauche à droite monotonique. En notation « naturelle » mathématique on met l'opérateur AVANT les opérandes, ce qui oblige pour des raisons de respect d'une typographie académique qui n'a pas lieu dans un ordinateur de rajouter moults circuits électronique et manipulation d'AST (arbre syntaxique).

Ce faisant en étant plus proche du métal, on se bâti une belle intuition de comment faire son langage et des piles d'appels.
Les piles étant elles même des objets (oui le RPL est objet) on peut les sauvegarder et les restaurer, permettant de créer des SCOPES, des contextes d'execution. Bref, de la programmation paramétrée.

Le « typage » sains

Je vais commencer par le plus merveilleux typage que je n'ai jamais revu en informatique : le typage unitaire.

Avant de faire de l'informatique pour compter les fois où un client se branlait devant une paire de chaussure croco j'étais étudiant en science APPLIQUÉE, où l'on confrontait des résultats d'équations maousse costaud à des résultats de mesures.
Une erreur est vite arrivée, heureusement la HP48 avait un as dans la mange : la validation des unités.

les tags

# 1:m/s + 2:kg
Syntax Error : vous pouvez pas additionner des choux et des carottes 
Les valeurs scalaires (à gauche) pouvait être associées à des chaînes libres qui permettaient de transformer la pile en dictionnaire (il y avait des opérations de FTS pour aller chercher les occurences de valeurs taguées, mais aussi ces étiquettes (tags) permettaient de donner des unités physiques aux OBJETS. Car je vais y revenir le typage étaient attachés aux objets et non basés sur les objets. Le typage était un traît de classe et non une classe.
Et cela permettait de aussi de gérer intelligemment le polymorphisme. Chose qui paraît incompréhensible par un dev moderne, mais un typage de type add(int: a, int: b) basé sur la valeur est CON. En math on sait faire matrice + entier et on a pas envie de surcharger les opérateur des classes, mais de leur faire hériter des traits des scalaires. traîts qui sont variables.
Les règles de l'algèbre hermitienne sont symmétrique à droite, anti-symmétrique à gauche et donc aB = B*a != Ba. Ce serait bien dans une époque où la quantique est importante que nos langages nous fassent pas chier à changer des contextes ou charger des librairies compliquées quand l'algèbre linéaire et hermitienne coexistent. Ce serait mieux que le langage gère le typage et les opérateurs en fonction de traits.

les unités

La HP48 possédait la validation native des unités physiques. C'est une chose que j'ai utilisé en mission de compta. J'ai permis à un client de détecter une sous facturation car des unités exprimées en feuilles étaient injectées pour calculer des coûts à la page. AUCUN PUTAIN de langage moderne n'a embrassé la possibilité de gérer des cohérences d'unités, voire des cohérences de domaines de valeurs (underflow/overflow), où encore de pertes de précisions dans les calculs de float.

Si la HP48 était un calculateur, nos langages modernes sont à peine du domaine de la calculatrice 4 opérations.

les structures de données

L'une des choses qui est dure à apprendre en informatique c'est d'étendre son vocabulaire informatique en structure de données.

Un langage comme basic possède 3 structures de données majeures : les nombres, les caractères et les tableaux.

La HP48 elle proposait : les matrices, les bitmaps, les tableaux, les listes à la lisp, le code (objet modifiable par du code), les fichiers, les fonctions programmées, les alarmes, et la pile qui pouvait servir de table associative grâce aux étiquettes.

La Pile et et les listes à la LISP sont vraiment des outils de bases à partir on peut construire une vision de l'informatique structurée. Surtout les listes à la LISP. D'ailleurs c'est pour ça que je dis RPL pour ce langage car cette structure de donnée est la mère de prototyper toutes les autres structure de données (arbres, Btree, tuple, set...) en plus l'éditeur permettait de structurer la représentation mentale.

Grâce à cette structure de base, il devenait trivial de créer ses PROPRES structures de données. Qui n'a pas implémenté sa propre DB de téléphones persos en mode SQL Less avant que les bases orientées document deviennent à la mode ?

Les shunts

Le langage avait un shunt (court circuit) pour aller chercher le RPL sans ceinture/sans passer par le microcode qui ouvrait la porte à son langage primaire. (syseval) Découvrir le syseval c'était comme avoir ses 18 ans et être enfin autorisé à se bourrer la gueule et se tuer en voiture. Tout langage devrait avoir un débrideur.

Papillon roi de l'évasion

Ce calculateur était ouvert, il avait même un protocole intégré utilisé par des instruments de mesure : kermit.

Kermit étant un protocole série à 8bits, c'est le genre de trucs faciles à bricoler pour mettre sur un RS232C et permettant ... de pouvoir étendre sa machine soit en téléchargeant des archives d'un ordi soit en utilisant sa calculatrice comme solveur d'équation symbolique pour son PC.



Pour toute ces raisons, j'ai aimé programmé en RPL, et j'ai appris à aimer à YODA COMME PARLER, toujours à la fin le verbe mettant.

J'ai aussi pu faire un protoype de MON langage plus facilement en voyant que le RPL était bon et ne me demandant comment faire un FORTH orienté objet extensible qui rendrait jaloux le programmateur que j'étais. Ah et j'ai oublié, je pouvais jouer à lemmings sur la calculatrice et la gestion de l'écran permettait de vraiment s'amuser à dessiner et faire des jeux.

Je pense contrairement à la masse qu'en étant exigeant sur la partie chiante (structure de données, objets...) de geeks scientifiques on fait plus facilement un environnement permettant de développer des jeux.

Bref, j'ai jamais retrouvé le kiff de coder en HP48 et je crois toujours qu'il y a une place pour un nouveau langage extensible qui s'en inspire car c'est facile à bâtir en silicium et microcode à même de transformer des CPUs lowspec en foudres de guerre.

No comments: