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, paso de mensajes y recolección de basura por proceso.
En desarrollo: un subconjunto creciente de Erlang ya se compila y ejecuta. La documentación indica qué funciona y en qué difiere Clause de Erlang/OTP.
Características
OTP 29
Sintaxis moderna de Erlang
Preprocesador y parser para Erlang/OTP 29: macros, records, records nativos, maps, bitstrings, comprehensions, maybe y especificaciones de tipos.
LLVM
Backend LLVM
Compila a LLVM IR verificado, bitcode u objetos nativos con O0, O2 u Os, con variantes de funciones especializadas por tipo.
clau -o app
Ejecutables nativos
Enlaza módulos Erlang y el runtime en un programa autónomo con Clang, en un solo comando.
spawn · send · receive
Procesos Erlang
Procesos en hilos planificadores con receive selectivo, tiempos de espera, enlaces, monitores, nombres registrados y señales de salida.
GC por proceso
Memoria aislada
Cada proceso tiene su propio heap, gestionado por un recolector de basura por copia según el diseño clásico de ERTS.
7 plataformas
Multiplataforma
Ejecución validada en Windows x64; objetos comprobados para Linux x86, x64, ARM y AArch64, Windows x86 y x64, y Apple Silicon.
Características en detalle
Frontend
- Preprocesado: macros, include, include_lib, compilación condicional y características del lenguaje
- Sintaxis de Erlang/OTP 29: expresiones, patrones, records, bitstrings, tipos y especificaciones, control de flujo y comprehensions
- Comprobación de sintaxis, salida del código expandido y vista indentada del árbol sintáctico
- Diagnósticos de código fuente en varios archivos de entrada
Compilador
- Análisis semántico: comprobación del subconjunto, ligado de variables, resolución de llamadas, tipos declarados e inferidos
- LLVM O0, O2 y Os; objetos, IR y bitcode por módulo; instantáneas de IR anotadas con el código Erlang
- Informes de tipos: código fuente anotado con las firmas de función inferidas
- Llamadas de cola reales para llamadas locales, remotas y mutuamente recursivas
- Un mensaje notimpl explícito para Erlang válido que requiere una característica aún no implementada
Runtime
- Biblioteca de runtime en C++23 sin LLVM, enlazada en cada programa
- Enteros de precisión arbitraria, flotantes, átomos, tuplas, listas, maps, bitstrings, records, funs, pids, puertos y referencias
- Procesos, mensajes, receive selectivo, enlaces, monitores y nombres registrados en hilos planificadores
- Heaps por proceso con recolector de basura por copia y binarios fuera del heap
- Puertos para E/S estándar, archivos, subprocesos y sockets
- Excepciones con try, catch y after, y trazas de pila
- io:format con el formato ~p de OTP; subconjuntos de lists, maps, file e io
Proyectos y herramientas
- Proyectos TOML con objetivos con nombre, descubrimiento de fuentes y opciones por objetivo
- Proyectos iniciales comentados con clau --new-project
- Un solo comando clau del código Erlang a un ejecutable nativo
- Comportamiento comprobado contra las salidas de Erlang/OTP de referencia
Clause