Clause
← Toute la documentation

Traduit de l'original anglais · 06042fa · 2026-10-09 · Lire en anglais

Builtins

Plan 11 step 36 (2026-10-07) : le pont de builtins de production. Les builtins sont des fonctions erlang que le runtime implémente en C++. Le runtime les enregistre par module, fonction et arité ; le code généré les atteint directement, par des appels dynamiques et sous forme de valeurs fun.

Quelles builtins existent

Le catalogue du pont abi::v1::bridge_builtins (builtins.hpp) liste toutes les builtins connues à la fois du compilateur et du runtime :

Les entrées sont seulement ajoutées en fin : l'index d'une entrée est le numéro que le code généré transmet au service du pont. Un appel qualifié d'une builtin du catalogue appartenant à un autre module (io:format(F, A)) appelle aussi le pont. Les autres fonctions erlang gardent leurs diagnostics : un appel direct d'une fonction inconnue donne unknown module erlang, fun erlang:F/A ou fun F/A d'une BIF de garde hors du catalogue (node/0) et fun erlang:apply/2,3 signalent la capacité indisponible dynamic calls.

Comment les appels les atteignent

SourceChemin
abs(X), X + Y, erlang:display(X), halt(), error(R)Services en ligne, comme avant le pont
erlang:function_exported(M, F, A), setelement(I, T, V), A ++ B, A -- B, length(L) dans un corps (builtins du catalogue sans service en ligne)Entrées comme une fonction : CLAUSE_builtin_frame_v1(context, index) donne le cadre de la builtin, les arguments vont dans les registres (portions)
fun abs/1, fun erlang:'+'/2Fun externe erlang:F/A ; l'enregistrement la lie à la builtin
M:F(Args), apply(M, F, Args), fun M:F/A à l'exécutionLe serveur de code cherche d'abord un export du module, puis une builtin

Portions

Plan 11 step 43A (2026-10-08) : les builtins dont le travail croît avec un argument liste ou binary s'exécutent par portions bornées, comme les BIF d'OTP qui font un trap, afin qu'une builtin longue ne puisse pas empêcher les autres processus de s'exécuter (processus).

BuiltinPortions
length/1 dans un corpsCompte les cellules ; dans une garde, elle reste le service en ligne, car la BIF de garde d'OTP ne fait pas de trap
A ++ BCollecte les éléments de A, puis construit la copie sur B en partant de la fin
A -- BCollecte B, le trie selon l'ordre exact (tri fusion ascendant), parcourt A avec une recherche dichotomique par élément, puis construit les éléments conservés ; si rien n'est retiré, le résultat est A lui-même
binary_to_list/1Construit la liste depuis la fin du binary
list_to_binary/1, iolist_to_binary/1Parcourt l'iolist en profondeur d'abord, puis crée le binary d'un coup

Les autres builtins s'exécutent jusqu'au bout. Les builtins de tuple (setelement/3, make_tuple/2,3, tuple_to_list/1, list_to_tuple/1) font comme dans OTP : leur travail est borné par la limite d'arité des tuples. Les conversions restantes lisent des entrées bornées par les limites des atomes, des entiers et des flottants. Le formatage avec io:format/1,2 s'exécute jusqu'au bout (différences). Les services en ligne des boucles (l'inversion finale d'une comprehension) s'exécutent jusqu'au bout dans le cadre de la boucle.

Builtins typées

Plan 11 step 41 (2026-10-07) : les builtins qui vérifient elles-mêmes leurs arguments sont des fonctions C++ à paramètres typés (typed.hpp), Result Function(ProcessContext &, Parameters...), enregistrées avec typed_entry<Function>(module, name) (l'arité est le nombre de paramètres).

Enregistrement