Phase 20.33 — Hakorune コンパイラ完成(Stage‑B 本線)
目的
- Hakorune 製コンパイラを「実用レベル」へ引き上げる(Stage‑B)。
- Rust ラインの意味論を変えず、Ny→JSON v0(必要に応じて v1→v0)を安定出力。
- 既存 Runner/VM/LLVM(llvmlite, ny-llvmc)と確実に連携する。
非目標(本フェーズ外)
- 大規模最適化(MIR 前処理/LLVM最適化/ベンチ高速化)は Phase‑20.31 継続タスク。
- Runner の全面移行(Phase‑20.32 にて段階導入)。
設計原則
- Box‑First / Fail‑Fast / 仕様不変(Rust ラインの意味論は維持)。
- 既定 OFF の新トグル。既定挙動は CI/quick 緑のまま。
- JSON v0 は 1 行出力(Quiet)。
スコープ(Stage‑B)
- ParserBox(Stage‑2/3)→ pipeline_v2 → FlowEntry(emit-only)
- 対応ノード(優先度順)
- 必須: const/binop/compare/if/branch/jump/ret/new/boxcall/externcall
- 実用: load/store/phi/copy/unary/typeop
- 先送り: lambda/async/match(形状のみ or SKIP)
- v1 互換: MirCall(v1)→ MirJsonV1Adapter で v0 に降格(当面の橋渡し)
受け入れ基準
- JSON v0 canary(Hako): return/binop/if/index(array/map)緑。
- Runner(Gate‑C)で v0 を読み VM 実行 → Rust ラインと同じ出力。
- ny-llvmc(llvmlite)で v0→EXE 生成が最小ケースで PASS。
- 既定 OFF のため quick/integration は回帰なし。
マイルストーン
- 入口統一
- Main.main → ParserBox.parse → pipeline_v2 → FlowEntry.emit_v0 で 1 行 JSON 出力。
NYASH_JSON_ONLY=1下で静音保証。
- 代表構文の対応
- binop/compare/if/index/new/boxcall/externcall を優先実装。
- 既存 Stage‑A の canary(binop/if/index)を Stage‑B でも緑化。
- v1→v0 アダプタ
- pipeline_v2 が v1(MirCall)を出す経路を活かし、Adapter で v0 へ降格。
- スモーク整備
- tools/smokes/v2/profiles/quick/core/selfhost_* を追加(opt‑in)。
- ドキュメント
- 本 README / PLAN / CHECKLIST を維持更新。
リスクと対策
- 仕様すり替え禁止: Runner/VM/LLVM の意味論差が出たら Fail‑Fast。
- ノイズ:
NYASH_QUIET=1 HAKO_QUIET=1 NYASH_CLI_VERBOSE=0をデフォルトで inject(emit 経路)。
参考
- lang/src/compiler/pipeline_v2/*
- lang/src/compiler/entry/compiler.hako(入口)
- lang/src/shared/json/mir_v1_adapter.hako
- src/runner/json_v0_bridge/*(Rust 側 v0 ブリッジ)