Clause

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 відрізняється.

Можливості

Можливості докладно

Фронтенд

  • Синтаксис 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 у бенчмарках