
Erlang/OTP 29, скомпільований у нативний код
Clause — це AOT-компілятор для Erlang. Він виконує препроцесинг, синтаксичний і семантичний аналіз коду Erlang, компілює його через LLVM і збирає нативні програми з власним runtime: легкі процеси на кількох потоках планувальника, обмін повідомленнями, порти та збирання сміття для кожного процесу окремо.
Проєкт у розробці: програми Erlang/OTP 29 уже компілюються в нативні програми, що виконуються на Windows і Linux, із власними stdlib, kernel, crypto і ssl у Clause. Ще попереду: macOS з Apple Silicon і нативне обладнання ARM, власні набори тестів OTP, файли й рядки вихідного коду в трасуваннях стека і подальша оптимізація; розподілене виконання й гаряче завантаження коду не підтримуються. Сторінка бенчмарків показує, як Clause виглядає порівняно з OTP; документація описує, що працює і чим Clause відрізняється.
Можливості
OTP 29
Сучасний синтаксис Erlang
Препроцесор і парсер для коду Erlang/OTP 29, разом із нативними records.
1,49× швидше
Швидкість порівняно з OTP
Середнє геометричне 31 тестових ядер, Clause -O2 порівняно з BEAM JIT.
clau -o app
Нативні програми
Одна команда від коду Erlang до окремої програми, скомпільованої через LLVM з оптимізацією під час компонування. Escript теж.
spawn · send · receive
Процеси Erlang
Легкі процеси з окремим збиранням сміття для кожного процесу на кількох потоках планувальника.
gen_server · ssl
Бібліотека OTP
Власні stdlib, kernel, crypto і ssl у Clause з експортами, результатами й помилками як в OTP 29.
gen_tcp · file · os
Порти та ввід-вивід
Файли, підпроцеси та сокети TCP/UDP на одному керованому подіями потоці вводу-виводу.
--print-types
Виведення типів
На O2 виведені типи прибирають перевірки під час виконання й обирають спеціалізований код.
clau --shell
Інтерактивна оболонка
Компонує оболонку Erlang у виконуваний файл: erl_eval, історія команд і records, без BEAM.
7 платформ
Кросплатформність
Працює на Windows x64 і Linux x86-64; об'єктні файли для семи платформ.
Можливості докладно
Фронтенд
- Синтаксис Erlang/OTP 29: records, maps, bitstrings, comprehensions, типи та специфікації
- Макроси, include та умовна компіляція
- Parse transforms без встановленого Erlang/OTP: ms_transform, qlc, merl і власні
- Специфікації ASN.1 компілюються в модулі, як це робить asn1ct: BER, DER, PER і UPER
Семантика Erlang
- Зіставлення зі зразком і guards у клаузах, case, if та receive
- Records, funs, maybe та comprehensions для списків, бінарних даних і maps
- Винятки з try, catch і трасуванням стеку
Компілятор
- Виведення типів із типами функцій для кожної клаузи
- LLVM O0, O2 та Os, з оптимізацією між модулями під час компонування
- O2 прибирає перевірки типів, доведені виведенням
- O2 вбудовує малі локальні функції, відомі funs і цикли lists
- Справжні хвостові виклики та глибока рекурсія
- Паралельна генерація коду на кожному апаратному потоці
Runtime
- Runtime на C++23 з усіма типами термів Erlang, зокрема цілими довільної точності
- Процеси, вибірковий receive, зв'язки, монітори й таймери на кількох планувальниках
- Окремі купи процесів із копіювальним збирачем сміття
- Конкурентні таблиці ETS на C++
Бібліотека OTP
- Власні модулі OTP 29 у Clause з експортами, результатами й причинами помилок як в OTP
- gen_server, gen_statem, gen_event, supervisor, application і logger
- stdlib: lists, maps, string, binary, json, re, rand і модулі колекцій
- ets, dets, disk_log, zip і erl_tar із файлами у форматі OTP
- erl_scan, erl_parse, erl_lint, erl_eval, qlc і compile під час виконання, скомпільовані модулі інтерпретуються
- syntax_tools: erl_syntax, erl_prettypr, epp_dodger і merl
- kernel: file, gen_tcp, gen_udp, inet, inet_res і os
- crypto на основі OpenSSL з режимом FIPS; public_key з перевіркою ланцюжків сертифікатів, CRL і OCSP
- ssl: з’єднання TLS 1.2 і 1.3 на основі libssl з OpenSSL
Проєкти та інструменти
- Одна команда clau від коду Erlang до нативної програми
- Проєкти TOML з кешами збірки в SQLite
- Інтерактивна оболонка Erlang з clau --shell
- Налагоджувальна інформація з -g (CodeView або DWARF 5) і профілювання з --profile
- Протестовано проти еталонного Erlang/OTP і порівняно з OTP у бенчмарках
Clause