Clause
← Toda la documentación

Traducido del original en inglés · 06042fa · 2026-10-09 · Leer en inglés

Builtins

Plan 11 step 36 (2026-10-07): el puente de producción para builtins. Los builtins son funciones de erlang que el runtime implementa en C++. El runtime los registra por módulo, función y aridad; el código generado los alcanza directamente, mediante llamadas dinámicas y como valores fun.

Qué builtins existen

El catálogo del puente abi::v1::bridge_builtins (builtins.hpp) enumera todos los builtins que conocen tanto el compilador como el runtime:

Las entradas solo se añaden al final: el índice de una entrada es el número que el código generado pasa al servicio del puente. Una llamada cualificada a un builtin del catálogo de otro módulo (io:format(F, A)) también llama al puente. Las demás funciones de erlang mantienen sus diagnósticos: una llamada directa a una desconocida es unknown module erlang; fun erlang:F/A o fun F/A de un BIF de guard fuera del catálogo (node/0) y fun erlang:apply/2,3 informan de que la capacidad dynamic calls no está disponible.

Cómo los alcanzan las llamadas

Código fuenteVía
abs(X), X + Y, erlang:display(X), halt(), error(R)Servicios en línea, como antes del puente
erlang:function_exported(M, F, A), setelement(I, T, V), A ++ B, A -- B, length(L) en un cuerpo (builtins del catálogo sin servicio en línea)Se entra en ellos como en una función: CLAUSE_builtin_frame_v1(context, index) da el marco del builtin y los argumentos van en los registros (porciones)
fun abs/1, fun erlang:'+'/2Fun externo erlang:F/A; el registro lo vincula al builtin
M:F(Args), apply(M, F, Args), fun M:F/A en tiempo de ejecuciónEl servidor de código busca primero una exportación del módulo y después un builtin

Porciones

Plan 11 step 43A (2026-10-08): los builtins cuyo trabajo crece con un argumento lista o binary se ejecutan en porciones acotadas, como los BIF de OTP que hacen trap, de modo que un builtin largo no puede impedir que otros procesos se ejecuten (procesos).

BuiltinPorciones
length/1 en un cuerpoCuenta celdas; en un guard sigue siendo el servicio en línea, ya que el BIF de guard de OTP no hace trap
A ++ BRecoge los elementos de A y después construye la copia sobre B desde su final
A -- BRecoge B, lo ordena por orden exacto (ordenación por mezcla ascendente), recorre A con una búsqueda binaria por elemento y después construye los elementos conservados; cuando no se elimina nada, el resultado es el propio A
binary_to_list/1Construye la lista desde el final del binary
list_to_binary/1, iolist_to_binary/1Recorre la iolist en profundidad y después crea el binary de una vez

Los demás builtins se ejecutan hasta el final. Los builtins de tuplas (setelement/3, make_tuple/2,3, tuple_to_list/1, list_to_tuple/1) se comportan como en OTP: su trabajo está acotado por el límite de aridad de tuplas. Las conversiones restantes leen entradas acotadas por los límites de átomos, enteros y flotantes. El formateo con io:format/1,2 se ejecuta hasta el final (diferencias). Los servicios en línea de los bucles (la inversión final de una comprehension) se ejecutan hasta el final como parte del bucle.

Builtins tipados

Plan 11 step 41 (2026-10-07): los builtins que comprueban sus propios argumentos son funciones C++ con parámetros tipados (typed.hpp), Result Function(ProcessContext &, Parameters...), registrados con typed_entry<Function>(module, name) (la aridad es el número de parámetros).

Registro