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

Англійський оригінал змінився після перекладу, тож частина тексту може бути застарілою. Читати англійською

Перекладено з англійського оригіналу · 1e3a39c8-dirty · 2026-10-26

Відмінності від Erlang/OTP

Поведінка, що спостерігається, у якій Clause свідомо відрізняється від зафіксованого OTP 29 (maint-29, див. otp-reference.md). Кожен запис посилається на контракт, якому він належить. Запис видаляють, щойно відмінність усунуто. Ще не реалізовані можливості (про які повідомляється як notimpl) тут не наведено; див. features.md і план.

Map

ВідмінністьOTPClauseВласник
Порядок генератора map (K := V <- M)Пласкі map (до 32 ключів) перебираються в порядку ключів, але атомні ключі — в порядку таблиці атомів, який різниться між запусками VM; більші map — у порядку хешівЗавжди канонічний порядок ключів (порядок термів)зразки
Вміст bad_generators для генератора map у zip-групіЙого ітератор: ланцюжок {K, V, Next}, що закінчується none, у порядку OTPТой самий ланцюжок, побудований у канонічному порядку ключівзразки
maps:iterator/1,2, maps:next/1, erts_internal:map_next/3, порядок виконання fun у maps (intersect_with/3, merge_with/3, ...), proplists:get_keys/1, sets версії 2 (to_list/1, fold/3)Внутрішній порядок (порядок таблиці атомів для ключів-атомів, порядок хешів понад 32 ключі); ітератор — позиція або ланцюжок {K, V, Next}Канонічний порядок ключів; ітератор продовжує обхід списку ключіввбудовані функції
Друк map (erlang:display/1, ~w, ~p)Порядок внутрішнього розміщення (порядок таблиці атомів для атомних ключів, порядок хешів понад 32 ключі)Порядок ключів map, як ~kw в OTPтерми
Порядок digraph:vertices/1, edges/1, source_vertices/1, sink_vertices/1 та впорядкувань і компонентів digraph_utils, що починаються з цих списківХеш-порядок таблиць вершин і реберХеш-порядок Clause (ETS); шляхи та списки сусідів в обох випадках відповідають порядку вставлення ребервбудовані функції
Порядок maps:keys/1, values/1, to_list/1, fold/3, елементів, які записує json:encode/1, полів, які erl_parse:abstract/1,2 надає map, а також списків вершин і обходів graphВнутрішній порядок map (порядок таблиці атомів для ключів-атомів, хеш-порядок для понад 32 ключів)Порядок ключівбібліотека
Друк native record (erlang:display/1)Поля в порядку індексів таблиці атомівПорядок визначення, як ~wnative records
== між native record, поля яких відрізняються лише як ціле число/число з рухомою комоюКомпілятор може згорнути його до =:= (false)Числове порівняння (true)native records
Зовнішнє конструювання native record модуля, який не завантаженоЗавершується збоєм, доки модуль, що його визначає, не завантаженоКожен модуль пакета завантажується під час запуску; модуль поза пакетом завжди дає збійnative records
Друк локального fun (#Fun<M.Index.Uniq>)Індекс із нумерації лямбд компілятора, Uniq — хеш коду модуляІндекс серед локальних fun модуля в порядку вихідного коду, Uniq завжди 0fun
Порядок двох локальних fun одного модуляЗа індексом OTPЗа індексом у порядку вихідного коду, тож fun різних функцій можуть упорядковуватися інакшеfun
Імена анонімних fun у трасуваннях стека (-f/1-fun-N-)N з нумерації компілятораN лічить fun функції f/1 у порядку вихідного кодуfun
Анонімний fun у значенні за замовчуванням поля recordКожне місце конструювання розгортає власну копію: fun із двох місць нерівніОдин fun для значення за замовчуванням: fun з будь-якого місця конструювання рівніfun
Порядок захоплених значень fun, створених усередині comprehensionВільні змінні згенерованої функції comprehensionПорядок визначення в охопній функції; помітно лише при порівнянні двох таких funfun

Pid, посилання і процеси

ВідмінністьOTPClauseВласник
Одноразові та інтервальні таймери timer, крім надсилань локальним pidВиконуються процесом timer_server, запущеним під kernel_sup за першого використання; сигнали exit_after/2,3 надходять від ньогоСервера таймерів немає: кожен таймер є окремим процесом, який надсилає сигнал exit_after; cancel/1 повертається до того, як цей процес побачить скасуваннявбудовані функції
Номери pidПерший процес користувача — приблизно <0.80.0>; номери повторно використовуються після переповнення таблиці pidПерший процес — <0.1.0>; номери беруться з однієї послідовності й ніколи не використовуються повторнотерми
Код після spawn(Fun) для fun іншої арностіАналіз типів компілятора може вважати код після виклику недосяжним і відкинути його, тож викликач одразу повертає pidВикликач продовжує роботу; завершується з помилкою лише новий процес, з {badarity, {Fun, []}}процеси
Стек function_clause, викликаного вбудованою функцією lists (lists:sublist/2, lists:max/1, ...)Верхній фрейм — функція Erlang, часто внутрішня допоміжна (lists:sublist_2/2), з її аргументамиНагорі викликач: вбудовані функції не додають фреймвбудовані функції
Останній біт результатів math (math:erfc(1), ...)Бібліотека C, з якою зібрано OTPБібліотека C, з якою компонуються програми Clause (Windows: 0.15729920705028513 для erfc(1), OTP 0.1572992070502851)вбудовані функції
Результат binary:compile_pattern/1{bm, Ref} або {ac, Ref} з непрозорим посиланням{bm, [Pattern]} або {ac, Patterns}вбудовані функції
binary:referenced_byte_size/1 для sub-binaryРозмір binary, на який він посилаєтьсяЙого власний розмірвбудовані функції
Пам’ять замінених або видалених persistent termsЗвільняється фоновим процесом збирача областей літералів, який змушує кожен процес скопіювати значення до себеКожен процес копіює значення до себе під час наступного кванта (призупинені — одразу, через put/erase), потім область звільняється; окремого процесу збирача немаєruntime
Persistent terms, надіслані в повідомленняхЗалишаються спільними, як літерали: купа одержувача не зростаєКопіюються в купу одержувача, як будь-який інший термruntime
persistent_term:info/0 і get/0Включають терми, які kernel і stdlib з OTP зберігають під час завантаження (26 в OTP 29)Лише власні терми програмивбудовані функції
code:is_loaded/1, code:which/1, code:all_loaded/0 для скомпільованого модуляФайл .beam, з якого його завантаженоpreloaded: кожен модуль скомпоновано у виконуваний файлвбудовані функції
Параметр priority у send/3, link/2, exit/3, exit_signal/3Пріоритетні повідомлення й сигнали випереджають звичайніПриймається; доставляються як звичайні повідомлення й сигналипроцеси
spawn/2,4, spawn_link/2,4, spawn_monitor/2,4 з іменем іншого вузлаЖурналюється попередження ** Can not start ... on Node **Нічого не друкується; непридатний pid усе одно завершується з noconnectionпроцеси
Прапорці system_flag/2, крім backtrace_depth і min_heap_size (fullsweep_after, schedulers_online, multi_scheduling, max_heap_size, ...)Змінюють емуляторПеревіряються й зчитуються без впливу; початкове значення system_logger — undefined (процесу logger немає); cpu_topology, erts_alloc, scheduler_bind_type дають badargвбудовані функції
Таймери призупиненого процесу (receive ... after, send_after/3 і start_timer/3 на його pid)Призупиняються разом із процесом до його відновлення (OTP 28, 29)Продовжують працювати: тайм-аут, що сплив під час призупинення, обробляється після відновлення процесу; повідомлення таймера чекає в його поштовій скриньціпроцеси
Вивід process_display/2Дамп стека OTP з адресами й комірками стекаОдин Module:Function/Arity на фреймпроцеси
process_flag(save_calls, N)Зберігає останні N викликів для process_info(Pid, last_calls)Зберігається й зчитується; виклики не зберігаютьсяпроцеси
adler32_combine/3, crc32_combine/3 з другим розміром понад 2^31 - 1 у WindowsОб'єднуютьсяbadarg (z_off_t у zlib там має 32 біти)вбудовані функції
init:get_arguments/0, init:get_argument/1Прапорці емулятора: root, bindir, progname, home і кожен -Flag командного рядкаЛише home; виконуваний файл не має прапорців емуляторавбудовані функції
init:script_name/0, init:script_id/0Шлях до скрипту завантаження і {"Erlang/OTP", "29"}Абсолютний шлях до виконуваного файлу і {"Clause", "29"}вбудовані функції
init:get_status/0, init:ensure_loaded/1 у вхідній функції{starting, started} і завантаження коду, поки під час завантаження системи виконується код escript, -s або -eval; {started, started} і not_allowed після запускуЗавжди відповіді для запущеної системивбудовані функції
init:stop/0,1, init:reboot/0Повертають ok; потім init зупиняє застосунки і завершує роботу, а викликач продовжує виконуватисяЗупиняють роботу одразу; виклик ніколи не повертаєтьсявбудовані функції
init:get_argument(home) у Windows без HOMEDRIVE/HOMEPATHПапка профілю оболонкиUSERPROFILE, зазвичай та сама папкавбудовані функції
erlang:halt(Slogan), init:stop(Slogan)Друкує гасло, записує erl_crash.dump у поточний каталог і повідомляє про це в stderr; код виходу 1Друкує гасло в stderr, crash dump не записує; код виходу 1виконувані файли
init:restart/0,1, init:boot/1, init:make_permanent/2Перезапускають систему в тому самому вузлі, завантажують її або задають скрипт завантаження наступного перезапускуВідхиляються: помилка notsup, {error, notsup} від make_permanent/2вбудовані функції
Арність atomics:new/2Будь-яке додатне ціле, яке може обслужити алокатор; надто велике завершує вузол із crash dumpВід 1 до 2^27, інакше badargвбудовані функції
counters з write_concurrencyЛічильники окремих планувальників, що підсумовуються при читанні; пам'ять у info/1 зростає з кількістю планувальниківОдин масив atomics; пам'ять у info/1 — це пам'ять масивувбудовані функції
erts_internal:term_type/1Внутрішнє представлення: flatmap або hashmap, heap_binary, refc_binary або sub_binary, ...Кожен map — flatmap, кожен bitstring — sub_binaryвбудовані функції
erl_prim_loader:get_path/0Шлях коду завантаження["."] до set_path/1порти
file:read_link_info/1,2 для символьного посилання у WindowsВласні дані точки повторного розбору (reparse point) посиланняРозмір і часи цілі з типом symlinkпорти
inet:gethostbyname/1,2Канонічне ім'я і псевдоніми від резолвера (inet_res, файл hosts, нативний)Запитане ім'я без псевдонімів; адреси від системного резолверапорти
Модуль socketSocket NIF APIВідсутній: посилання — помилка компіляції; використовуйте gen_tcp, gen_udp, inetбібліотека
net:getifaddrs/1,2 із простором імен, inet:getifaddrs([{netns, _}])net нескінченно викликає сам себе (OTP 29); inet читає простір імен у Linux{error, enotsup}вбудовані функції
Списки виводу zlibОдин binary на внутрішній фрагмент, вкладені там, де потік закінчився і почався зновуОдин binary на виклик, [], коли його немає; байти такі самі, як в OTPвбудовані функції
zlib:safeInflate/2 і довгі виклики zlibПовертаються після обмеженого обсягу виводу ({continue, Output}) і поступаються виконаннямРозпаковують усе введення з черги за один виклик ({finished, Output}); довгий виклик утримує свій потік планувальникавбудовані функції
Довгі зіставлення rere:run/3 і глобальний цикл поступаються виконанням після обмеженого обсягу роботиОдне зіставлення виконується до кінця й утримує свій потік планувальника; глобальний прогін поступається лише між зіставленнямивбудовані функції
re:compile/2 з export, re:import/1Експортований шаблон {re_exported_pattern, ...}, який імпортує інший вузолexport — badarg; import/1 викликає {not_implemented, import, 1}вбудовані функції
Помилки аргументів rebadarg з re:run/3 (або replace, split) з аргументами викликача і error_infobadarg з допоміжної функції re, яка відхилила аргумент, з аргументами цієї функціївбудовані функції
code:is_sticky/1true для модулів kernel, stdlib і compiler, а також модулів каталогів, названих у code:stick_dir/1Завжди false; stick_dir/1 лише перевіряє, чи можна перелічити вміст каталогувбудовані функції
code:root_dir/0 і початковий шлях кодуКаталог встановлення OTP; шлях містить його каталоги lib/*/ebinКаталог виконуваного файлу; шлях містить каталоги ebin з lib/ поруч із ним та з ERL_LIBS, а потім "."вбудовані функції
code:load_file/1, load_abs/1, load_binary/3, atomic_load/1, prepare_loading/1 з коректним об'єктним кодомЗавантажують модуль{error, badfile}: кожен модуль скомпоновано у виконуваний файл (D01)вбудовані функції
code:coverage_support/0 і функції покриттяtrue із JIT; режими й лічильники покриттяfalse; решта піднімає badarg, як OTP без підтримки покриттявбудовані функції
code:get_doc/1 для модуля, наявного в програміЙого блок документації EEP 48{error, missing}: виконувані файли не містять документаціївбудовані функції
Форматування великого терма (io:format/1,2)Виконується в коді Erlang (io_lib) і в group leader, тож процес може бути витіснений під час форматуванняВиконується до кінця в одному виклику вбудованої функції; інші процеси чекаютьвбудовані функції
Прапорці process_flag/2trap_exit, priority, message_queue_data, min_heap_size та іншіЛише trap_exit і min_heap_size; будь-який інший прапорець викликає badargпроцеси
Порядок звітів про помилки процесів, що аварійно завершуються одночасноПорядок loggerПорядок, у якому їх завершують їхні робочі потокипроцеси
Сигнали виходу (exit/2, exit_signal/2) процесу, що виконується на іншому планувальникуСтавляться в чергу сигналів і обробляються пізніше, поки відправник продовжує роботуВідправник чекає, доки закінчиться квант часу цілі, і тоді діє одразу; помітно лише за часом (повідомлення буферизуються, і відправник продовжує роботу)процеси
term_to_binary/1 для локального fun або native recordКодується (NEW_FUN_EXT, ...)error:notsup; fun M:F/A кодуєтьсявбудовані функції
term_to_binary/1 для map з понад 32 ключамиПорядок хешів, якщо не задано deterministicЗавжди порядок ключів (байти deterministic)вбудовані функції
binary_to_term/1 для pid, порту або посилання іншого вузла; параметр local у term_to_binary/2Зовнішні ідентичності; кодування LOCAL_EXTbadargвбудовані функції
Межа часу таймераЗалежить від нативної одиниці часу (близько 2^49.7 мс у Windows)Відносний час 0..2^49-1 мс на кожній платформіпроцеси
unique_integer/0,1 без positiveМоже бути від'ємнимЗавжди додатне і зростаєвбудовані функції
Елементи process_info/2 current_function, initial_call, current_stacktrace, ...Повідомляютьсяerror:{notsup, Item}; process_info/1 їх пропускаєпроцеси
reductions у process_info/2; reductions, garbage_collection, io у statistics/1Лічаться0 (не ведуться)вбудовані функції
garbage_collect/0,1,2Збирає сміття перед поверненнямЗбирає в наступній безпечній точці (safepoint) ціліпроцеси
erlang:system_info(machine), а отже, ?MACHINE у epp і макрос, який він називає"BEAM", 'BEAM'"Clause", 'Clause'вбудовані функції
erlang:system_info(schedulers) для програми, запущеної з маскою прив'язки (start /affinity, taskset)Один планувальник на логічний процесор хоста (32 під маскою з 7 CPU), schedulers_online — один на CPU маскиОбидва — один на CPU маски: Clause запускає лише активні робочі потокипроцеси
Параметри налаштування spawn_opt/2..5 (priority, min_heap_size, ...)ЗастосовуютьсяПеревіряються і приймаються, але не застосовуютьсяпроцеси
hibernate/3Відкидає стек; процес завершується, коли M:F повертаєтьсяЗберігає стек; результат M:F повертається до викликача hibernate/3процеси
monitor(port, Item, Options) з параметрамиПриймаєтьсяbadargпроцеси
spawn_request_abandon/1true, поки відповідь очікуєтьсяЗавжди false: відповідь надсилається до повернення spawn_requestпроцеси
Останній біт math:log2/1 (Windows)Збірка OTP для Windows ділить log(X) на log(2) (math:log2(1.0e308) дає 1023.1538532253077)log2 бібліотеки C (1023.1538532253076)вбудовані функції
phash/2, phash2/1,2 для pid, портів, посилань, fun і native recordХеші номерів процесів, портів і посилань OTP, індексу й унікального номера fun, хешу визначення recordХеші номерів Clause, модуля, арності або індексу й захоплень fun, значень полів record; усі інші терми мають хеші OTPвбудовані функції
dict:fold/3, map/2, filter/2 зі значенням, що не є funfunction_clause або {badfun, F}, коли перший відвіданий OTP кошик містить записfunction_clauseвбудовані функції
erlang:is_builtin/3 для lists:reverse/2 та інших бібліотечних функцій, реалізованих на Ctruefalse: лише вбудовані функції runtime і apply/2,3fun
pid, uniq, new_uniq у fun_info/1,2 локального funPid творця, контрольні суми компілятораundefined, MD5 імені модуляfun
Контекст md5_init/092-байтовий стан OTP96-байтовий стан Clause; дайджести однаковівбудовані функції
erlang:delete_module/1 для завантаженого модуляРобить його код старим (true)error:notsup: скомпонований код лишаєтьсявбудовані функції
erlang:prepare_loading/2Готує дійсний binary BEAMЗавжди {error, badfile}вбудовані функції
erlang:pre_loaded/0Попередньо завантажені модулі завантаження системиКожен модуль програмивбудовані функції
list_to_pid/1 для номера, який ніколи не видававсяПовертає терм pidbadarg: допускаються лише pid, створені цією програмоютерми
list_to_port/1 для номера, який ніколи не видававсяПовертає терм портуbadarg: допускаються лише порти, відкриті цією програмоюпорти
Значення port_info/1,2id — індекс таблиці; memory, queue_size, locking описують драйверid — номер порту; memory і queue_size дорівнюють 0; locking — port_levelпорти
Запис у файл, відкритий лише для читання{error, eacces} у Windows, {error, ebadf} деінде{error, ebadf} скрізьпорти
Порт win32regВбудований порт registry__drv__ ({spawn, "registry__drv__ rw"}), що відповідає на команди повідомленнями портуДрайвер clause_registry ({spawn_driver, ...}), що повертає ті самі відповіді через port_control/3; port_info/2 називає його clause_registryпорти
Ім'я програми в argparse без параметра prognameprogname емулятора (erl)Ім'я виконуваного файлу без розширення (init не має progname)бібліотека
Верхній фрейм стека помилки перевірки команди в argparseФункція перевірки (argparse:validate_command/2, validate_option/2, fun усередині них) з [Entity]argparse:validate/2 з [Entity]вбудовані функції
escript:script_name/0Шлях escript, перший звичайний аргументШлях виконуваного файлу: програма Clause є власним скриптомбібліотека
escript:extract/2 з compile_sourceВихідний код, скомпільований у beam{error, {compile, ...}}: програми Clause не мають компіляторабібліотека
erl_abstract_code:debug_info(core_v1, ...) (Core Erlang з beam_lib)Core Erlang від компілятора{error, failed_conversion}: програми Clause не мають компіляторабібліотека
zstd:get_frame_header/1 для обрізаного заголовка кадруПоля неініціалізованої пам'ятіНульові поля ('ZSTD_frame', розміри 0)вбудовані функції
file:open/2 з raw або ramRecord #file_descriptor{}, що обслуговується у викликачі (is_pid/1 — false); запити io до нього не виконуються; файл ram не має read_line/1 (undef), а закритий відповідає {error, einval}Pid файлового сервера, як для інших файлів; позиційне введення-виведення й sendfile/5 відповідають як для raw-файлів OTP; файл ram відповідає на read_line/1 і запити введення-виведення {error, enotsup}, а після закриття — {error, terminated}порти
file:truncate/1 для файлу, відкритого лише для читанняПомилка платформи (eacces у Windows, einval на інших)Помилка C runtime для дескриптора (ebadf або einval); сервер зупиняється як в OTPпорти
Файли, відкриті або налаштовані з {utf16, _} чи {utf32, _}Рядки й символи декодуються у відповідному кодуванніРядки закінчуються байтом 10 до декодуванняпорти
Послідовності io_ansi у Linux і macOSЗ бази terminfo для TERM, якщо вона має відповідну можливість (setaf, sgr0, ...); tput/1,2, tigetnum/1, tigetflag/1, tinfo/0 читають їїВбудовані послідовності ANSI, які OTP використовує без terminfo (як OTP у Windows); tigetnum/1, tigetflag/1, tinfo/0 відповідають {error, enotsup}, tput/1,2 піднімають {enotsup, Capability}; enabled/0,1 потребує TERM, відмінного від dumbбібліотека
io_ansi:scan/1 і tput/1,2 у WindowsЗавершуються з try_clause на {error, enotsup} від terminfoscan/1 зіставляє вбудовані послідовності; tput/1,2 піднімають {enotsup, Capability}бібліотека
socket у Windows: recvmsg, sendmsg, sendfile, sendmmsg, recvmmsgПіднімають notsupПрацюють як у Linux і macOSбібліотека
socket у Windows: дейтаграма, довша за довжину recv{error, {completion_status, ...more_data...}}Обрізана дейтаграма, як на інших платформахбібліотека
socket у Linux і macOS: ioctl/2,3,4, getopt_native/3, setopt_native/3, open/1,2 для дескриптора, домен local, SCTPПідтримуютьсяВідхиляються, як в OTP у Windows ({error, {invalid, ...}}, notsup); local дає {error, eafnosupport}бібліотека
socket:info/1, i/0,1,2Лічильники й стани NIF, fd — дескрипторЛічильники здійснених викликів, стани за даними модуля; Fd — номер портубібліотека
Відповіді inet_resВідповіді gethostbyname, getbyname і gethostbyaddr кешуються за TTL у inet_db; пошук у кеші може перелічувати адреси в іншому порядкуНічого не кешується: кожен пошук звертається до серверів іменбібліотека
Налаштування резолвера в Linux і macOSinet_db також читає файли host.conf/nsswitch.conf і inetrc, відстежує зміни resolv.conf, а в Linux визначає домен з імені хостаРядки nameserver, domain і search у resolv.conf та файл hosts, прочитані один разбібліотека
os:set_signal(Signal, handle) (Linux, macOS)Сигнал надсилається до erl_signal_server, обробник за замовчуванням якого зупиняє систему за sigterm, завершує її за sigusr1 і sigquitНемає erl_signal_server: sigterm і sigquit завершують із кодом 0, sigusr1 — із кодом 1, інші відкидаються; без set_signal для SIGTERM зберігається системна дія за замовчуваннямпорти
Порожні аргументи {spawn_executable, F} у WindowsВідкидаються з командного рядкаПередаються як ""порти
{exit_status, S} і eof запущеної програмиПорядок не визначено, exit_status може надійти раніше за останні даніПісля всіх даних, перед eofпорти
Зайняті портиПорт із надто великою чергою виводу призупиняє відправників, зокрема порти сокетів; force у port_command/3 працює з драйверами, які це дозволяютьЗайнятими стають лише порти запущених програм; порти fd і сокетів — ніколи; force викликає notsup на кожному драйверіпорти
{active, N} для сокетівЦіле N лічить повідомлення до {tcp_passive, S}exit(badarg); лише true, false і onceпорти
Власні параметри сокетів inet_drv (header, deliver, exit_on_close, send_timeout, send_timeout_close, delay_send, порогові рівні, packet_size, show_econnreset, buffer, read_packets, recvtos, recvttl, line_delimiter)ЗастосовуютьсяЗберігаються й повертаються getopts/2 зі значеннями OTP за замовчуванням, не застосовуються; системні параметри (nodelay, keepalive, linger, буфери, tos, багатоадресне передавання, ...) застосовуютьсяпорти
Інші параметри сокетів ({packet, line | http | ...}, {raw, ...}, bind_to_device, netns)Працюютьexit(badarg) під час відкриття, {error, einval} від setopts/2 і getopts/2порти
inet:getopts(S, [multicast_if]) у WindowsЧитає неініціалізовану пам'ять для TCP-сокета, а для UDP-сокета після встановлення адреси — невизначену адресуСистемне значення; невизначена адреса, якщо сокет не має адресипорти
port_info(Socket, input | output), input і output з inet:info/1Байти команд драйвера та відповідей0: трафік сокетів рахує лише inet:getstat/1,2порти
Причини помилок сокетівКожна причина POSIX, про яку повідомляє системаПоширені (econnrefused, eaddrinuse, econnreset, etimedout, ...); інші — eioпорти
Введення порту, коли під'єднаний процес утримує 1 024 повідомлення і може виконуватисяПродовжує читати й доставлятиПрипиняє доставку, доки не закінчиться квант часу процесу; понад 64 KiB утримуваних даних припиняє читання, тож програма, що пише, блокуєтьсяпорти
gen_tcp:close/1 із виводом у черзіЧекає до межі linger/send_timeout, поки вивід буде відправленоПовертається одразу; потік вводу-виводу надсилає вивід із черги, потім закриваєпорти
Типи monitor/2process, port, time_offsetprocess і port; time_offset викликає badarg (зміщення часу не змінюється)процеси
exit/2, exit_signal/2 до посиланняНадсилає псевдоніму процесу, якщо посилання активнеНічого: сигнали виходу ніколи не надходять до псевдонімівпроцеси
Номери посиланьПоєднують ідентифікатор планувальника і лічильники окремих планувальників (#Ref<0.178111994.4235460610.214105>)Один лічильник на всю програму (#Ref<0.0.0.1>), тож посилання впорядковані за часом створеннятерми

Помилки, трасування стека і звіти

ВідмінністьOTPClauseВласник
Розташування в трасуванні стека[{file, F}, {line, L}], error_info для error/3Завжди []; без error_info, тому erl_error:format_exception/3,4 не показує для них розташувань чи рядків *** argumentABI
erlang:raise/3 із записами стека {Fun, Args}ПриймаютьсяВідхиляютьсяABI
Верхній фрейм function_clauseСписок аргументівАрністьABI
Верхній фрейм undef для виклику M:F(A1, ..., An){M, F, [A1, ..., An], []}{M, F, N, []}: арність замість аргументів (apply/3 і виклики fun показують аргументи)fun
Динамічний виклик експорту, недосяжного для виконуваного файлу (його модуль названо лише через трасування стека, виняток або повідомлення ззовні програми)Викликає йогоundef, якщо не зібрано з --keep-exports; function_exported/3 і module_info(exports) усе одно його перелічуютьвиконувані файли
Фрейми BIF/операторів, що завершилися з помилкоюПрисутні ({erlang, '+', Args, ...})Відсутні; нічого нижче за вхідну функціюABI
Таблиця атомів заповнена (list_to_atom/1)Емулятор аварійно зупиняється (no more index entries in atom_tab) і записує crash dumpclau: runtime failure: entry call failed: resource_limit, код виходу 70вбудовані функції
list_to_integer/1,2 із символами понад 255Його перші цифри використовують лише молодший байт кожного символу ([16#131] дає 1)badargвбудовані функції
erlang:function_exported/3 для BIFTrue для кожного BIF емулятораTrue лише для вбудованих функцій, які надає цей runtimeвбудовані функції
Звіти про помилки аварійно завершених процесівНадсилаються до logger, записуються пізніше його обробником за замовчуванням (у стандартний вивід під erl, часто губляться, коли escript зупиняється раніше)Записуються в stderr, коли процес завершується, до будь-якого подальшого виводу; не є подією logger, тому обробники й фільтри їх не бачатьпроцеси
Виклики функцій, що ніколи не повертаютьсяКомпілюються як хвостові виклики (викликача немає в трасуванні)Звичайні виклики (викликач присутній)ABI
Винятки всередині відомого анонімного fun на -O2 (F = fun ... end, F(X), lists:map(fun ... end, L) та інші цикли списків, maps:fold(fun ... end, A, M))Фрейми fun (-f/1-fun-0-) і допоміжних функцій lists та maps (lists:map_1/2)Тіло fun вбудовується у викликача: ці фрейми відсутні, а неправильний хвіст списку в map/2, foldl/3, all/2, any/2, flatmap/2 піднімає function_clause із викликачем на вершиніfun
Пам'ять хоста вичерпаноЕмулятор повідомляє, що не може виділити пам'ять, записує crash dump і зупиняєтьсяclau: runtime failure: entry call failed: out_of_memory, код виходу 70, без dumpкупа runtime
Зберігання map з понад 32 ключамиHAMT у купі з 16-шляхових хешованих вузлівB+ дерево в купі з вузлами до 16 записів у порядку ключів; розміри купи великих map відрізняються від OTPкупа runtime
Обмеження пам'яті процесуmax_heap_size (у словах, купа і стек) вбиває процес із причиною killed і журналює звіт про помилку--max-heap / --max-stack (у байтах) і загальний для runtime --max-memory завершують процес, що запитує пам'ять, як resource_limit: clau: runtime failure: entry call failed: resource_limit, код виходу 70купа runtime
Аргументи програмиescript передає кожен аргумент у main/1; прапорці емулятора (+t) беруться з %%! або ERL_FLAGSПочаткові параметри runtime (--max-atoms, --max-heap, --max-stack, --max-memory, --min-heap-size, --args-file, --) вилучаються першими; CLAUSE_FLAGS містить ті самі параметривиконувані файли
Неперехоплений виняток у звичайному вхідному модуліescript завершується з кодом 127Завершується з кодом 1 і одним рядком uncaught exception <class>: <reason> (вихідні файли escript зберігають 127)виконувані файли
Діагностика компілятораФормулювання erl_lint (variable 'X' is unbound) і попередженняВласні формулювання (unbound variable X); попередження lint з OTP здебільшого не видаються (також попередження для native record: невідомі поля в доступі, оновленні та зразках, кваліфіковане конструювання власного модуля без значень, невикористані record або record, визначені в заголовку; пізніший зразок, що зіставляє ім'я, експортоване з гілки)семантика
Модуль поведінки з написаною вручну behaviour_info/1Викликає її під час компіляції користувачів і попереджає про відсутні, неправильно визначені або застарілі callback-функціїНе обчислюється: callback-функції його користувачів не перевіряютьсясемантика
Модулі поведінок поза пакетом і бібліотекою Clause (application, ...)Завантажуються зі шляху коду; їхні callback-функції перевіряютьсяПопередження behaviour M undefinedсемантика
Обробник logger за замовчуваннямlogger_std_h, що записує асинхронно із захистом від перевантаження (режими синхронізації, відкидання й очищення, обмеження сплесків, завершення за перевантаження)Також у standard_io (standard_error з CLAUSE_LOGGER_TYPE=standard_error), але кожна подія записується до повернення виклику журналювання; параметри перевантаження перевіряються й зберігаються без впливубібліотека
Процеси обробників logger_std_hПід наглядом logger_sup, перезапускаються через overload_kill_restart_afterЗв'язані із сервером logger; обробник, процес якого завершується, видаляєтьсябібліотека
net_adm:names/0,1Звертається до epmd: {ok, Names}, коли epmd працює на хості{error, address}: Clause не має клієнта epmdбібліотека
net_kernel:start/1,2Запускає розподілений режим або повертає помилку OTP, якщо це неможливоНедоступно (not_implemented)бібліотека
Трасування: erlang:trace/3, trace_pattern/2,3, trace_info/2, trace_delivered/1, system_monitor/0,1,2, system_profile/0,2, seq_trace/2, seq_trace_info/1, seq_trace_print/1,2, dt_*, модуль trace, erl_tracer:enabled/3, trace/5Трасуютьerror:notsupвбудовані функції
Токени seq_traceПередаються з повідомленнями; порядкові номери їх рахують; системний трасувальник отримує повідомлення трасуванняЗберігаються лише в процесі: не передаються далі, порядкові номери залишаються встановленими, повідомлень трасування немаєбібліотека
Області pg і globalРеплікуються між з'єднаними вузлами; pg відстежує вузли через net_kernelОдин вузол, без інших вузлів і їх моніторингубібліотека
Ресурси застосунківФайли .app, знайдені на шляху коду під час завантаження; sys.config, -config і аргументи -App Key Value задають середовищаКомпілюються у виконуваний файл із ресурсних файлів збирання; їх зміна потребує повторного збирання; файлів конфігурації й аргументів немаєбібліотека
Застосунки kernel і stdlibЗапускаються під час завантаження; kernel має головний процес і верхній супервізорЗавантажені й працюють без головних процесів: get_supervisor(kernel) — undefined, info/0 перелічує їх як запущені з undefinedбібліотека
application:ensure_all_started/3 з concurrentЗапускає незалежні застосунки одночасно; список відповідає порядку завершенняЗапускає їх послідовно, спершу залежностібібліотека
application:takeover/2Чекає на контролер розподілених застосунківЗавершується з noproc (немає dist_ac), як і load/2 з вузлами в обохбібліотека
Запити введення-виведення до головного процесу застосункуПересилаються керівнику групи, під яким запущено застосунокОбслуговуються через стандартне введення-виведеннябібліотека
erlang:process_flag(error_handler, Module)Runtime викликає Module:undefined_function/3 і undefined_lambda/3 для невизначених викликівbadarg; process_info/2 завжди повертає error_handler, а невизначені виклики піднімають undef безпосередньо (error_handler можна лише викликати)бібліотека
Подробиці звітів про аварії (proc_lib)Текст винятку від erl_error з розширеною інформацією про помилку; сусіди з current_function, initial_call і current_stacktrace; фактичні reductionsРядок класу винятку й фрейми стека без розширеної інформації про помилку; сусіди без цих елементів; reductions — 0бібліотека
client_info у звітах про помилки gen_server, gen_statem і gen_fsmcurrent_stacktrace процесу, що викликає[]: Clause не зберігає поточний стек іншого процесубібліотека
-behaviour зі значенням, що не є атомомПопередження друкує терм через ~w (behaviour [115,116,114] undefined)Друкує вихідний текст атрибута (behaviour "str" undefined); помилка та самасемантика
module_info(md5) і vsn, який OTP з нього виводитьMD5 скомпільованого коду BEAMMD5 надрукованого вихідного коду модуля; виведене ціле vsn відповідно відрізняєтьсясемантика
module_info(compile)version застосунку compiler з OTP, options, передані йомуВерсія Clause; options завжди []семантика
module_info(functions)Також перелічує функції, які OTP генерує для fun ('-f/0-fun-0-'/0)Лише функції з вихідного коду і попередньо визначенісемантика
-nominal у module_info(attributes)Зберігається як {nominal,[{Name,AbstractType,Params}]} в абстрактному форматіПропускаєтьсясемантика
Функція бібліотечного модуля Clause, яку Clause ще не реалізує (BIF erlang, lists:rmerge/2, ...)ВиконуєтьсяКомпілюється; під час виклику піднімає error({not_implemented, F, A}) з M:F/A на вершині стека (статуси)бібліотека, вбудовані функції
Імпорт модуля поза пакетомКомпілюється; виклик викликає undef під час виконання, якщо модуля немаєПомилка компіляції unknown module M, коли імпорт викликається (невикористані імпорти модуля не потребують)семантика
Попередження import directive overrides auto-imported BIFДля кожного автоімпортованого BIF з erl_internal:bif/2Лише для автоімпортованих BIF, які реалізує Clauseсемантика

Граничні випадки мови

ВідмінністьOTPClauseВласник
Цілочисловий сегмент, ширший за межу цілих чисел, зі значенням понад неї (<<V:4194241>> з усіх одиниць)JIT для x86 зіставляє з недійсним термом; його використання призводить до аварії VMНемає збігутерми
Zip-група, у якій нестрогий і строгий генератори мають спільну зміннуПеревірка пропуску зберігає змінні строгих зразків у нестрогих зразкахВідхилений крок пропускається щоразу, коли строгі зразки збігаються самі по собізразки
Виклик зовнішнього fun, M:F(Args) або apply/3 модуля поза програмоюЗавантажує модуль зі шляху коду, undef, якщо його немаєundef; бібліотечні модулі входять до програми лише тоді, коли вона називає їх літеральним атомомfun, бібліотека
Файли без #!, передані як escriptescript file.erl пропускає перший рядокКомпілюються як звичайні модулівиконувані файли
Попередньо скомпільовані beam та архівні escriptВиконуютьсяНе підтримуютьсявиконувані файли
Ім'я модуля escript без -module<name>__escript плюс суфікс із часовою міткою/унікальним значенням<name>__escript, детермінованевиконувані файли
include_lib застосунку, знайденого в кількох каталогах <app>-<version>Шлях коду містить одну версію (завантаження вибирає найвищу); без діагностикиНайвища версія в кожному каталозі пошуку, з одним попередженням за запуск, що їх перелічуєпрепроцесор
-spec, типи якого не мають спільного значення з виведеним результатом, вхідною областю визначення чи аргументами викликуКомпілюється; Dialyzer може попередитиСуперечлива вхідна область визначення аргументів — помилка компіляції із зазначенням оголошених і виведених типів; суперечливий результат чи виклик — попередження, і використовуються виведені типисемантичний аналіз

ETS

ВідмінністьOTPClauseВласник
Порядок first/1, next/2, tab2list/1, foldl/3 і i/1 для таблиць set, bag і duplicate_bag, а також що нумерує slot/2Комірки лінійного хешування обходяться блокування за блокуванням; порядок змінюється зі зростанням таблиціЧастини, потім кошики за порядком, потім ключі в порядку вставлення всередині кошика; комірка — один кошикruntime
ets:all/0Містить таблиці kernel і stdlib з OTP; порядок відповідей планувальниківЛише таблиці програми, без певного порядкувбудовані функції
memory у info/2Виділені слова таблиці та її об'єктівСлова збережених об'єктів і власні накладні витрати Clauseвбудовані функції
{write_concurrency, auto}Кількість блокувань адаптується до конкуренції (від 64 до 8192)64 фіксовані частини, як для true; stats повідомляє про 64 блокуванняruntime
compressedЗберігає елементи, крім ключа, у зовнішньому форматіПриймається й відображається; об'єкти зберігаються як євбудовані функції
stats у info/2 для ordered_set з write_concurrency; data; binaryCA-дерево {RouteNodes, BaseNodes, MaxDepth}; друк таблиці; binary таблиці поза купоюfalse; true без друку; []вбудовані функції
badarg від вбудованої функції etsМістить error_info з причиною (id, access, type, ...)Звичайний badargвбудовані функції
Порядок результатів select, match і match_object для хеш-таблиць та склад кожної порції select/3Результати кожного кроку обходу додаються на початок списку, найновіші першими; комірки лінійного хешуванняПорядок обходу частин і кошиків Clause; кожна порція — перші Limit зібраних результатіввбудовані функції
select_delete/2, select_replace/2 для всієї таблиціПередають керування кожні 1000 об'єктів (таблиця тим часом зафіксована)Виконуються цілком, кожна частина під своїм блокуваннямruntime
Специфікації зіставлення зі змінною під номером 25 або вищеПеренумеровує кожен атом '$N' у специфікації, навіть усередині {const, ...} (тому {const, '$30'} дає '$0')Змінні зберігають номери; {const, '$30'} дає '$30'runtime
Guard і тіла специфікацій зіставлення з вкладеністю понад 1000 рівнівКомпілюються до вичерпання стека C (system_limit)system_limitruntime
Дії трасування в erlang:match_spec_test/3: enable_trace, disable_trace, trace з коректними прапорцямиЗмінюють прапорці трасування викликача (29.1.1 аварійно завершується без трасувальника)true після перевірки прапорців (і того, що аргумент pid живий); нічого не змінюєтьсявбудовані функції
ets:tab2file/2,3 і file2tab/1,2Через процес disk_log з іменем у вигляді нового посиланняЗапис і читання безпосередньо через fileвбудовані функції
{process_dump} і {current_stacktrace} у erlang:match_spec_test/3Текст дампа процесу; трасування його стека<<>>; []вбудовані функції

dets

ВідмінністьOTPClauseВласник
Запити, що одночасно чекають біля таблиціПошуки, вставлення й видалення, поставлені в чергу разом, використовують одне оновлення кешу; відповіді на пошуки надходять до записів; зафіксована таблиця присипляє деякі процеси запису на 1 msКожен запит по черзі, у порядку надходженнявбудовані функції
Тривалі операції dets (відновлення, init_table/2,3, ущільнення, скидання великого кешу)Код Erlang, що витісняється за лічильником редукційКожна — один виклик вбудованої функції; робочий потік таблиці тим часом не виконує нічого іншоговбудовані функції
Процеси detsСервер dets і dets_sup під kernel_safe_sup, таблиці під dets_supСервер dets, запущений за першого використання, без нагляду; процеси таблиць зв'язані з нимвбудовані функції
Порядок dets:all/0Порядок ETS реєструПорядок ETS Clause (ETS)вбудовані функції
ЗвітиВідновлення журналюється на рівні info; verbose/0,1 і DETS_DEBUG журналюють більше; внутрішній збій — {dets_bug, ...}Нічого не журналюєтьсявбудовані функції

io

ВідмінністьOTPClauseВласник
~p, ~w і функції виведення io_lib для контейнерів із вкладеністю понад 256Виводятьсяsystem_limitвведення-виведення
io_lib:print/4 зі стовпцем або довжиною рядка, що не є цілим числомЗалежить від терма: виведення (guard мовчки не спрацьовують), function_clause або badarithbadarith для будь-якого терма-контейнераio_lib
Від'ємна точність або кількість заповнення (~.*c з -1)Нескінченний циклbadargio

erl_scan

ВідмінністьOTPClauseВласник
Розташування продовження tokens/3,4 (continuation_location/1, не документовано)Місце зупинки сканера всередині незавершеного токенаПочаток незавершеного токена, який сканується знову з наступними символамиerl_scan
{compiler_internal, [ssa_checks]}Сканує коментарі перевірок %ssa% у токениІгнорується: вони залишаються коментарямиerl_scan
Число з рухомою комою з основою (16#1.8#e1, основа відмінна від 10), цифри якого перевищують 53 бітиМантиса перетворюється так, як ERTS перетворює великі цілі числаНакопичується в double; останній біт може відрізнятисяerl_scan
Елемент списку, що не є символом, усередині рядка, атома в лапках або escape-послідовностіfunction_clause, case_clause або if_clause, залежно від клаузиfunction_clauseerl_scan

erl_parse

ВідмінністьOTPClauseВласник
Токени '%ssa%' (клаузи перевірки SSA з тестів компілятора OTP)Розбираються в клаузи ssa_check_whenСинтаксична помилка; erl_scan ніколи не створює цей токенerl_parse

erl_eval

ВідмінністьOTPClauseВласник
Трасування стека помилки, яку піднімає інтерпретатор ({badmatch, V}, undef локального виклику, ...)Поточний стек процесу інтерпретації (current_stacktrace у process_info/2)Стек у точці throw інтерпретатора, що його збирає, у фреймах Clauseerl_eval

erl_lint

ВідмінністьOTPClauseВласник
Поведінки, названі в -behaviourБудь-який модуль на шляху коду відповідає на behaviour_info/1Відповідають лише модулі, скомпоновані в програму; інші дають undefined_behaviourerl_lint
Порядок кількох помилок, знайдених в одному згортанні map (одиночні змінні одного типу, специфікації без функції, перевірки callback-функцій)Внутрішній порядок map (атоми за індексом)Порядок термівerl_lint
erlang:is_builtin/3 для неекспортованих записів -deprecated, -removed і -unsafeТаблиця BIF OTPВбудовані функції runtime, зокрема нативні бібліотечні функціїerl_lint
is_guard_expr/1 для конструювання recordПіднімає case_clauseВідповідає, чи є поля виразами guarderl_lint

epp

ВідмінністьOTPClauseВласник
-include_lib("App/...") поза шляхом включенняЗнаходиться в code:lib_dir(App), що знає застосунки OTPЗнаходиться в code:lib_dir(App) шляху коду Clause, який не має застосунків OTP, якщо їх туди не доданобібліотека

erl_pp

ВідмінністьOTPClauseВласник
Форма символів, які повертає erl_ppГлибоко вкладені списки символівОдин плоский список символів; після сплощення вивід однаковийвбудовані функції

qlc

ВідмінністьOTPClauseВласник
Трасування стека винятку в процесі курсора, який повторно піднімає next_answers/1,2Трасування стека курсора, за яким іде process_info(self(), current_stacktrace) власникаДалі йде трасування стека винятку, перехопленого у власнику (Clause не має елемента current_stacktrace)qlc
qlc:q/1,2 в erl_eval, ets:table/1,2, dets:table/1,2 у програмі, що ніколи не називає qlcqlc завжди завантаженоundef для qlc: вони звертаються до нього за іменем під час виконання, тому його компонують лише програми, що називають qlc (це робить кожен модуль, що включає qlc.hrl)бібліотека
Номери анотацій у коді скомпільованих запитів (info/2 з {format, abstract_code})Перетворення OTP нумерує анотації з урахуванням кожного цілого числа модуля, зокрема символів шляху qlc.hrl в його атрибуті fileТе саме перетворення, але qlc.hrl Clause має інший шлях, тому номери після першого запиту можуть відрізнятися; решта коду однаковаqlc

qlc_pt

ВідмінністьOTPClauseВласник
Повідомлення qlc_pt:parse_transform/2 під час виконанняВід compile:noenv_forms/2 (strong_validation): erl_lint і основні проходи компілятора, зокрема попередження sys_core_foldЛише від erl_lint, як в OTP qlc_pt, коли компілятор недоступнийqlc_pt

Інтерактивна оболонка

ВідмінністьOTPClauseВласник
Редагування рядка в терміналіedlin: клавіші курсора, історія рядків, пошук, доповнення клавішею Tab через edlin_expand, багаторядкове запрошення ..>Власне редагування рядка термінала (cooked); рядки читаються в міру їх надходження від термінала, з однаковим запрошенням для кожного наступного рядка команди, як в OTP для введення через каналбібліотека
Керування завданнямиCtrl+G відкриває меню JCL (нові, під'єднані, перервані й завершені оболонки)Відсутнє; банер і підказка для повільних команд усе одно згадують Ctrl+G, як їх друкує OTPбібліотека
exit()., коли оболонка читає введення через каналЗапускається нова оболонка й більше нічого не читаєЗапускається нова оболонка й читає решту введеннябібліотека
Програми, що запускають оболонку без --shellМожна викликати кожен модуль шляху кодуЛише модулі, скомпоновані в програму; без --keep-exports динамічні виклики досягають лише експортів, досяжних для програмибібліотека
Record скомпільованих модулів (rr(Module), shell_default і user_default під час запуску)Читаються з налагоджувальної інформації або вихідного коду модуля{error, nofile}: скомпонований код не зберігає абстрактного коду; rr/1,2,3 читають його з вихідних і .beam файлівбібліотека
save_module/1Записує модуль і компілює його через c:c/1Лише записує модуль (компілятора немає)бібліотека
edlin_expand:expand/1,2 усередині виклику або значення поля recordЗаголовки функцій і типи аргументів зі специфікації функції (lists:seq(From, To)), атоми й типи, які дозволяє специфікаціяЗаголовки Mod:Fun/Arity для експортованих арностей, без підказок типів: скомпонований код не зберігає специфікаційбібліотека
edlin_expand:expand/1,2 для функцій і модулівФункції, згруповані за групами документації; модулі шляху кодуОдна група Functions (документації немає); модулі програмибібліотека
Стовпці c:i/0,1, c:ni/0, c:regs/0Початковий виклик і поточна функція кожного процесуПочатковий виклик proc_lib або undefined; поточна функція — undefined (немає елемента current_function)бібліотека

Випадкові числа

ВідмінністьOTPClauseВласник
Висоти смуг нормального зикурата randТабличні константиОбчислюються до найближчого double з констант зикурата; висота може відрізнятися останнім бітом, що змінює прийняття на повільному шляху лише для вибірки в межах цього біта від границі (ймовірність близько 2^-53 на вибірку повільного шляху). Ширини й границі смуг отримано спостереженням за OTP, вони однаковівбудовані функції

crypto

ВідмінністьOTPClauseВласник
Порядок crypto:supports(ciphers)Таблиця NIF, відсортована за індексом атома, що змінюється між запусками VM, потім псевдонімиПорядок таблиці OTP, потім псевдонімивбудовані функції
{File, Line} у помилках {badarg | notsup | error, {File, Line}, Description} модуля cryptoФайл вихідного коду C й рядок OTP ({"hash.c", 111})Файл вихідного коду C++ й рядок Clause ({"hash.cpp", 63}); клас і опис — як в OTPвбудовані функції
link_type у crypto:info/0Спосіб компонування libcrypto в OTP (зазвичай dynamic)Завжди static, також коли компонується встановлена спільна бібліотека libcryptoOpenSSL
Тривалі обчислення pbkdf2_hmac/5 (понад 100 ітерацій або 64 байти)Виконуються на планувальнику dirty CPUВиконуються на робочому потоці планувальника процесу-викликача, який тим часом не виконує інших процесіввбудовані функції
modules застосунку crypto[crypto, crypto_ec_curves][crypto]бібліотека
Довгі тексти crypto_one_time/4,5 і crypto_one_time_aead/4,6,7 (понад 20000 байтів)Виконуються на планувальнику dirty CPUВиконуються на робочому потоці планувальника процесу-викликача, який тим часом не виконує інших процесіввбудовані функції
Змінна середовища застосунку fips_mode для cryptoЧитається під час завантаження модуля crypto: true вмикає режим FIPSНе читається (Clause не має on_load, а програми не мають sys.config): використовуйте crypto:enable_fips_mode/1 або clau --fipscrypto
crypto:info_fips/0 без доступного для завантаження провайдера FIPSnot_enabled, якщо OTP зібрано з підтримкою FIPS, інакше not_supportednot_supportedcrypto
Коли завантажується застосунок cryptoПід час завантаження модуля crypto (його on_load)Коли генератор crypto_cache, crypto_aes або crypto_prng1 уперше читає rand_cache_sizeбібліотека
Генерування ключів RSA (crypto:generate_key(rsa, ...)) і підписи SLH-DSAВиконуються на планувальнику dirty CPUВиконуються на робочому потоці планувальника процесу-викликача, який тим часом не виконує інших процесіввбудовані функції
Параметр rsa_sslv23_padding у crypto:public_encrypt/4 і споріднених функціяхПриймається, коли OTP зібрано з OpenSSL, що має заповнення SSLv23 (1.1, 3.x)"Bad padding type in option rsa_padding", як в OTP, зібраному з OpenSSL 4вбудовані функції
crypto:ec_curve/1 для кривої, якої немає у скомпонованій libcrypto (OpenSSL, зібраний без двійкових кривих)Параметри з crypto_ec_curveserror:function_clause, як для невідомої кривої: параметри беруться з вбудованих кривих libcryptoвбудовані функції
Розшифрування налагоджувальної інформації через beam_lib у програмі, яка не викликає cryptocrypto завжди присутнійkey_missing_or_invalid, якщо програма не компонує crypto (--with-crypto), оскільки beam_lib викликає його динамічнобібліотека

ASN.1

ВідмінністьOTPClauseВласник
Стек у {error, {asn1, {Reason, Stack}}}Фрейми згенерованих функцій enc_*/dec_* і asn1rtt_*Фрейми Module:encode/2 або decode/2 та вбудованої функції кодекаasn1
Функції згенерованого модуляТакож експортує enc_Type/1,2, dec_Type/1,2 та інші функції для кожного типу, які генерує asn1ctЛише encode/2, decode/2, info/0, функції параметрів і функції значеньasn1
CHOICE, тіло якого починається з ... (без кореневих альтернатив)asn1ct повідомляє про синтаксичну помилкуПриймаєтьсяasn1
Макроси й функції значень, що називають інше значення всередині відкритого типу (mgf1SHA1, rSASSA-PSS-Default-Identifier з PKCS-1)asn1ct залишає {'Externalvaluereference', Line, Module, Name} замість значенняЗначення, на яке посилаютьсяasn1
Помилка runtime (не ASN.1) під час декодування чи кодування значення розширення в public_keyПіднімається в момент виникнення, здебільшого класу error, зі згенерованої функції dec_ext-*/enc_ext-*exit({error, {asn1, Reason}}): значення проходить через decode/2 або encode/2 згенерованого модуля, що обгортає кожен збійpublic_key
Групи Діффі — Геллмана за замовчуванням у public_key:dh_gex_group/4Групи, згенеровані OTP (lib/public_key/priv/moduli), 60–81 для кожного розміруВісім для кожного розміру з файлу moduli OpenSSH; ті самі розміри (від 2047 до 8191)public_key
Фрейми винятку public_keypublic_key, pubkey_pem, pubkey_pbe, pubkey_cert_records, pubkey_cert, pubkey_sshpublic_key, clause_public_key_codec і clause_public_key_keyspublic_key

Parse transforms

ВідмінністьOTPClauseВласник
Ім'я в атрибуті file включеного файлу (--print-abstr, вхід перетворення)Каталог включення, поєднаний з ім'ям, як знайдено (inc.hrl, /abs/dir/inc.hrl, ../inc/x.hrl)Шлях відносно робочого каталогу, якщо файл у ньому, інакше абсолютний шляхперетворення
Анотації рядка 0 в імпортованих формах (згенерований код, наприклад від перетворення qlc)Коректний рядок: код не має вихідного рядкаКод займає місце вузла, імпортованого перед нимперетворення
Анотації generated імпортованих форм (входи .abstr, вихід перетворення)erl_lint і компілятор пропускають деякі попередження для згенерованого кодуІгноруються: код перевіряється як вихіднийперетворення
Форми {error, {Location, Module, Descriptor}} в імпортованому кодіФорматуються через Module:format_error/1Текст терма дескриптора; форматування потребує OTPперетворення
Модуль із помилками препроцесора чи розбору, що називає parse transformПеретворення виконується й отримує помилки як форми {error, E}; erl_lint повідомляє про них згодомПро помилки повідомляється, і перетворення не виконуєтьсяперетворення
Параметри компіляції, які отримує перетворенняПовний список параметрів erlc{features, _}, report_warnings, report_errors, {cwd, _}, {outdir, _} (робочий каталог), {i, _}, {d, ...} і {parse_transform, _}перетворення