Erlang/OTP 29, compilado para código nativo
Clause é um compilador AOT para Erlang. Ele pré-processa, analisa e verifica o código Erlang, compila-o via LLVM e gera executáveis nativos com o seu próprio runtime: processos leves, troca de mensagens e coleta de lixo por processo.
Em desenvolvimento: um subconjunto crescente de Erlang já compila e executa. A documentação indica o que funciona e em que o Clause difere do Erlang/OTP.
Funcionalidades
OTP 29
Sintaxe moderna de Erlang
Pré-processador e parser para Erlang/OTP 29: macros, records, records nativos, maps, bitstrings, compreensões, maybe e especificações de tipos.
LLVM
Backend LLVM
Compila para LLVM IR verificado, bitcode ou objetos nativos com O0, O2 ou Os, com variantes de funções especializadas por tipo.
clau -o app
Executáveis nativos
Liga módulos Erlang e o runtime num programa autónomo com o Clang, com um único comando.
spawn · send · receive
Processos Erlang
Processos em threads do escalonador com receive seletivo, tempos limite, links, monitores, nomes registados e sinais de saída.
GC por processo
Memória isolada
Cada processo tem o seu próprio heap, limpo por um coletor de lixo por cópia segundo o design clássico do ERTS.
7 plataformas
Multiplataforma
Execução validada no Windows x64; objetos verificados para Linux x86, x64, ARM e AArch64, Windows x86 e x64, e Apple Silicon.
Funcionalidades em detalhe
Frontend
- Pré-processamento: macros, include, include_lib, compilação condicional e funcionalidades da linguagem
- Sintaxe de Erlang/OTP 29: expressões, padrões, records, bitstrings, tipos e especificações, controlo de fluxo e compreensões
- Verificação de sintaxe, saída do código expandido e árvore sintática indentada
- Diagnósticos de código-fonte em vários ficheiros de entrada
Compilador
- Análise semântica: verificação do subconjunto, ligação de variáveis, resolução de chamadas, tipos declarados e inferidos
- LLVM O0, O2 e Os; objetos, IR e bitcode por módulo; instantâneos de IR anotados com o código Erlang
- Relatórios de tipos: código-fonte anotado com as assinaturas de funções inferidas
- Chamadas de cauda reais para chamadas locais, remotas e mutuamente recursivas
- Uma mensagem notimpl explícita para Erlang válido que precisa de uma funcionalidade ainda não implementada
Runtime
- Biblioteca de runtime em C++23 sem LLVM, ligada a cada programa
- Inteiros de precisão arbitrária, vírgula flutuante, átomos, tuplos, listas, maps, bitstrings, records, funs, pids, portas e referências
- Processos, mensagens, receive seletivo, links, monitores e nomes registados em threads do escalonador
- Heap por processo com coletor de lixo por cópia e binários fora do heap
- Portas para E/S padrão, ficheiros, subprocessos e sockets
- Exceções com try, catch e after, e rastreios de pilha
- io:format com a formatação ~p do OTP; subconjuntos de lists, maps, file e io
Projetos e ferramentas
- Projetos TOML com alvos nomeados, descoberta de código-fonte e opções por alvo
- Projetos iniciais comentados com clau --new-project
- Um único comando clau, do código Erlang ao executável nativo
- Comportamento verificado contra as saídas do Erlang/OTP de referência
Clause