Files
hakorune/docs/private/roadmap/phases/phase-20.33

Phase 20.33 — Hakorune コンパイラ完成StageB 本線)

目的

  • Hakorune 製コンパイラを「実用レベル」へ引き上げるStageB
  • Rust ラインの意味論を変えず、Ny→JSON v0必要に応じて v1→v0を安定出力。
  • 既存 Runner/VM/LLVMllvmlite, ny-llvmcと確実に連携する。

非目標(本フェーズ外)

  • 大規模最適化MIR 前処理/LLVM最適化/ベンチ高速化)は Phase20.31 継続タスク。
  • Runner の全面移行Phase20.32 にて段階導入)。

設計原則

  • BoxFirst / FailFast / 仕様不変Rust ラインの意味論は維持)。
  • 既定 OFF の新トグル。既定挙動は CI/quick 緑のまま。
  • JSON v0 は 1 行出力Quiet

スコープStageB

  • ParserBoxStage2/3→ pipeline_v2 → FlowEntryemit-only
  • 対応ノード(優先度順)
    • 必須: const/binop/compare/if/branch/jump/ret/new/boxcall/externcall
    • 実用: load/store/phi/copy/unary/typeop
    • 先送り: lambda/async/match形状のみ or SKIP
  • v1 互換: MirCallv1→ MirJsonV1Adapter で v0 に降格(当面の橋渡し)

受け入れ基準

  • JSON v0 canaryHako: return/binop/if/indexarray/map緑。
  • RunnerGateCで v0 を読み VM 実行 → Rust ラインと同じ出力。
  • ny-llvmcllvmliteで v0→EXE 生成が最小ケースで PASS。
  • 既定 OFF のため quick/integration は回帰なし。

マイルストーン

  1. 入口統一
    • Main.main → ParserBox.parse → pipeline_v2 → FlowEntry.emit_v0 で 1 行 JSON 出力。
    • NYASH_JSON_ONLY=1 下で静音保証。
  2. 代表構文の対応
    • binop/compare/if/index/new/boxcall/externcall を優先実装。
    • 既存 StageA の canarybinop/if/indexを StageB でも緑化。
  3. v1→v0 アダプタ
    • pipeline_v2 が v1MirCallを出す経路を活かし、Adapter で v0 へ降格。
  4. スモーク整備
    • tools/smokes/v2/profiles/quick/core/selfhost_* を追加optin
  5. ドキュメント
    • 本 README / PLAN / CHECKLIST を維持更新。

リスクと対策

  • 仕様すり替え禁止: Runner/VM/LLVM の意味論差が出たら FailFast。
  • ノイズ: NYASH_QUIET=1 HAKO_QUIET=1 NYASH_CLI_VERBOSE=0 をデフォルトで injectemit 経路)。

参考

  • 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 ブリッジ)