Clause
← Toda a documentação

Traduzido do original em inglês · 06042fa · 2026-10-09 · Ler em inglês

Builtins

Plano 11, step 36 (2026-10-07): a ponte de builtins de produção. Os builtins são funções erlang que o runtime implementa em C++. O runtime regista-os por módulo, função e aridade; o código gerado chega a eles diretamente, através de chamadas dinâmicas e como valores fun.

Que builtins existem

O catálogo da ponte abi::v1::bridge_builtins (builtins.hpp) lista todos os builtins que o compilador e o runtime conhecem:

As entradas são apenas acrescentadas: o índice de uma entrada é o número que o código gerado passa ao serviço da ponte. Uma chamada qualificada de um builtin do catálogo de outro módulo (io:format(F, A)) também chama a ponte. As restantes funções erlang mantêm os seus diagnósticos: uma chamada direta de uma desconhecida dá unknown module erlang; fun erlang:F/A ou fun F/A de uma guard BIF fora do catálogo (node/0) e fun erlang:apply/2,3 indicam a capacidade dynamic calls indisponível.

Como as chamadas chegam até eles

OrigemCaminho
abs(X), X + Y, erlang:display(X), halt(), error(R)Serviços inline, como antes da ponte
erlang:function_exported(M, F, A), setelement(I, T, V), A ++ B, A -- B, length(L) num corpo (builtins do catálogo sem serviço inline)Entrada como numa função: CLAUSE_builtin_frame_v1(context, index) dá o frame do builtin, os argumentos vão nos registos (porções)
fun abs/1, fun erlang:'+'/2Fun externa erlang:F/A; o registo associa-a ao builtin
M:F(Args), apply(M, F, Args), fun M:F/A em tempo de execuçãoO code server procura primeiro uma exportação do módulo e depois um builtin

Porções

Plano 11, step 43A (2026-10-08): os builtins cujo trabalho cresce com um argumento lista ou binary correm em porções limitadas, como as BIFs com trap do OTP, para que um builtin demorado não impeça os outros processos de correr (processos).

BuiltinPorções
length/1 num corpoConta células; numa guard mantém-se o serviço inline, porque a guard BIF do OTP não faz trap
A ++ BRecolhe os elementos de A e depois constrói a cópia sobre B a partir do fim
A -- BRecolhe B, ordena-o pela ordem exata (merge sort ascendente), percorre A com uma pesquisa binária por elemento e depois constrói os elementos mantidos; quando nada é removido, o resultado é o próprio A
binary_to_list/1Constrói a lista a partir do fim do binary
list_to_binary/1, iolist_to_binary/1Percorre a iolist em profundidade e depois cria o binary de uma vez

Os restantes builtins correm até ao fim. Os builtins de tuplos (setelement/3, make_tuple/2,3, tuple_to_list/1, list_to_tuple/1) fazem como no OTP: o seu trabalho está limitado pelo limite de aridade dos tuplos. As restantes conversões leem entradas limitadas pelos limites de átomos, inteiros e floats. A formatação com io:format/1,2 corre até ao fim (diferenças). Os serviços inline de ciclos (a inversão final de uma comprehension) correm até ao fim como parte do ciclo.

Builtins tipados

Plano 11, step 41 (2026-10-07): os builtins que verificam os seus próprios argumentos são funções C++ com parâmetros tipados (typed.hpp), Result Function(ProcessContext &, Parameters...), registadas com typed_entry<Function>(module, name) (a aridade é o número de parâmetros).

Registo