lumen
Un langage de script à typage dynamique en Kotlin. Le source est scanné, analysé en AST, compilé en bytecode et exécuté sur une machine virtuelle à pile.
Un langage de script à typage dynamique en Kotlin qui exécute vraiment du code : analyse lexicale et syntaxique vers un AST, compilation en bytecode et exécution sur sa propre machine virtuelle à pile.
Aperçu
lumen est un langage de script à typage dynamique écrit en Kotlin qui exécute vraiment du code. La source est scannée, analysée en un AST, compilée en bytecode, et enfin exécutée sur sa propre machine virtuelle à pile. Cela ressemble à un langage de script ordinaire, mais en dessous chaque ligne parcourt tout le chemin du texte jusqu'aux instructions machine.
La différence entre lumen et un exercice typique d'écriture de langage tient dans ce seul mot : bytecode. Il est facile de construire un interpréteur qui parcourt un arbre et l'évalue à la volée. lumen va un pas plus loin et compile, ce qui est à la fois plus difficile et bien plus intéressant.
Un interpréteur qui parcourt l'arbre syntaxique est simple à écrire, mais il atteint vite un plafond de performance. Chaque exécution de la même boucle signifie reparcourir les mêmes nœuds de l'arbre, avec tout le surcoût que cela porte. Pour un petit script c'est invisible, pour quoi que ce soit de plus grand c'est sensible.
lumen choisit la voie plus difficile mais meilleure : au lieu d'exécuter l'arbre, il le compile en bytecode, c'est-à-dire une liste plate d'instructions simples. Ces instructions tournent ensuite sur une machine virtuelle qui n'a plus besoin de rien comprendre à la syntaxe - elle reçoit des ordres tout prêts et les exécute simplement.
Du texte au bytecode
Tout le chemin se décompose en quatre étapes. Le scanner coupe le texte en jetons, le parseur les range en un arbre, le compilateur transforme l'arbre en bytecode, et la machine virtuelle exécute ce bytecode instruction par instruction. Cela ressemble à du code ordinaire, mais chaque ligne parcourt le même chemin complet.
le texte source devient des jetons.
les jetons se rangent en un arbre syntaxique (AST).
l'arbre se transforme en bytecode.
le bytecode s'exécute sur une pile, instruction par instruction.
La machine à pile de l'intérieur
Une machine à pile n'a pas de registres comme un vrai processeur - elle empile et dépile les opérandes. Une addition se ramène à trois gestes : empile deux nombres, dépile-les et additionne, empile le résultat. Le même modèle fait tourner entre autres Python et Java sous le capot, donc l'écrire soi-même, c'est jeter un œil sur le fonctionnement des langages que l'on utilise au quotidien.
Addition sur une machine à pile
| Étape | Instruction | Pile après |
|---|---|---|
| 1 | empile 2 | 2 |
| 2 | empile 3 | 2, 3 |
| 3 | additionne | 5 |
Une machine à pile fonctionne sans registres et peut pourtant exécuter n'importe quel programme. Toute l'arithmétique et le passage des valeurs se font par une seule pile - c'est étonnamment simple, et en même temps exactement l'idée qui fait tourner les grands langages de production.
Le résultat : le mot "compilé" cesse d'être une abstraction
Ce qui en sort est un langage qui exécute vraiment du code - il n'interprète pas un arbre à la volée mais le compile et l'exécute sur sa propre machine. C'est un projet après lequel le mot "compilé" cesse d'être une abstraction, parce qu'on a parcouru soi-même tout le chemin, d'un caractère dans un fichier jusqu'à une instruction qui fait quelque chose. Un petit langage, mais complet jusqu'à l'exécution.
Plus de projets
D'autres réalisations de la même catégorie - découvrez comment nous abordons des défis similaires.
Vous avez un projet similaire ?
Contactez-nous - le devis est gratuit et arrive sous une heure.



