3.8 KiB
3.8 KiB
Cranelift AOT Box: 設計ノートと obj 出力 PoC(Phase 15 準備)
目的
- Nyash → MIR → Cranelift AOT(C ABI)→ オブジェクト(.o/.obj)→ リンク → EXE の最小パイプラインを確立する前準備。
- 本ブランチでは「設計と仕様の確定(ドキュメント化)」のみを行い、実装は別ブランチ
phase-15/self-host-aot-craneliftで着手する。
対象範囲(P0)
- PoC として
ny_main(i64 → i64 返し)を定義する最小オブジェクトを Cranelift で生成できること。 - 生成物を NyRT(
crates/nyrt)と静的リンクして実行可能ファイルを作成できること。 - 実行結果として
Result: 42等の既知の値確認を行うこと。
アーキテクチャ概要
- CraneliftAotBox(本ドキュメントの主題)
- 役割: MIR から Cranelift IR(CLIF)を生成し、
cranelift-objectでオブジェクトを出力する。 - 出力: ターゲット環境に応じた COFF/ELF/Mach-O(
cranelift-objectの既定に従う)。 - シグネチャ: PoC は
ny_main: () -> i64(将来的には引数の受け渡しや NyRT 呼び出しを拡張)。
- 役割: MIR から Cranelift IR(CLIF)を生成し、
- LinkerBox(別タスク、別文書で仕様化)
- 役割: 生成された
.o/.objを NyRT(libnyrt.a/nyrt.lib)とリンクして EXE を作る。 - Windows は
link.exe/lld-link、Linux はcc経由を想定(詳細は LinkerBox 仕様にて)。
- 役割: 生成された
ABI / 連携
- エントリ:
ny_mainを EXE から呼び出す形。NyRT 側がmain()内からny_main()を適切に呼び出して結果を表示(または検証)する想定。 - ランタイム: PoC 段階では NyRT の最低限(起動/終了)に依存。将来的に checkpoint や GC バリアなどの外部関数を
extern "C"で参照可能にする。
PoC 受入基準(P0)
.o/.objにny_mainシンボルが定義されている。libnyrt.a/nyrt.libとリンクして実行可能ファイルが作成できる。- 実行すると標準出力に既知の値(例:
Result: 42)が出力される。
想定コマンド(リンク例)
- Linux:
cc -o app ny_main.o target/release/libnyrt.a -ldl -lpthread - Windows (MSVC):
link ny_main.obj nyrt.lib /OUT:app.exe - 実行時設定: 実行ファイルと同じディレクトリに
nyash.tomlを配置することでプラグイン解決を容易にする(NyRT は exe 直下→CWD の順で探索)。
CLI/ツール統合(案)
- バックエンドキー:
--backend cranelift-aot - PoC フラグ:
--poc-const N(ny_mainがNを返す単機能) - 補助スクリプト(設計のみ、本ブランチでは作成しない):
tools/aot_smoke_cranelift.sh apps/APP/main.nyash -o app- 流れ: Nyash → MIR → CraneliftAotBox →
.o→ LinkerBox/cc →app
ロードマップ
- P0: PoC スタブ
ny_main定数返し、リンク/実行確認。 - P1: 最小 MIR(
const_i64/add_i64/ret)のマッピング。 - P2: NyRT チェックポイント呼び出しなど最小の外部関数連携。
- P3: Plugin 経由の I/O など実用的な呼び出しの一部導入。
既知のリスクと対策
- プラットフォーム ABI 差異: 既定の呼出規約を使用し、まず Linux で動作確認。
- オブジェクト形式差:
cranelift-objectの既定に寄り添う。必要に応じてターゲット指定を導入。 - 重複実装の懸念: 既存のオブジェクトビルダ(JIT/emit系)の再利用・抽象化を検討。
実装方針(別ブランチで実施)
- フィーチャ:
cranelift-aot = ["dep:cranelift-object"] - モジュール:
src/backend/cranelift/aot_box.rsを追加し、PoC 用compile_stub_ny_main_i64を提供。 - CLI 統合:
--backend cranelift-aotと PoC フラグの導入(PoC 期間は一時的)。