Files
hakorune/docs/development/roadmap/phases/phase-25.1n/README.md

110 lines
7.3 KiB
Markdown
Raw Normal View History

# Phase 25.1n — MirBuilder SelfHost 移植ラインRust SSOT → .hako 実装)
Status: planning設計フェーズ。実装は 25.2 系と並行で段階移行)
## ゴール
- Rust 側で固めた **SSA/PHI SSOTLoopForm v2 / IfForm / BodyLocal / PhiBuilderBox** を、
`.hako` 側の `MirBuilderBox` / `LoopFormBox` / `PhiBuilderBox` に「構造そのまま」移植できるようにするフェーズだよ。
- このフェーズでは:
- Rust `MirBuilder`**唯一のオラクル** として扱い、
- その挙動を「表(ケース表+制御構造の形)」と「テスト」で固定する。
- `.hako` 側はその表とテストを見ながら、同じ SSA/PHI を組み立てる実装に寄せていく。
- 25.1/26E まででやってきた **LoopForm v2 / ExitPhiBuilder / BodyLocalPhiBuilder / IfForm / PhiBuilderBox** の成果を、
SelfHost 実装に届けるための「橋渡しフェーズ」だよ。
## スコープ25.1n でやること)
### N-0: PHI まわりの箱とガードの現状メモ2025-?? 時点)
- **PHI を建てる箱 (SSOT)**: `PhiBuilderBox`
- If 形: `get_conservative_if_values`**PhiInvariantsBox** による不変チェックを通すようにしたNone/None フォールバックは撤去)。
- Exit 形: `ExitPhiBuilder::build_exit_phis` でも **PhiInvariantsBox** を呼び、pred で未定義な値があれば fail-fast。
- これにより「欠損 incoming で偶然成功する」経路は塞いだよ。
- **不変条件をチェックする箱**: `PhiInvariantsBox`(新設)
- 役目: 「merge に必要な値が全 pred に存在するか」をチェックして early error。
- 適用済み: If, Exit。未着手: Header PHI / ループ body PHI / observe::ssa での観測ガード。
- **解析ヘルパの箱化計画**: `if_phi.rs` にある `extract_assigned_var / collect_assigned_vars / infer_type_from_phi`
将来 `IfAnalysisBox` のような解析専用箱へ移動する予定(まだ実装はしないが、移行先をここで宣言しておく)。
### NA: SSA/PHI SSOT の「表」化Rust 側設計をテーブルに落とす)
- ファイル候補:
- `docs/development/architecture/loops/loopform_ssot.md`(既存の A/B/C/D ケース表を拡張)
- `docs/development/architecture/ssa/phi_cases_stage1.md`(新規)
- やること:
- すでに存在する LoopForm ケース表Case A/B/C/Dに対して、
- `LoopVarClass`Pinned / Carrier / BodyLocalExit / BodyLocalInternal×
- LoopCase (A/B/C/D) ×
- placeheader / exit / bodyifmerge
を軸に「どこに PHI を張るか」を表にする。
- If についても:
- `then/else` の到達可否break/continue/earlyreturnと、
- 変数のクラスPinned/Carrier/BodyLocal
から、「PHI / direct bind / pre 値そのまま」の 3パターンを表で決める。
- これらを Rust コードに依存しない形で書き下し、
- 「Rust 実装はこの表を実現しているだけ」という関係にするSSOT = docs + テスト)。
### NB: Rust MirBuilder オラクルテストの整備
- ファイル候補:
- `src/tests/mir_loopform_conditional_reassign.rs`
- `src/tests/mir_stage1_using_resolver_verify.rs`
- `src/tests/mir_stage1_cli_emit_program_min.rs`
- やること:
- 代表的な構造LoopCase A〜D / Stage1 UsingResolver / StageB fib/defsについて、
- `.hako` 入力 → Rust `MirCompiler``MirVerifier` の結果を **MIR テキストとして固定**するテストgolden テストに近い)を 1〜2 本ずつ用意する。
- これらのテストは「Rust MirBuilder の挙動を凍結する」役割のみを持ち、
- `.hako` 側実装が追いつくまでは「期待値 = Rust 実装」の位置付けにする。
- 将来は、`.hako` 実装の MIR と diff を取る比較テストに発展させる(本フェーズでは準備だけ)。
### NC: .hako MirBuilderBox への API 設計(移植用インターフェース定義)
- ファイル候補:
- `lang/src/compiler/mir/mir_builder_box.hako`(仮)
- `lang/src/compiler/mir/loopform_box.hako`(仮)
- `lang/src/compiler/mir/phi_builder_box.hako`(仮)
- やること:
- Rust の `MirBuilder` / `LoopFormBuilder` / `PhiBuilderBox` の公開インターフェースから、
- `.hako` 側で必要になる API を抜き出し、Nyash の Box としてのシグネチャだけ先に決める。
- 例:
- `MirBuilderBox.emit_block(fn_name, ast)` → MirModule にブロック/関数を追加。
- `LoopFormBox.build_loop(condition, body_ast)` → LoopForm v2 構造を Nyash 側で組み立て。
- `PhiBuilderBox.emit_if_phi(pre_snapshot, then_snapshot, else_snapshot, control_form)` → 既存表に沿って PHI を配置。
- このフェーズでは **実装はまだ書かず**、I/F と責務コメント、簡単な docs のみを `.hako` 側に置く。
### ND: SelfHost 用ミニパイプラインの設計
- ファイル候補:
- `docs/development/runtime/cli-hakorune-stage1.md`
- `docs/development/architecture/mir-selfhost-pipeline.md`(新規)
- やること:
- SelfHost MVP のパイプラインを定義する:
- Stage0 Rust CLI → StageB (.hako) → Stage1 MirBuilderBox (.hako) → MIR(JSON) → VM 実行。
- MVP では:
- 1〜2 の代表ケースfib/defs, minimal_programだけを対象とし、
- `.hako` MirBuilder は Rust MirBuilder の完全互換ではなく「代表ケースに十分」な subset に留める。
- これを Phase 25.2 以降の実装フェーズのターゲットとして書き切る。
## このフェーズで「やらない」こと
- Rust MirBuilder 実装のロジック変更:
- 25.1n はあくまで「Rust 実装の挙動を SSOT として表+テストに落とす」フェーズであり、
MirBuilder/LoopForm/IfForm/BodyLocalPhiBuilder のロジック変更は 26.x までに終わっていることを前提にする。
- `.hako` MirBuilder 実装の本格実装:
- ここでは Box のシグネチャと責務、テスト用の I/F だけを決める。実装は 25.2/25.2b などのフェーズで段階的に行う。
- GC や Region/RefSlotKind の統合:
- 25.1l の Region 観測レイヤーはあくまで Rust 側のみ。
`.hako` 側 GC/寿命管理は別フェーズ25.1m 以降の仕事とし、MirBuilder SelfHost とは分離する。
## 受け入れ条件25.1n
- Docs:
- LoopForm/IfForm/BodyLocal/PhiBuilder について、SSA/PHI の挙動が表形式で整理されているRust コードを読まずに「この形ならどの PHI が立つか」が分かる)。
- SelfHost 用 MirBuilderBox / LoopFormBox / PhiBuilderBox の .hako 側 I/F が定義されている(未実装でも良い)。
- テスト:
- Rust MirBuilder オラクルテストが 2〜3 本LoopForm ケース / UsingResolver / Stage1 CLI minimal追加され、安定して緑になっている。
- これらのテストは「将来 .hako 実装と比較する」前提で、MIR 構造を固定する役割を持つ。
- 実装範囲:
- Rust 側の MirBuilder ロジックには手を入れていない(設計とテストの “凍結フェーズ” として完了できている)。