Clause

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

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