lumen
Eine dynamisch typisierte Skriptsprache in Kotlin. Der Quelltext wird gescannt, zu einem AST geparst, zu Bytecode kompiliert und auf einer stackbasierten virtuellen Maschine ausgeführt.
Eine dynamisch typisierte Skriptsprache in Kotlin, die wirklich Code ausführt: Scannen und Parsen zu einem AST, Kompilierung zu Bytecode und Ausführung auf einer eigenen stapelbasierten virtuellen Maschine.
Überblick
lumen ist eine dynamisch typisierte Skriptsprache, geschrieben in Kotlin, die wirklich Code ausführt. Der Quelltext wird gescannt, zu einem AST geparst, zu Bytecode kompiliert und schließlich auf einer eigenen stapelbasierten virtuellen Maschine ausgeführt. Es sieht aus wie eine gewöhnliche Skriptsprache, aber darunter geht jede Zeile den vollen Weg vom Text zu Maschineninstruktionen.
Der Unterschied zwischen lumen und einer typischen Übung im Sprachenbau liegt in diesem einen Wort: Bytecode. Es ist leicht, einen Interpreter zu bauen, der einen Baum durchläuft und ihn im Flug auswertet. lumen geht einen Schritt weiter und kompiliert, was zugleich schwerer und viel interessanter ist.
Ein Interpreter, der den Syntaxbaum durchläuft, ist einfach zu schreiben, stößt aber schnell an eine Leistungsgrenze. Jeder Durchlauf derselben Schleife bedeutet, dieselben Baumknoten erneut zu durchlaufen, mit allem Overhead, den das mit sich bringt. Für ein kleines Skript ist das unsichtbar, für alles Größere spürbar.
lumen wählt den schwereren, aber besseren Weg: Statt den Baum auszuführen, kompiliert es ihn zu Bytecode, einer flachen Liste einfacher Instruktionen. Diese Instruktionen laufen dann auf einer virtuellen Maschine, die nichts mehr von der Syntax verstehen muss - sie bekommt fertige Befehle und führt sie einfach aus.
Vom Text zum Bytecode
Der ganze Weg zerfällt in vier Stufen. Der Scanner schneidet den Text in Token, der Parser ordnet sie zu einem Baum, der Compiler verwandelt den Baum in Bytecode, und die virtuelle Maschine führt diesen Bytecode Instruktion für Instruktion aus. Es sieht aus wie gewöhnlicher Code, aber jede Zeile geht denselben vollen Pfad.
der Quelltext wird zu Token.
die Token ordnen sich zu einem Syntaxbaum (AST).
der Baum verwandelt sich in Bytecode.
der Bytecode läuft auf einem Stapel, Instruktion für Instruktion.
Die Stapelmaschine von innen
Eine Stapelmaschine hat keine Register wie eine echte CPU - sie legt Operanden auf einen Stapel und nimmt sie wieder herunter. Eine Addition läuft auf drei Züge hinaus: lege zwei Zahlen ab, nimm sie herunter und addiere, lege das Ergebnis ab. Dasselbe Modell treibt unter anderem Python und Java unter der Haube an, daher ist es, es selbst zu schreiben, ein Blick darauf, wie die Sprachen funktionieren, die man täglich benutzt.
Addition auf einer Stapelmaschine
| Schritt | Instruktion | Stapel danach |
|---|---|---|
| 1 | lege 2 ab | 2 |
| 2 | lege 3 ab | 2, 3 |
| 3 | addiere | 5 |
Eine Stapelmaschine arbeitet ohne Register und kann dennoch jedes Programm ausführen. Die ganze Arithmetik und die Weitergabe von Werten geschehen über einen einzigen Stapel - das ist überraschend einfach und zugleich genau die Idee, die große Produktionssprachen antreibt.
Das Ergebnis: das Wort "kompiliert" hört auf, eine Abstraktion zu sein
Heraus kommt eine Sprache, die wirklich Code ausführt - sie interpretiert keinen Baum im Flug, sondern kompiliert ihn und führt ihn auf einer eigenen Maschine aus. Es ist ein Projekt, nach dem das Wort "kompiliert" aufhört, eine Abstraktion zu sein, weil man den ganzen Weg selbst gegangen ist, von einem Zeichen in einer Datei bis zu einer Instruktion, die etwas tut. Eine kleine Sprache, aber vollständig bis hinunter zur Ausführung.
Weitere Projekte
Weitere Projekte aus derselben Kategorie - sehen Sie, wie wir ähnliche Herausforderungen angehen.
Haben Sie ein ähnliches Projekt?
Melden Sie sich - ein Angebot ist kostenlos und kommt innerhalb einer Stunde.



