Files
hakorune/docs/予定/native-plan/issues/phase8_mir_to_wasm.md

48 lines
2.5 KiB
Markdown
Raw Normal View History

# Phase 8: MIR→WASM codegen (browser/wasmtime; sandboxed; Rust runtime free)
## Summary
- MIR から素の WebAssembly を生成し、ブラウザ/wasmtimeWASIでサンドボックス実行する。
- Rust は「コンパイラ本体」のみ。実行は純WASMホストimportenv.print 等)。
## Scope
- ABI/Imports/Exports最小
- exports: `main`, `memory`
- imports: `env.print(i32)`デバッグ用に整数のみ。将来文字列ABIを定義
- メモリ/ヒープ
- 線形メモリに簡易ヒープbump or フリーリスト)
- Box の固定レイアウト(フィールド→オフセット表; 型名→レイアウトは暫定固定)
- 命令カバレッジ(段階導入)
- PoC1: 算術/比較/分岐/loop/return/print
- PoC2: RefNew/RefSet/RefGetPhase 6 と整合)で `print(o.x)`
- PoC3: Weak/Barrier の下地WeakLoad は当面 Some 相当、Barrier は no-op
- CLI 統合(任意)
- `--backend wasm` で生成・実行wasmtime 呼び出し)。未実装の場合は分かりやすいエラーで誘導。
## Tasks
- [ ] WASMバックエンド新規モジュールの足場作成`src/backend/wasm/`
- [ ] PoC1: MIR → WAT/WASM 変換(算術/比較/分岐/loop/return/print
- [ ] PoC2: RefNew/RefSet/RefGet の線形メモリ上実装(簡易ヒープ + 固定レイアウト)
- [ ] PoC3: WeakLoad/Barrier のダミー実装将来GC対応のためのフック
- [ ] 実行ラッパwasmtime CLIとブラウザローダJS importObjectのサンプル
- [ ] (任意)`--backend wasm` CLI のプレースホルダ/実装
## Acceptance Criteria
- PoC1: 生成WASMを wasmtime で実行し、戻り値・print 出力が期待通り
- PoC2: `o = new Obj(); o.x = 1; print(o.x)` 相当が Ref 系命令で動作
- PoC3: Weak/Barrier のダミー命令を含むWASMが生成・実行実質 no-op で可)
- CLI 連携を行う場合、未対応箇所は明瞭なエラー/誘導メッセージ
## Tests
- tests/wasm_poc1_basic.shまたは Rust integration
- MIR → WASM の出力を wasmtime で実行し、終了コード/標準出力を検証
- tests/wasm_poc2_ref_ops.sh
- RefNew/RefSet/RefGet 経由の `print(o.x)` を確認
- Node/ブラウザ用:ヘッドレス実行で `env.print` の呼び出しを検証する最小スクリプト
## Out of Scope
- 本格GC/Weak無効化、fini/Pin/Unpin、JIT/AOT の高度最適化、複雑な文字列ABI
## References
- docs/予定/native-plan/README.mdPhase 8
- docs/説明書/wasm/*