Clause

Erlang/OTP 29, compilado a código nativo

Clause es un compilador anticipado (AOT) para Erlang. Preprocesa, analiza sintáctica y semánticamente el código Erlang, lo compila mediante LLVM y enlaza ejecutables nativos con su propio runtime: procesos ligeros en varios hilos planificadores, paso de mensajes, puertos y recolección de basura por proceso.

En desarrollo: los programas Erlang/OTP 29 se compilan a ejecutables nativos que ya se ejecutan en Windows y Linux, con stdlib, kernel, crypto y ssl propios de Clause. Pendiente: macOS con Apple Silicon y hardware ARM nativo, los propios conjuntos de pruebas de OTP, las ubicaciones de archivo fuente y línea en las trazas de pila y más optimización; no se admiten la distribución ni la carga de código en caliente. La página de benchmarks muestra la posición de Clause frente a OTP; la documentación indica qué funciona y en qué difiere Clause.

Características

Características en detalle

Frontend

  • Sintaxis de Erlang/OTP 29: records, maps, bitstrings, comprehensions, tipos y especificaciones
  • Macros, includes y compilación condicional
  • Parse transforms sin instalar Erlang/OTP: ms_transform, qlc, merl y las propias
  • Especificaciones ASN.1 compiladas en módulos como lo hace asn1ct: BER, DER, PER y UPER

Semántica de Erlang

  • Coincidencia de patrones y guardas en cláusulas, case, if y receive
  • Records, funs, maybe y comprehensions de listas, binarios y maps
  • Excepciones con try, catch y trazas de pila

Compilador

  • Inferencia de tipos con tipos de función por cláusula
  • LLVM O0, O2 y Os, con optimización en tiempo de enlace entre módulos
  • O2 elimina las comprobaciones de tipos que la inferencia demuestra
  • O2 integra en línea funciones locales pequeñas, funs conocidas y bucles de lists
  • Llamadas de cola propias y recursión profunda
  • Generación de código en paralelo en todos los hilos de hardware

Runtime

  • Runtime en C++23 con todos los tipos de términos de Erlang, incluidos enteros de precisión arbitraria
  • Procesos, receive selectivo, enlaces, monitores y temporizadores en varios planificadores
  • Montículos por proceso con un recolector de basura por copia
  • Tablas ETS concurrentes en C++

Biblioteca de OTP

  • Módulos OTP 29 propios de Clause con las exportaciones, los resultados y los motivos de error de OTP
  • gen_server, gen_statem, gen_event, supervisor, application y logger
  • stdlib: lists, maps, string, binary, json, re, rand y los módulos de colecciones
  • ets, dets, disk_log, zip y erl_tar con archivos tal como OTP los escribe
  • erl_scan, erl_parse, erl_lint, erl_eval, qlc y compile en tiempo de ejecución, con los módulos compilados interpretados
  • syntax_tools: erl_syntax, erl_prettypr, epp_dodger y merl
  • kernel: file, gen_tcp, gen_udp, inet, inet_res y os
  • crypto sobre OpenSSL con modo FIPS; public_key con validación de rutas de certificados, CRL y OCSP
  • ssl: conexiones TLS 1.2 y 1.3 sobre libssl de OpenSSL

Proyectos y herramientas

  • Un solo comando clau del código fuente Erlang a un ejecutable nativo
  • Proyectos TOML con cachés de compilación SQLite
  • Shell interactiva de Erlang con clau --shell
  • Información de depuración con -g (CodeView o DWARF 5) y perfilado con --profile
  • Probado frente al Erlang/OTP de referencia y comparado con OTP en benchmarks