Clause

Erlang/OTP 29, скомпільований у нативний код

Clause — це AOT-компілятор для Erlang. Він виконує препроцесинг, синтаксичний і семантичний аналіз коду Erlang, компілює його через LLVM і збирає нативні програми з власним runtime: легкі процеси, обмін повідомленнями та збирання сміття для кожного процесу окремо.

Проєкт у розробці: дедалі більша підмножина Erlang уже компілюється й виконується. Документація описує, що працює і чим Clause відрізняється від Erlang/OTP.

Можливості

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

Фронтенд

  • Препроцесинг: макроси, 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