Clx: ネイティブ実行ファイルへの Ahead-of-Time Lua コンパイル

Clx: ネイティブ実行ファイルへの Ahead-of-Time Lua コンパイル

Clx は、Lua 5.5 コードをスタンドアロンのネイティブ実行ファイルに変換する、クロスプラットフォームの Ahead-of-Time (AOT) コンパイラおよびランタイムです。C++20 バックエンドと最新のネイティブツールチェーン (Clang, GCC, および MSVC) を活用することで、Clx はバイトコードインタプリタのオーバーヘッドを排除し、予測可能なランタイムパフォーマンスと高速な起動時間を実現します。

コアとなる目的とパフォーマンス

Clx は、あらゆる単一のワークロードに対して絶対的に最速の実装を目指すのではなく、デプロイのしやすさと予測可能性のために設計されています。その主な目標には、スタンドアロン実行ファイルの生成、高速な起動、およびネイティブコンパイラを通じた強力な最適化の機会の提供が含まれます。

Intel® Core™ i5 Ultra 125U CPU (Linux, GCC 13.3.0) でのパフォーマンスベンチマークは、標準的な Lua 5.5 インタプリタと比較して大幅なスピードアップを示しています:

スクリプト Lua 5.5 LuaJIT Clx --fast
fib.lua 1.00x 6.91x 62.20x
arraysum.lua 1.00x 2.46x 4.13x
spectralnorm.lua 1.00x 17.22x 10.69x
canada.lua 1.00x 2.62x 1.30x
warmup.lua 1.00x 1.20x 1.20x

技術的な実装と最適化

Clx は、メモリ割り当てを削減し実行速度を向上させるために、いくつかの低レベルな最適化を実装しています:

  • 16-byte Tagged Values: 8バイトのペイロードと個別の型タグを使用します。
  • Inline String Optimization: 6バイト以下の文字列は値内に直接保存され、ヒープ割り当ての必要性を排除します。
  • Fast-path Table Access: テーブルルックアップを加速させるためのキャッシュを実装しています。
  • C++20 Backend: バックエンドコンパイラ (GCC, Clang, または MSVC) によってさらに最適化可能なネイティブコードを生成します。

機能と互換性

Clx は Lua 5.5 との互換性をターゲットとしており、コア言語、テーブル、メタテーブル、コルーチン、およびほとんどの標準ライブラリがすでに実装されています。

主要な機能

  • Small Binaries: --minimal フラグを使用すると、Lua プログラムを 100 KB 未満の実行ファイルにコンパイルできます。
  • Flexible Output: コンパイラは、ネイティブ実行ファイル、オブジェクトファイル (.o/.obj)、静的モジュール (.a/.lib)、または生の C++ ソースコードを生成できます。
  • C++ API: ポータブルなネイティブモジュールを開発するための、値指向の API を提供します。

既知の制限事項

Clx は純粋な AOT モデルであるため、Lua の特定の動的機能はサポートされていません:

  • Dynamic Code Loading: load(), dofile(), および loadfile() のような関数は、ランタイムインタプリタを必要とするため、サポートされていません。
  • Debug Module: debug モジュールは、AOT 環境での実装の複雑さのため、サポートされていません。
  • C API: 従来の Lua C API はサポートされていません。開発者はネイティブモジュール用に clx C++ API を使用する必要があります。

使い方とビルド要件

Clx は現在ベータ版です。ビルドしてインストールするには、CMake 3.15+ と互換性のある C++ コンパイラが必要です:

  • Linux: g++ (Tail Call Optimization のために推奨) または clang++
  • macOS: clang++ (Xcode) または g++ (Homebrew)。
  • Windows: g++ (LLVM) または MSVC。

クイックスタートコマンド

git clone https://github.com/samyeyo/clx
cd clx
./build.sh install
clx examples/hello/hello.lua
./hello

プロジェクトのステータスとライセンス

Clx は MIT License の下でリリースされており、現在はベータ版です。互換性と最適化の改善に向けた継続的な作業が行われています。

Sources