
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 auf mehreren Scheduler-Threads, Nachrichtenaustausch, Ports und Garbage Collection pro Prozess.
In Entwicklung: Erlang/OTP 29-Programme lassen sich bereits heute zu nativen Programmen kompilieren, die unter Windows und Linux laufen, mit Clause-eigenen stdlib, kernel, crypto und ssl. Noch ausstehend: macOS mit Apple Silicon und native ARM-Hardware, die Testsuites von OTP, Quelldatei- und Zeilenangaben in Stacktraces und weitere Optimierungen; verteilte Ausführung und das Nachladen von Code im laufenden Betrieb werden nicht unterstützt. Die Benchmark-Seite zeigt, wo Clause im Vergleich zu OTP steht; die Dokumentation beschreibt, was funktioniert und wo Clause abweicht.
Funktionen
OTP 29
Moderne Erlang-Syntax
Präprozessor und Parser für Erlang/OTP 29-Quellcode, native Records eingeschlossen.
1,49× schneller
Geschwindigkeit gegenüber OTP
Geometrisches Mittel von 31 Benchmark-Kernels, Clause -O2 gegenüber dem BEAM-JIT.
clau -o app
Native Programme
Ein Befehl vom Erlang-Quellcode zum eigenständigen Programm, über LLVM mit Link-Time-Optimierung kompiliert. Auch Escripts.
spawn · send · receive
Erlang-Prozesse
Leichtgewichtige Prozesse mit Garbage Collection pro Prozess auf mehreren Scheduler-Threads.
gen_server · ssl
OTP-Bibliothek
Clause-eigene stdlib, kernel, crypto und ssl mit den Exporten, Ergebnissen und Fehlern von OTP 29.
gen_tcp · file · os
Ports und I/O
Dateien, Unterprozesse und TCP/UDP-Sockets auf einem ereignisgesteuerten I/O-Thread.
--print-types
Typinferenz
Mit O2 entfernen inferierte Typen Laufzeitprüfungen und wählen spezialisierten Code.
clau --shell
Interaktive Shell
Linkt die Erlang-Shell in ein ausführbares Programm: erl_eval, Verlauf und Records, ohne BEAM.
7 Zielplattformen
Plattformübergreifend
Läuft unter Windows x64 und Linux x86-64; Objektdateien für sieben Zielplattformen.
Funktionen im Detail
Frontend
- Erlang/OTP 29-Syntax: Records, Maps, Bitstrings, Comprehensions, Typen und Spezifikationen
- Makros, Includes und bedingte Kompilierung
- Parse-Transforms ohne installiertes Erlang/OTP: ms_transform, qlc, merl und eigene
- ASN.1-Spezifikationen werden wie mit asn1ct zu Modulen kompiliert: BER, DER, PER und UPER
Erlang-Semantik
- Pattern Matching und Guards in Klauseln, case, if und receive
- Records, Funs, maybe sowie List-, Binary- und Map-Comprehensions
- Ausnahmen mit try, catch und Stacktraces
Compiler
- Typinferenz mit Funktionstypen pro Klausel
- LLVM O0, O2 und Os, mit modulübergreifender Link-Time-Optimierung
- O2 entfernt Typprüfungen, die die Inferenz beweist
- O2 inlinet kleine lokale Funktionen, bekannte Funs und lists-Schleifen
- Echte Endaufrufe und tiefe Rekursion
- Parallele Codegenerierung auf jedem Hardware-Thread
Laufzeitumgebung
- C++23-Laufzeitumgebung mit allen Erlang-Termtypen, einschließlich Ganzzahlen beliebiger Genauigkeit
- Prozesse, selektives receive, Links, Monitore und Timer auf mehreren Schedulern
- Heaps pro Prozess mit kopierendem Garbage Collector
- Nebenläufige ETS-Tabellen in C++
OTP-Bibliothek
- Clause-eigene OTP 29-Module mit den Exporten, Ergebnissen und Fehlergründen von OTP
- gen_server, gen_statem, gen_event, supervisor, application und logger
- stdlib: lists, maps, string, binary, json, re, rand und die Collection-Module
- ets, dets, disk_log, zip und erl_tar mit Dateien, wie OTP sie schreibt
- erl_scan, erl_parse, erl_lint, erl_eval, qlc und compile zur Laufzeit, kompilierte Module werden interpretiert
- syntax_tools: erl_syntax, erl_prettypr, epp_dodger und merl
- kernel: file, gen_tcp, gen_udp, inet, inet_res und os
- crypto über OpenSSL mit FIPS-Modus; public_key mit Validierung von Zertifikatspfaden, CRLs und OCSP
- ssl: TLS-1.2- und TLS-1.3-Verbindungen über libssl von OpenSSL
Projekte und Werkzeuge
- Ein clau-Befehl vom Erlang-Quellcode zum nativen Programm
- TOML-Projekte mit SQLite-Build-Caches
- Interaktive Erlang-Shell mit clau --shell
- Debug-Informationen mit -g (CodeView oder DWARF 5) und Profiling mit --profile
- Getestet gegen das Referenz-Erlang/OTP und per Benchmarks mit OTP verglichen
Clause