Erlang/OTP 29, kompiliert zu nativem Code
Clause ist ein AOT-Compiler für Erlang. Er verarbeitet, parst und analysiert Erlang-Quellcode, kompiliert ihn über LLVM und linkt native Programme mit einer eigenen Laufzeitumgebung: leichtgewichtige Prozesse, Nachrichtenaustausch und Garbage Collection pro Prozess.
In Entwicklung: Eine wachsende Teilmenge von Erlang lässt sich bereits kompilieren und ausführen. Die Dokumentation beschreibt, was funktioniert und wo Clause von Erlang/OTP abweicht.
Funktionen
OTP 29
Moderne Erlang-Syntax
Präprozessor und Parser für Erlang/OTP 29: Makros, Records, native Records, Maps, Bitstrings, Comprehensions, maybe und Typspezifikationen.
LLVM
LLVM-Backend
Kompiliert zu verifiziertem LLVM-IR, Bitcode oder nativen Objektdateien mit O0, O2 oder Os, mit typspezialisierten Funktionsvarianten.
clau -o app
Native Programme
Linkt Erlang-Module und die Laufzeitumgebung mit Clang zu einem eigenständigen Programm, mit einem einzigen Befehl.
spawn · send · receive
Erlang-Prozesse
Prozesse auf Scheduler-Threads mit selektivem receive, Timeouts, Links, Monitoren, registrierten Namen und Exit-Signalen.
GC pro Prozess
Isolierter Speicher
Jeder Prozess besitzt seinen eigenen Heap, der von einem kopierenden Garbage Collector nach dem klassischen ERTS-Design bereinigt wird.
7 Zielplattformen
Plattformübergreifend
Ausführung unter Windows x64 validiert; Objektdateien geprüft für Linux x86, x64, ARM und AArch64, Windows x86 und x64 sowie Apple Silicon.
Funktionen im Detail
Frontend
- Präprozessor: Makros, include, include_lib, bedingte Kompilierung und Sprachfeatures
- Erlang/OTP 29-Syntax: Ausdrücke, Muster, Records, Bitstrings, Typen und Spezifikationen, Kontrollfluss und Comprehensions
- Syntaxprüfung, Ausgabe des expandierten Quellcodes und eingerückte Syntaxbaum-Ansicht
- Diagnosen im Quellcode über mehrere Eingabedateien
Compiler
- Semantische Analyse: Prüfung der Teilmenge, Variablenbindungen, Aufrufauflösung, deklarierte und inferierte Typen
- LLVM O0, O2 und Os; Objektdateien, IR und Bitcode pro Modul; IR-Snapshots mit Erlang-Quellcode als Kommentar
- Typberichte: Quellcode mit inferierten Funktionssignaturen
- Echte Endrekursion für lokale, entfernte und wechselseitig rekursive Aufrufe
- Eine eindeutige notimpl-Meldung für gültiges Erlang, das ein noch nicht implementiertes Feature braucht
Laufzeitumgebung
- LLVM-freie C++23-Laufzeitbibliothek, in jedes Programm gelinkt
- Ganzzahlen beliebiger Genauigkeit, Gleitkommazahlen, Atome, Tupel, Listen, Maps, Bitstrings, Records, Funs, Pids, Ports und Referenzen
- Prozesse, Nachrichten, selektives receive, Links, Monitore und registrierte Namen auf Scheduler-Threads
- Heap pro Prozess mit kopierendem Garbage Collector und Binärdaten außerhalb des Heaps
- Ports für Standard-I/O, Dateien, Unterprozesse und Sockets
- Ausnahmen mit try, catch und after sowie Stacktraces
- io:format mit der ~p-Formatierung von OTP; Teilmengen von lists, maps, file und io
Projekte und Werkzeuge
- TOML-Projekte mit benannten Zielen, Quellsuche und Optionen pro Ziel
- Kommentierte Startprojekte mit clau --new-project
- Ein clau-Befehl vom Erlang-Quellcode zum nativen Programm
- Verhalten geprüft gegen die Ausgaben des Referenz-Erlang/OTP
Clause