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, meddelandeöverföring och skräpsamling per process.
Under utveckling: en växande delmängd av Erlang kompileras och körs redan idag. Dokumentationen beskriver vad som fungerar och var Clause skiljer sig från Erlang/OTP.
Funktioner
OTP 29
Modern Erlang-syntax
Preprocessor och parser för Erlang/OTP 29: makron, records, native records, maps, bitsträngar, comprehensions, maybe och typspecifikationer.
LLVM
LLVM-backend
Kompilerar till verifierad LLVM IR, bitkod eller objektfiler med O0, O2 eller Os, med typspecialiserade funktionsvarianter.
clau -o app
Körbara program
Länkar Erlang-moduler och runtime till ett fristående program med Clang, med ett enda kommando.
spawn · send · receive
Erlang-processer
Processer på schemaläggartrådar med selektiv receive, tidsgränser, länkar, monitorer, registrerade namn och exit-signaler.
GC per process
Isolerat minne
Varje process äger sin heap, som städas av en kopierande skräpsamlare enligt den klassiska ERTS-designen.
7 plattformar
Plattformsoberoende
Körning validerad på Windows x64; objektfiler kontrollerade för Linux x86, x64, ARM och AArch64, Windows x86 och x64 samt Apple Silicon.
Funktioner i detalj
Frontend
- Förbehandling: makron, include, include_lib, villkorlig kompilering och språkfunktioner
- Erlang/OTP 29-syntax: uttryck, mönster, records, bitsträngar, typer och specifikationer, kontrollflöde och comprehensions
- Syntaxkontroll, utskrift av expanderad källkod och ett indenterat syntaxträd
- Diagnostik i källkoden över flera indatafiler
Kompilator
- Semantisk analys: kontroll av delmängden, variabelbindningar, anropsupplösning, deklarerade och härledda typer
- LLVM O0, O2 och Os; objektfiler, IR och bitkod per modul; IR-ögonblicksbilder med Erlang-källkod
- Typrapporter: källkod med härledda funktionssignaturer
- Riktiga svansanrop för lokala, fjärr- och ömsesidigt rekursiva anrop
- Ett tydligt notimpl-meddelande för giltig Erlang som kräver en funktion som ännu inte finns
Runtime
- Runtime-bibliotek i C++23 utan LLVM, länkat i varje program
- Heltal med godtycklig precision, flyttal, atomer, tupler, listor, maps, bitsträngar, records, funs, pids, portar och referenser
- Processer, meddelanden, selektiv receive, länkar, monitorer och registrerade namn på schemaläggartrådar
- Heap per process med kopierande skräpsamlare och binärer utanför heapen
- Portar för standard-I/O, filer, underprocesser och sockets
- Undantag med try, catch och after, samt stackspår
- io:format med OTP:s ~p-formatering; delmängder av lists, maps, file och io
Projekt och verktyg
- TOML-projekt med namngivna mål, hittande av källfiler och inställningar per mål
- Kommenterade startprojekt med clau --new-project
- Ett clau-kommando från Erlang-källkod till körbart program
- Beteendet kontrolleras mot utdata från referensversionen av Erlang/OTP
Clause