v2.16.0 · MIT / Apache-2.0

純粋な Rust による Lua ランタイム。

5 つの Lua ダイアレクトと MacroLua を 1 つのバイナリに。依存ゼロのインタプリタコア、Cranelift ベースのトレース JIT、ネイティブへの事前コンパイル、そして信頼できないスクリプトを埋め込むために設計されたサンドボックス。

5.1 – 5.5 + MacroLua コアの依存 0 コールドスタート ~33 KB lua.h 互換 C ABI
luna とは

埋め込みたいすべての Lua を、1 つのランタイムで。

luna は Lua 言語ファミリを安全な Rust だけで一から実装しています。C はなく、埋め込み側が触れる表層に unsafe もありません。必要な依存量を選び、ワークロードの要求に応じて JIT と AOT の各層へ育てていけます。

§ dialects

5.1 – 5.5 + MacroLua

主要な Lua ダイアレクトすべてを 1 つのビルドに収め、Vm 構築時にダイアレクトを選択します。1 つのプロセスが複数のダイアレクトを干渉なく同時にホストできます。MacroLua は 5.4 の表層にコンパイル時 @macro 展開を加えます。

§ core

依存ゼロのコア

luna-core が引き込む crate は、それ自身ただ 1 つ。cargo deny ゲートがコミットごとにこれを保証します。監査面は極小、ビルドは数秒、そして mmap RWX を要さないクリーンな wasm32 ターゲットが得られます。

§ jit

Cranelift トレース JIT

LuaJIT 系譜のトレースベースコンパイラ。ホットループは型付き IR に記録され、Cranelift を通じて降格され、ネイティブ機械語として実行されます。トレイト越しに差し込まれるため、インタプリタ経路はバックエンドに依存しません。

§ aot

事前コンパイルされたバイナリ

luna-aot は Lua ソースを自己完結型のネイティブ実行ファイルに変換します。バイトコード、温めたトレース、静的ランタイムが 1 つのバイナリにリンクされ、ホストに luna が無くても動きます。

§ embed

心地よい埋め込み

mlua 風の Lua ファサード、引数を自動デコードする型付きネイティブ関数、テーブルビルダー、derive マクロによる userdata、Rust 側のコルーチンとデバッグフック、そして構造化された LuaError

§ sandbox

スクリプトを閉じ込めるために

セキュリティ境界はホストが握ります。厳選した標準ライブラリのホワイトリスト、命令予算、概算メモリ上限、そして既定でオフのバイトコードロード。スクリプトが見るすべての能力は、Rust が明示的に許可したものです。


ダイアレクト仕様表

各ダイアレクトができること。

機能の有無は src/version.rs の能力述語で決まります。luna が生成するダイアレクト別バイトコードは PUC のコンパイラ形式に一致するため、PUC でコンパイルした .luac ファイルをそのままロードできます。

機能5.15.25.35.45.5MacroLua
数値
整数サブタイプ Int
// 切り捨て除算
ビット演算 & | ~ << >>
十六進浮動小数 0x1p4
構文
goto / ::label::
空文 ;
文字列
\xXX / \z エスケープ
\u{XXXX} Unicode エスケープ
5.4+ の属性
local <const>
local <close>
5.5 固有
global キーワード
名前付き可変長引数 function f(...name)
MacroLua 固有
@name(args) コンパイル時マクロ

完全な機能表、標準ライブラリのカバレッジ、C API の表面は 互換性リファレンスにあります。


アーキテクチャ

依存の表面は、あなたが選ぶ。

luna は 5 つの公開可能な crate からなる Cargo ワークスペースとして提供されます。インタプリタコアは単独で成立し、JIT と AOT の各層はトレイト境界を介してその上に重なります。バックエンドの削除や差し替えがコア API に触れることはありません。

luna-core

インタプリタ

字句・構文解析、ダイアレクト別コンパイラ、ディスパッチャ、ランタイム、標準ライブラリ、NaN ボックス化された値、侵入的マーク&スイープ GC、PUC パターンエンジン、そして JIT トレイト表面。第三者 crate ゼロ。

luna-jit

JIT と C ABI

Cranelift バックエンド、cdylib / staticlib として公開される lua.h 互換 C ABI、luna CLI、そして Lua 埋め込みファサード。

luna-aot

AOT コンパイラ

ビルド時ツール。Lua ソース → 単独ネイティブバイナリ。生成物のランタイム依存ではありません。

JIT パイプライン

01 インタプリタディスパッチャ — カウンタ加算、閾値チェック
↓ ホット経路を検出
02 トレースレコーダ — オペコードを型付き IR に再生
↓ 閉じたトレース、トレイト境界を越えて
03 Cranelift バックエンド — IR 降格、レジスタ割付、発行
↓ mmap RWX + シンボル再配置
04 ネイティブ機械語 — サイドイグジットまで実行

ソースの分類

各ファイルは 3 つの層のいずれかに属し、それぞれ変更規律とレビュー深度が異なります:

  • Stone(石) — 業務非依存の基盤(パターンエンジン、ヒープ、値レイアウト)。fuzz とベンチを施し、semver は厳格。
  • Steel(鋼) — Lua ドメインのプリミティブ(コンパイラ、ディスパッチャ、JIT バックエンド)。ダイアレクトごとに PUC と相互検証。
  • Cement(コンクリート) — ホストのグルー(CLI、C ABI、標準ライブラリ束縛、AOT)。埋め込み側の要求に応じて自由に進化。

パフォーマンスの規律

誠実な数字を、さもなくば出さない。

luna は、都合よく選んだ見出しの比率をあえて出しません。たまたま勝つマイクロベンチの 1 セルはマーケティングの産物にすぎず、追う価値のあるシグナルは、負ける外れ値のほうです。私たちが公開するのは、再現可能なベースラインと、それを生んだ方法論です。

33KB
コールドスタート ピークヒープ · 空の Vm
435
アロケーション回数 · コールドスタート
~4.5MiB
AOT バイナリ · release、strip 後
0
第三者依存 · luna-core
測定可能で再現可能なベースライン。メモリは dhat の下で 5 つのワークロード(コールドスタート、REPL アイドル、host-root churn、アロケーション + GC、userdata ライフサイクル)にわたり測定します。いずれかの定常状態で 5% を超える回帰は、追跡対象のアラームになります。バイナリサイズは cargo publish --dry-run と strip 後の release 測定値です。再現手順はドキュメントに同梱——ここに、鵜呑みにすべき数字は 1 つもありません。

方法論、チューニングノブ、ホット経路カウンタは パフォーマンスリファレンスで解説しています。


クイックスタート

3 行で埋め込む。

crate を 1 つ追加し、必要なライブラリを開き、評価するだけ。サンドボックス、ネイティブ関数、userdata は必要になったときに。

Cargo.toml
# 完全なインタプリタ + Cranelift JIT + C ABI
[dependencies]
luna-jit = "2"
main.rs — hello
use luna_jit::vm::Vm;
use luna_jit::version::LuaVersion;

let mut vm = Vm::new(LuaVersion::Lua55);
let out = vm.eval("return 1 + 2")?;
// out[0] == Value::Int(3)
main.rs — サンドボックス
use luna_jit::Lua;
use luna_jit::version::LuaVersion;

let mut lua = Lua::sandbox(LuaVersion::Lua54)
    .open_base().open_math().open_string()
    .with_instr_budget(1_000_000)
    .with_memory_cap(8 * 1024 * 1024)
    .build();

let add = lua.create_function(|a: i64, b: i64| a + b);
lua.set_global("add", add)?;
let r: i64 = lua.eval("return add(40, 2)")?;