Clause
← All dokumentation

Översatt från det engelska originalet · 06042fa · 2026-10-09 · Läs på engelska

Inbyggda funktioner

Plan 11 step 36 (2026-10-07): bryggan för inbyggda funktioner (builtins) i produktion. Inbyggda funktioner är erlang-funktioner som runtime implementerar i C++. Runtime registrerar dem efter modul, funktion och aritet; genererad kod når dem direkt, via dynamiska anrop och som fun-värden.

Vilka inbyggda funktioner som finns

Bryggans katalog abi::v1::bridge_builtins (builtins.hpp) listar varje inbyggd funktion som både kompilatorn och runtime känner till:

Poster läggs bara till i slutet: en posts index är det nummer som genererad kod skickar till bryggtjänsten. Ett kvalificerat anrop av en inbyggd funktion i katalogen som tillhör en annan modul (io:format(F, A)) anropar också bryggan. Andra erlang-funktioner behåller sin diagnostik: ett direktanrop av en okänd ger unknown module erlang, medan fun erlang:F/A eller fun F/A av en guard-BIF utanför katalogen (node/0) och fun erlang:apply/2,3 rapporterar den otillgängliga förmågan dynamic calls.

Hur anrop når dem

KällaVäg
abs(X), X + Y, erlang:display(X), halt(), error(R)Inline-tjänster, som före bryggan
erlang:function_exported(M, F, A), setelement(I, T, V), A ++ B, A -- B, length(L) i en kropp (inbyggda funktioner i katalogen utan inline-tjänst)Anropas som en funktion: CLAUSE_builtin_frame_v1(context, index) ger den inbyggda funktionens ram, argumenten läggs i registren (portioner)
fun abs/1, fun erlang:'+'/2Extern fun erlang:F/A; registreringen binder den till den inbyggda funktionen
M:F(Args), apply(M, F, Args), fun M:F/A vid körningKodservern söker först en modulexport, sedan en inbyggd funktion

Portioner

Plan 11 step 43A (2026-10-08): inbyggda funktioner vars arbete växer med ett list- eller binary-argument körs i begränsade portioner, likt OTP:s trappande BIF:ar, så att en lång inbyggd funktion inte kan hindra andra processer från att köras (processer).

Inbyggd funktionPortioner
length/1 i en kroppRäknar celler; i en guard förblir den inline-tjänsten, eftersom OTP:s guard-BIF inte trappar
A ++ BSamlar A:s element och bygger sedan kopian på B från dess slut
A -- BSamlar B, sorterar den i exakt ordning (nedifrån-och-upp-mergesort), går igenom A med en binärsökning per element och bygger sedan de behållna elementen; när ingenting tas bort är resultatet A självt
binary_to_list/1Bygger listan från binaryns slut
list_to_binary/1, iolist_to_binary/1Går igenom iolistan på djupet först och skapar sedan binaryn på en gång

Andra inbyggda funktioner körs till slut. Tupelfunktionerna (setelement/3, make_tuple/2,3, tuple_to_list/1, list_to_tuple/1) gör som i OTP: deras arbete begränsas av gränsen för tupelaritet. Övriga konverteringar läser indata som begränsas av gränserna för atomer, heltal och flyttal. Formatering med io:format/1,2 körs till slut (skillnader). Inline-tjänster i loopar (en comprehensions avslutande omvändning) körs till slut som en del av loopen.

Typade inbyggda funktioner

Plan 11 step 41 (2026-10-07): inbyggda funktioner som kontrollerar sina egna argument är C++-funktioner med typade parametrar (typed.hpp), Result Function(ProcessContext &, Parameters...), registrerade med typed_entry<Function>(module, name) (ariteten är antalet parametrar).

Registrering