← На главную

Вышел clx: AOT-компилятор Lua быстрее LuaJIT в 9 раз

11.07.2026 12:40 · hackernews

Вышел clx — кроссплатформенный AOT-компилятор и рантайм для Lua. Он не гонится за абсолютной производительностью на каждой задаче, но решает конкретную задачу: компилирует Lua-скрипты в standalone нативные исполняемые файлы. Никакого интерпретатора байткода — программа собирается в бинарник один раз и запускается мгновенно.

Для сборки clx нужен современный C++ тулчейн — Clang, GCC или MSVC (компилятор фиксируется при сборке рантайма, чтобы не было проблем с ABI) и CMake 3.15+. На GitHub уже лежит репозиторий, собирается одной командой ./build.sh install. После этого clx умеет превращать .lua файлы в исполняемые файлы, объектные файлы или статические библиотеки. Есть флаги под конкретные цели: --fast для скорости, --size для компактности, --minimal — бинарник получается меньше 100 КБ.

В основе лежат 16-байтовые тегированные значения (8 байт данных + тег типа). Строки короче 6 символов хранятся прямо в значении, без аллокации. Кэши быстрого доступа к таблицам и лёгкий AOT-ориентированный рантайм — всё это даёт прирост. Судя по бенчмаркам из статьи, на рекурсивном fib.lua clx обгоняет стандартный интерпретатор Lua 5.5 в 62 раза, а LuaJIT — почти в 9 раз. На spectralnorm — в 10 раз быстрее референса. Скромнее всего результаты на canada.lua (1.3x) и на warmup.lua (вровень). Тесты замеряли на Intel Core i5 Ultra 125U под Linux с GCC 13.3.0.

clx целится на совместимость с Lua 5.5. Ядро языка, таблицы, метатаблицы, корутины, модули и почти вся стандартная библиотека уже работают. Чего нет — динамической загрузки кода (load, dofile, loadfile, string.dump), модуля debug (сложно для чистой AOT-модели) и старого C API. Вместо него — clx C++ API, через который пишут нативные модули. В репозитории есть примеры: pong (полноценная игра) и Mandelbrot — оба скомпилированы из Lua в нативные бинарники, с использованием графического модуля на Sokol.

Проект в бете, но уже рабочий. Лицензия MIT, автор — Tine Samir (2026).

Читать оригинал →