## 実装内容(Step 1-3 完全達成) ### Step 1: src/mir/join_ir.rs 型定義追加 - **JoinFuncId / JoinContId**: 関数・継続ID型 - **JoinFunction**: 関数(引数 = φノード) - **JoinInst**: Call/Jump/Ret/Compute 最小命令セット - **MirLikeInst**: 算術・比較命令ラッパー - **JoinModule**: 複数関数保持コンテナ - **単体テスト**: 型サニティチェック追加 ### Step 2: テストケース追加 - **apps/tests/joinir_min_loop.hako**: 最小ループ+breakカナリア - **src/tests/mir_joinir_min.rs**: 手書きJoinIR構築テスト - MIR → JoinIR手動構築で型妥当性確認 - #[ignore] で手動実行専用化 - NYASH_JOINIR_EXPERIMENT=1 トグル制御 ### Step 3: 環境変数トグル実装 - **NYASH_JOINIR_EXPERIMENT=1**: 実験モード有効化 - **デフォルト挙動**: 既存MIR/LoopForm経路のみ(破壊的変更なし) - **トグルON時**: JoinIR手書き構築テスト実行 ## Phase 26-H スコープ遵守 ✅ 型定義のみ(変換ロジックは未実装) ✅ 最小限の命令セット ✅ Debug 出力で妥当性確認 ✅ 既存パイプライン無影響 ## テスト結果 ``` $ NYASH_JOINIR_EXPERIMENT=1 cargo test --release mir_joinir_min_manual_construction -- --ignored --nocapture [joinir/min] MIR module compiled, 3 functions [joinir/min] JoinIR module constructed: [joinir/min] ✅ JoinIR型定義は妥当(Phase 26-H) test result: ok. 1 passed; 0 failed ``` ## JoinIR理論の実証 - **φノード = 関数引数**: `fn loop_step(i, k_exit)` - **merge = join関数**: 分岐後の合流点 - **ループ = 再帰関数**: `loop_step` 自己呼び出し - **break = 継続呼び出し**: `k_exit(i)` ## 次フェーズ (Phase 27.x) - LoopForm v2 → JoinIR 自動変換実装 - break/continue ハンドリング - Exit PHI の JoinIR 引数化 🌟 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude <noreply@anthropic.com> Co-Authored-By: ChatGPT <noreply@openai.com>
Runner Facade / Stage1 CLI — Runner Layer Guide
Responsibility
- Provide script-side orchestration primitives for execution:
- Runner facade (
runner_facade.hako) for entry selection and pre/post hooks. - Stage1 CLI launcher (
launcher.hako) for top-level command dispatch.
- Runner facade (
- Delegate actual execution to existing backends(Rust VM / LLVM / ny-llvmc)。既定挙動は変えない。
Files
-
runner_facade.hako- Contract(draft):
- Entry:
Runner.run(entry: string, args: array<string>) -> i64 - Gate:
HAKO_SCRIPT_RUNNER=1(default OFF)。
- Entry:
- Role:
- Script-first runner facade(Phase 20.10)。
- Pre-hooks: validate entry/args, emit short diagnostics。
- Post-hooks: normalize result / metrics(将来)。
- Notes:
- Keep this layer pure; platform I/O は C-ABI 側に委譲。
- Fail-Fast: invalid entry/args は非0で即終了。
- Short diagnostics:
- Success:
[script-runner] invoke - Failure:
[script-runner] invoke: FAIL
- Success:
- Contract(draft):
-
launcher.hako- Contract(draft):
- Entry:
Main.main(args: array<string>) -> i64 - Role: Stage1 hakorune CLI のトップレベル dispatcher。
- コマンド:
run/build/emit/check(詳細は docs/development/runtime/cli-hakorune-stage1.md)。
- コマンド:
- Entry:
- Current status(Phase 25.1):
- 構造のみ実装(
HakoClibox にコマンド別のメソッドを定義)。 - 各コマンドはまだプレースホルダで、
"[hakorune] <cmd>: not implemented yet"を出力して終了コード 90–93 を返す。 - 実際のパイプライン(Stage‑B / MirBuilder / AotPrep / ny-llvmc など)への接続は後続フェーズで段階的に実装する。
- 構造のみ実装(
- Design reference:
docs/development/runtime/cli-hakorune-stage1.mdを Stage1 CLI の仕様 SSOT として参照すること。
- Contract(draft):
Notes
- Runner 層は「構造とオーケストレーション専用レイヤ」として扱う。
- 言語意味論・最適化ロジックは compiler / opt / AotPrep に留める。
- VM/LLVM の実行コアは Rust 側(Stage0 / NyRT)に委譲する。
- Fail-Fast 原則:
- 未実装コマンドや不正な引数は明示的なメッセージ+非0終了コードで返す。
- 暗黙のフォールバックや静かな無視は行わない。