Clause

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

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