Erlang/OTP 29, скомпільований у нативний код
Clause — це AOT-компілятор для Erlang. Він виконує препроцесинг, синтаксичний і семантичний аналіз коду Erlang, компілює його через LLVM і збирає нативні програми з власним runtime: легкі процеси, обмін повідомленнями та збирання сміття для кожного процесу окремо.
Проєкт у розробці: дедалі більша підмножина Erlang уже компілюється й виконується. Документація описує, що працює і чим Clause відрізняється від Erlang/OTP.
Можливості
OTP 29
Сучасний синтаксис Erlang
Препроцесор і парсер для Erlang/OTP 29: макроси, records, нативні records, maps, bitstrings, comprehensions, maybe та специфікації типів.
LLVM
Бекенд LLVM
Компілює у перевірений LLVM IR, біткод або нативні об'єктні файли з O0, O2 чи Os, з варіантами функцій, спеціалізованими за типами.
clau -o app
Нативні програми
Збирає модулі Erlang і runtime в окрему програму за допомогою Clang однією командою.
spawn · send · receive
Процеси Erlang
Процеси на потоках планувальника з вибірковим receive, тайм-аутами, зв'язками, моніторами, зареєстрованими іменами та сигналами виходу.
GC для кожного процесу
Ізольована пам'ять
Кожен процес має власну купу, яку прибирає копіювальний збирач сміття за класичною схемою ERTS.
7 платформ
Кросплатформність
Виконання перевірено на Windows x64; об'єктні файли перевірено для Linux x86, x64, ARM і AArch64, Windows x86 і x64 та Apple Silicon.
Можливості докладно
Фронтенд
- Препроцесинг: макроси, include, include_lib, умовна компіляція та можливості мови
- Синтаксис Erlang/OTP 29: вирази, шаблони, records, bitstrings, типи та специфікації, керування потоком і comprehensions
- Перевірка синтаксису, виведення розгорнутого коду та дерево синтаксису з відступами
- Діагностика вихідного коду для кількох вхідних файлів
Компілятор
- Семантичний аналіз: перевірка підмножини, зв'язування змінних, розв'язання викликів, оголошені та виведені типи
- LLVM O0, O2 і Os; об'єктні файли, IR і біткод для кожного модуля; знімки IR з коментарями з коду Erlang
- Звіти про типи: код із виведеними сигнатурами функцій
- Справжні хвостові виклики для локальних, віддалених і взаємно рекурсивних викликів
- Одне явне повідомлення notimpl для коректного Erlang, що потребує ще не реалізованої можливості
Runtime
- Бібліотека runtime на C++23 без LLVM, що збирається в кожну програму
- Цілі числа довільної точності, числа з рухомою комою, атоми, кортежі, списки, maps, bitstrings, records, funs, pids, порти та посилання
- Процеси, повідомлення, вибірковий receive, зв'язки, монітори та зареєстровані імена на потоках планувальника
- Купа для кожного процесу з копіювальним збирачем сміття та бінарними даними поза купою
- Порти для стандартного вводу-виводу, файлів, підпроцесів і сокетів
- Винятки з try, catch і after та трасування стека
- io:format із форматуванням ~p як в OTP; підмножини lists, maps, file та io
Проєкти та інструменти
- Проєкти TOML з іменованими цілями, пошуком вихідних файлів і налаштуваннями для кожної цілі
- Шаблони проєктів із коментарями: clau --new-project
- Одна команда clau від коду Erlang до нативної програми
- Поведінку перевірено за результатами еталонного Erlang/OTP
Clause