Clause

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

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