Erlang/OTP 29, compilé en code natif
Clause est un compilateur AOT pour Erlang. Il prétraite, analyse et vérifie le code Erlang, le compile via LLVM et produit des exécutables natifs liés à son propre runtime : processus légers, passage de messages et ramasse-miettes par processus.
En cours de développement : un sous-ensemble croissant d'Erlang se compile et s'exécute déjà. La documentation indique ce qui fonctionne et en quoi Clause diffère d'Erlang/OTP.
Fonctionnalités
OTP 29
Syntaxe Erlang moderne
Préprocesseur et parseur pour Erlang/OTP 29 : macros, records, records natifs, maps, bitstrings, compréhensions, maybe et spécifications de types.
LLVM
Backend LLVM
Compile en LLVM IR vérifié, en bitcode ou en objets natifs avec O0, O2 ou Os, avec des variantes de fonctions spécialisées par type.
clau -o app
Exécutables natifs
Lie les modules Erlang et le runtime en un programme autonome avec Clang, en une seule commande.
spawn · send · receive
Processus Erlang
Processus sur des threads ordonnanceurs avec receive sélectif, délais d'attente, liens, moniteurs, noms enregistrés et signaux de sortie.
GC par processus
Mémoire isolée
Chaque processus possède son tas, nettoyé par un ramasse-miettes par copie selon la conception classique d'ERTS.
7 cibles
Multiplateforme
Exécution validée sous Windows x64 ; objets vérifiés pour Linux x86, x64, ARM et AArch64, Windows x86 et x64, et Apple Silicon.
Fonctionnalités en détail
Frontend
- Prétraitement : macros, include, include_lib, compilation conditionnelle et fonctionnalités du langage
- Syntaxe Erlang/OTP 29 : expressions, motifs, records, bitstrings, types et spécifications, structures de contrôle et compréhensions
- Vérification de la syntaxe, affichage du code expansé et arbre syntaxique indenté
- Diagnostics sur le code source de plusieurs fichiers d'entrée
Compilateur
- Analyse sémantique : vérification du sous-ensemble, liaison des variables, résolution des appels, types déclarés et inférés
- LLVM O0, O2 et Os ; objets, IR et bitcode par module ; instantanés d'IR annotés avec le code Erlang
- Rapports de types : code source annoté avec les signatures de fonctions inférées
- Vrais appels terminaux pour les appels locaux, distants et mutuellement récursifs
- Un message notimpl explicite pour du code Erlang valide qui nécessite une fonctionnalité pas encore implémentée
Runtime
- Bibliothèque runtime en C++23 sans LLVM, liée à chaque programme
- Entiers en précision arbitraire, flottants, atomes, tuples, listes, maps, bitstrings, records, funs, pids, ports et références
- Processus, messages, receive sélectif, liens, moniteurs et noms enregistrés sur des threads ordonnanceurs
- Tas par processus avec ramasse-miettes par copie et binaires hors tas
- Ports pour les E/S standard, les fichiers, les sous-processus et les sockets
- Exceptions avec try, catch et after, et traces de pile
- io:format avec la mise en forme ~p d'OTP ; sous-ensembles de lists, maps, file et io
Projets et outils
- Projets TOML avec cibles nommées, découverte des sources et options par cible
- Projets de départ commentés avec clau --new-project
- Une seule commande clau, du code Erlang à l'exécutable natif
- Comportement vérifié par rapport aux sorties de l'Erlang/OTP de référence
Clause