Clause
← Уся документація

Перекладено з англійського оригіналу · 06042fa · 2026-10-09 · Читати англійською

Вбудовані функції

План 11, step 36 (2026-10-07): робочий міст вбудованих функцій (builtins). Вбудовані функції — це функції erlang, які runtime реалізує мовою C++. Runtime реєструє їх за модулем, функцією та арністю; згенерований код досягає їх безпосередньо, через динамічні виклики та як значення fun.

Які вбудовані функції існують

Каталог мосту abi::v1::bridge_builtins (builtins.hpp) перелічує кожну вбудовану функцію, яку знають і компілятор, і runtime:

Записи лише дописуються в кінець: індекс запису — це число, яке згенерований код передає сервісу мосту. Кваліфікований виклик вбудованої функції з каталогу, що належить іншому модулю (io:format(F, A)), також викликає міст. Інші функції erlang зберігають свою діагностику: прямий виклик невідомої дає unknown module erlang, а fun erlang:F/A або fun F/A для guard BIF поза каталогом (node/0) і fun erlang:apply/2,3 повідомляють про недоступну можливість dynamic calls.

Як виклики їх досягають

Вихідний кодШлях
abs(X), X + Y, erlang:display(X), halt(), error(R)Вбудовані сервіси, як і до появи мосту
erlang:function_exported(M, F, A), setelement(I, T, V), A ++ B, A -- B, length(L) у тілі (вбудовані функції каталогу без вбудованого сервісу)Вхід як у функцію: CLAUSE_builtin_frame_v1(context, index) дає фрейм вбудованої функції, аргументи передаються в регістрах (порції)
fun abs/1, fun erlang:'+'/2Зовнішній fun erlang:F/A; реєстрація прив'язує його до вбудованої функції
M:F(Args), apply(M, F, Args), fun M:F/A під час виконанняСервер коду спершу шукає експорт модуля, потім вбудовану функцію

Порції

План 11, step 43A (2026-10-08): вбудовані функції, робота яких зростає зі списковим або binary аргументом, виконуються обмеженими порціями, як переривані (trapping) BIF в OTP, тож довга вбудована функція не може завадити виконанню інших процесів (процеси).

Вбудована функціяПорції
length/1 у тіліЛічить комірки; у guard лишається вбудованим сервісом, бо guard BIF в OTP не переривається
A ++ BЗбирає елементи A, потім будує копію поверх B з її кінця
A -- BЗбирає B, сортує за точним порядком (висхідне сортування злиттям), переглядає A з двійковим пошуком для кожного елемента, потім будує збережені елементи; якщо нічого не вилучено, результатом є сам A
binary_to_list/1Будує список із кінця binary
list_to_binary/1, iolist_to_binary/1Обходить iolist у глибину, потім створює binary одразу

Інші вбудовані функції виконуються до кінця. Кортежні вбудовані функції (setelement/3, make_tuple/2,3, tuple_to_list/1, list_to_tuple/1) поводяться як в OTP: їхню роботу обмежує межа арності кортежу. Решта перетворень читає вхідні дані, обмежені межами атомів, цілих чисел і чисел із рухомою комою. Форматування через io:format/1,2 виконується до кінця (відмінності). Вбудовані сервіси циклів (кінцеве обертання списку в comprehension) виконуються до кінця як частина циклу.

Типізовані вбудовані функції

План 11, step 41 (2026-10-07): вбудовані функції, що самі перевіряють свої аргументи, — це функції C++ із типізованими параметрами (typed.hpp), Result Function(ProcessContext &, Parameters...), зареєстровані через typed_entry<Function>(module, name) (арність дорівнює кількості параметрів).

Реєстрація