Clause
← Gesamte Dokumentation

Übersetzt aus dem englischen Original · 06042fa · 2026-10-09 · Auf Englisch lesen

Builtins

Plan 11 step 36 (2026-10-07): die produktive Builtin-Brücke. Builtins sind erlang-Funktionen, die die Runtime in C++ implementiert. Die Runtime registriert sie nach Modul, Funktion und Stelligkeit; generierter Code erreicht sie direkt, über dynamische Aufrufe und als Fun-Werte.

Welche Builtins es gibt

Der Brückenkatalog abi::v1::bridge_builtins (builtins.hpp) führt jedes Builtin auf, das sowohl der Compiler als auch die Runtime kennen:

Einträge werden nur angehängt: Der Index eines Eintrags ist die Nummer, die generierter Code an den Brückendienst übergibt. Ein qualifizierter Aufruf eines Katalog-Builtins eines anderen Moduls (io:format(F, A)) ruft ebenfalls die Brücke auf. Andere erlang-Funktionen behalten ihre Diagnosen: ein direkter Aufruf einer unbekannten ergibt unknown module erlang; fun erlang:F/A oder fun F/A eines Guard-BIF außerhalb des Katalogs (node/0) sowie fun erlang:apply/2,3 melden die nicht verfügbare Fähigkeit dynamic calls.

Wie Aufrufe sie erreichen

QuelleWeg
abs(X), X + Y, erlang:display(X), halt(), error(R)Inline-Dienste, wie vor der Brücke
erlang:function_exported(M, F, A), setelement(I, T, V), A ++ B, A -- B, length(L) in einem Rumpf (Katalog-Builtins ohne Inline-Dienst)Wie eine Funktion betreten: CLAUSE_builtin_frame_v1(context, index) liefert den Frame des Builtins, die Argumente kommen in die Register (Portionen)
fun abs/1, fun erlang:'+'/2Externe Fun erlang:F/A; die Registrierung bindet sie an das Builtin
M:F(Args), apply(M, F, Args), fun M:F/A zur LaufzeitDer Code-Server sucht zuerst einen Export des Moduls, dann ein Builtin

Portionen

Plan 11 step 43A (2026-10-08): Builtins, deren Arbeit mit einem Listen- oder Binary-Argument wächst, laufen in begrenzten Portionen, wie die trappenden BIFs von OTP, sodass ein langes Builtin andere Prozesse nicht am Laufen hindern kann (Prozesse).

BuiltinPortionen
length/1 in einem RumpfZählt Zellen; in einem Guard bleibt es der Inline-Dienst, da das Guard-BIF von OTP nicht trappt
A ++ BSammelt die Elemente von A und baut dann die Kopie von ihrem Ende her auf B auf
A -- BSammelt B, sortiert es nach exakter Ordnung (Bottom-up-Mergesort), durchsucht A mit einer binären Suche pro Element und baut dann die behaltenen Elemente; wird nichts entfernt, ist das Ergebnis A selbst
binary_to_list/1Baut die Liste vom Ende des Binary her
list_to_binary/1, iolist_to_binary/1Durchläuft die Iolist in Tiefensuche und erzeugt dann das Binary auf einmal

Andere Builtins laufen bis zum Ende. Die Tupel-Builtins (setelement/3, make_tuple/2,3, tuple_to_list/1, list_to_tuple/1) verhalten sich wie in OTP: Ihre Arbeit ist durch die Grenze der Tupelstelligkeit beschränkt. Die übrigen Konvertierungen lesen Eingaben, die durch die Grenzen für Atome, Ganzzahlen und Gleitkommazahlen beschränkt sind. Formatieren mit io:format/1,2 läuft bis zum Ende (Unterschiede). Inline-Dienste von Schleifen (das abschließende Umkehren einer Comprehension) laufen als Teil der Schleife bis zum Ende.

Typisierte Builtins

Plan 11 step 41 (2026-10-07): Builtins, die ihre eigenen Argumente prüfen, sind C++-Funktionen mit typisierten Parametern (typed.hpp), Result Function(ProcessContext &, Parameters...), registriert mit typed_entry<Function>(module, name) (die Stelligkeit ist die Parameteranzahl).

Registrierung