
Erlang/OTP 29, compilado para código nativo
Clause é um compilador AOT para Erlang. 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 em várias threads do escalonador, troca de mensagens, portas e recolha de lixo por processo.
Em desenvolvimento: programas Erlang/OTP 29 compilam para executáveis nativos que já executam em Windows e Linux, com stdlib, kernel, crypto e ssl próprios do Clause. Falta ainda: macOS com Apple Silicon e hardware ARM nativo, os conjuntos de testes do próprio OTP, ficheiros de código-fonte e linhas nos rastos de pilha e mais otimização; a distribuição e o carregamento de código a quente não são suportados. A página de benchmarks mostra a posição do Clause face ao OTP; a documentação indica o que funciona e em que o Clause difere.
Funcionalidades
OTP 29
Sintaxe moderna de Erlang
Pré-processa e analisa código-fonte Erlang/OTP 29, incluindo records nativos.
1,49× mais rápido
Velocidade face ao OTP
Média geométrica de 31 kernels de teste, Clause -O2 face ao JIT da BEAM.
clau -o app
Executáveis nativos
Um comando do código-fonte Erlang a um programa autónomo, compilado através do LLVM com otimização em tempo de ligação. Escripts também.
spawn · send · receive
Processos Erlang
Processos leves com recolha de lixo por processo em várias threads do escalonador.
gen_server · ssl
Biblioteca OTP
stdlib, kernel, crypto e ssl próprios do Clause com as exportações, resultados e erros do OTP 29.
gen_tcp · file · os
Portas e E/S
Ficheiros, subprocessos e sockets TCP/UDP numa única thread de E/S orientada a eventos.
--print-types
Inferência de tipos
Em O2, os tipos inferidos eliminam verificações em runtime e selecionam código especializado.
clau --shell
Shell interativa
Liga a shell de Erlang a um executável: erl_eval, histórico e records, sem BEAM.
7 plataformas
Multiplataforma
Corre em Windows x64 e Linux x86-64; objetos para sete plataformas.
Funcionalidades em detalhe
Frontend
- Sintaxe Erlang/OTP 29: records, maps, bitstrings, comprehensions, tipos e especificações
- Macros, includes e compilação condicional
- Parse transforms sem instalar Erlang/OTP: ms_transform, qlc, merl e as próprias
- Especificações ASN.1 compiladas em módulos como faz o asn1ct: BER, DER, PER e UPER
Semântica de Erlang
- Correspondência de padrões e guardas em cláusulas, case, if e receive
- Records, funs, maybe e comprehensions de listas, binários e maps
- Exceções com try, catch e stack traces
Compilador
- Inferência de tipos com tipos de funções por cláusula
- LLVM O0, O2 e Os, com otimização em tempo de ligação entre módulos
- O2 elimina verificações de tipos provadas pela inferência
- O2 integra em linha pequenas funções locais, funs conhecidas e ciclos de lists
- Chamadas de cauda próprias e recursão profunda
- Geração paralela de código em todas as threads de hardware
Runtime
- Runtime C++23 com todos os tipos de termos Erlang, incluindo inteiros de precisão arbitrária
- Processos, receive seletivo, links, monitores e temporizadores em vários escalonadores
- Heaps por processo com um recoletor de lixo por cópia
- Tabelas ETS concorrentes em C++
Biblioteca OTP
- Módulos OTP 29 próprios do Clause com as exportações, resultados e razões de erro do OTP
- gen_server, gen_statem, gen_event, supervisor, application e logger
- stdlib: lists, maps, string, binary, json, re, rand e os módulos de coleções
- ets, dets, disk_log, zip e erl_tar com ficheiros tal como o OTP os escreve
- erl_scan, erl_parse, erl_lint, erl_eval, qlc e compile em runtime, com os módulos compilados interpretados
- syntax_tools: erl_syntax, erl_prettypr, epp_dodger e merl
- kernel: file, gen_tcp, gen_udp, inet, inet_res e os
- crypto sobre OpenSSL com modo FIPS; public_key com validação de caminhos de certificados, CRL e OCSP
- ssl: ligações TLS 1.2 e 1.3 sobre a libssl do OpenSSL
Projetos e ferramentas
- Um único comando clau do código-fonte Erlang a um executável nativo
- Projetos TOML com caches de compilação SQLite
- Shell interativa de Erlang com clau --shell
- Informação de depuração com -g (CodeView ou DWARF 5) e profiling com --profile
- Testado face ao Erlang/OTP de referência e comparado com o OTP em benchmarks
Clause