Clause

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 sur plusieurs threads ordonnanceurs, passage de messages, ports et ramasse-miettes par processus.

En cours de développement : les programmes Erlang/OTP 29 se compilent déjà en exécutables natifs qui s'exécutent sous Windows et Linux, avec les propres stdlib, kernel, crypto et ssl de Clause. Reste à venir : macOS Apple Silicon et le matériel ARM natif, les suites de tests d'OTP, les fichiers source et numéros de ligne dans les traces de pile et davantage d'optimisation ; la distribution et le chargement de code à chaud ne sont pas pris en charge. La page des benchmarks montre où se situe Clause par rapport à OTP ; la documentation indique ce qui fonctionne et en quoi Clause diffère.

Fonctionnalités

Fonctionnalités en détail

Frontend

  • Syntaxe Erlang/OTP 29 : records, maps, bitstrings, comprehensions, types et spécifications
  • Macros, inclusions et compilation conditionnelle
  • Parse transforms sans installation d'Erlang/OTP : ms_transform, qlc, merl et les vôtres
  • Spécifications ASN.1 compilées en modules comme le fait asn1ct : BER, DER, PER et UPER

Sémantique Erlang

  • Filtrage par motif et gardes dans les clauses, case, if et receive
  • Records, funs, maybe et comprehensions de listes, binaires et maps
  • Exceptions avec try, catch et traces de pile

Compilateur

  • Inférence de types avec des types de fonctions par clause
  • LLVM O0, O2 et Os, avec optimisation à l'édition de liens entre modules
  • O2 supprime les vérifications de types prouvées par l'inférence
  • O2 intègre en ligne les petites fonctions locales, les funs connues et les boucles de lists
  • Vrais appels terminaux et récursion profonde
  • Génération de code en parallèle sur chaque thread matériel

Runtime

  • Runtime C++23 avec tous les types de termes Erlang, entiers en précision arbitraire compris
  • Processus, receive sélectif, liens, moniteurs et timers sur plusieurs ordonnanceurs
  • Tas par processus avec un ramasse-miettes par copie
  • Tables ETS concurrentes en C++

Bibliothèque OTP

  • Les propres modules OTP 29 de Clause, avec les exports, résultats et raisons d'erreur d'OTP
  • gen_server, gen_statem, gen_event, supervisor, application et logger
  • stdlib : lists, maps, string, binary, json, re, rand et les modules de collections
  • ets, dets, disk_log, zip et erl_tar avec des fichiers tels qu'OTP les écrit
  • erl_scan, erl_parse, erl_lint, erl_eval, qlc et compile à l'exécution, les modules compilés étant interprétés
  • syntax_tools : erl_syntax, erl_prettypr, epp_dodger et merl
  • kernel : file, gen_tcp, gen_udp, inet, inet_res et os
  • crypto avec OpenSSL et mode FIPS ; public_key avec validation des chemins de certificats, CRL et OCSP
  • ssl : connexions TLS 1.2 et 1.3 via la libssl d'OpenSSL

Projets et outils

  • Une seule commande clau du source Erlang à un exécutable natif
  • Projets TOML avec caches de compilation SQLite
  • Shell Erlang interactif avec clau --shell
  • Informations de débogage avec -g (CodeView ou DWARF 5) et profilage avec --profile
  • Testé face à l'Erlang/OTP de référence et comparé à OTP par des benchmarks