Clause

Erlang/OTP 29, kompilerat till maskinkod

Clause är en AOT-kompilator för Erlang. Den förbehandlar, parsar och analyserar Erlang-källkod, kompilerar den via LLVM och länkar körbara program med en egen runtime: lättviktsprocesser på flera schemaläggartrådar, meddelandeöverföring, portar och skräpsamling per process.

Under utveckling: Erlang/OTP 29-program kompileras till körbara program som redan idag körs på Windows och Linux, med Clauses egna stdlib, kernel, crypto och ssl. Återstår: macOS med Apple Silicon och riktig ARM-hårdvara, OTP:s egna testsviter, käll- och radpositioner i stackspår och mer optimering; distribution och kodladdning under körning stöds inte. Sidan med prestandatester visar var Clause står jämfört med OTP; dokumentationen beskriver vad som fungerar och var Clause skiljer sig.

Funktioner

Funktioner i detalj

Frontend

  • Erlang/OTP 29-syntax: records, maps, bitsträngar, comprehensions, typer och specifikationer
  • Makron, includes och villkorlig kompilering
  • Parse transforms utan installerad Erlang/OTP: ms_transform, qlc, merl och egna
  • ASN.1-specifikationer kompilerade till moduler som asn1ct gör: BER, DER, PER och UPER

Erlang-semantik

  • Mönstermatchning och guards i klausuler, case, if och receive
  • Records, funs, maybe och list-, binär- och map-comprehensions
  • Undantag med try, catch och stackspår

Kompilator

  • Typhärledning med funktionstyper per klausul
  • LLVM O0, O2 och Os, med länktidsoptimering över moduler
  • O2 tar bort typkontroller som härledningen bevisar
  • O2 infogar små lokala funktioner, kända funs och lists-loopar
  • Riktiga svansanrop och djup rekursion
  • Parallell kodgenerering på varje hårdvarutråd

Runtime

  • C++23-runtime med alla Erlang-termtyper, inklusive heltal med godtycklig precision
  • Processer, selektiv receive, länkar, monitorer och timers på flera schemaläggare
  • Heapar per process med kopierande skräpsamlare
  • Samtidiga ETS-tabeller i C++

OTP-bibliotek

  • Clauses egna OTP 29-moduler med OTP:s exporter, resultat och felorsaker
  • gen_server, gen_statem, gen_event, supervisor, application och logger
  • stdlib: lists, maps, string, binary, json, re, rand och samlingsmodulerna
  • ets, dets, disk_log, zip och erl_tar med filer som OTP skriver dem
  • erl_scan, erl_parse, erl_lint, erl_eval, qlc och compile vid körning, där kompilerade moduler tolkas
  • syntax_tools: erl_syntax, erl_prettypr, epp_dodger och merl
  • kernel: file, gen_tcp, gen_udp, inet, inet_res och os
  • crypto via OpenSSL med FIPS-läge; public_key med validering av certifikatkedjor, CRL och OCSP
  • ssl: TLS 1.2- och 1.3-anslutningar via OpenSSL:s libssl

Projekt och verktyg

  • Ett clau-kommando från Erlang-källkod till ett körbart program
  • TOML-projekt med SQLite-byggcache
  • Interaktivt Erlang-skal med clau --shell
  • Felsökningsinformation med -g (CodeView eller DWARF 5) och profilering med --profile
  • Testad mot referensimplementationen Erlang/OTP och jämförd med OTP i benchmarks