# Rust → Hakorune 移行計画(詳細版) **作成日**: 2025-10-06 **目的**: Rustで実装された Hakorune 処理系を段階的に Hakorune 言語自身で置き換える --- ## 📊 現状分析(2025-10-06) ### 🔍 コードベース規模 #### **Rust実装(src/)** - **合計**: 約94,356行 - **ファイル数**: 636ファイル(.rs) - **主要コンポーネント**: - Parser: 8ファイル(トップレベル) - MIR Builder: 20ファイル(トップレベル) - Backend: 4ファイル(トップレベル) - Runtime: 28ファイル(トップレベル) **最大ファイル**(行数順): 1. `src/backend/wasm/codegen.rs` - 899行 2. `src/runner/mir_json_emit.rs` - 867行 3. `src/config/env.rs` - 849行 4. `src/mir/builder.rs` - 732行 5. `src/boxes/p2p_box.rs` - 713行 #### **Hakorune実装(apps/)** - **合計**: 537ファイル(.hako + .nyash) - **主要ディレクトリ**: - `lang/src/compiler/`(移行後の主経路。旧 `apps/selfhost-compiler/` は互換) - `apps/selfhost/`: 63ファイル - `apps/hakorune/vm/`: 9ファイル、582行 - `apps/lib/`: 58ファイル **Hakoruneコンパイラの実装状況**: - ✅ Parser MVP(Stage-2/3サポート) - ✅ MIR生成基本(const/binop/compare/branch/jump/ret) - ✅ JSON v0出力 - ✅ Pipeline V2(Box-First emit-only architecture) - ✅ UsingResolverBox/NamespaceBox(完了) **Hakorune VM の実装状況**: - ✅ M2/M3基盤(6命令動作実証: const/binop/compare/branch/jump/ret) - ✅ InstructionScannerBox/OpHandlersBox - ✅ ProgramStateBox/CfgNavigatorBox/RetResolverBox - 🔥 残り命令(newbox/boxcall/phi/load/store/externcall)← Phase 15.7で実装中 --- ## 🎯 移行戦略 ### 📋 基本方針 1. **段階的移行**: 一度にすべて置き換えるのではなく、小さな単位で移行 2. **Box-First原則**: すべての機能をBoxとして分離・固定 3. **相互検証**: Rust実装とHakorune実装を並行動作させ、パリティテスト 4. **Fail-Fast**: 問題があれば即座にRust実装へロールバック 5. **完全なドキュメント化**: 移行の各ステップを記録 ### 🔄 移行の3つのフェーズ ``` Phase A: コンパイラ移行(Parser + MIR Builder) ↓ Phase B: VM移行(MIR Interpreter) ↓ Phase C: ランタイム移行(Runtime + Box実装) ``` --- ## 📅 Phase A: コンパイラ移行(優先度: 最高) **目標**: `lang/src/compiler/` を主経路として動作させる(旧 `apps/selfhost-compiler/` は短期互換) ### ✅ **完了済み(85-90%)** #### **A1: Parser実装**(完了) - **Rust実装**: `src/parser/` (約8ファイル) - **Hakorune実装**: `lang/src/compiler/parser/` (約20ファイル) - **状態**: ✅ Stage-2/3サポート完了 **実装済みファイル**: - `parser_box.hako` - メインパーサー - `parser_expr_box.hako` - 式解析 - `parser_stmt_box.hako` - 文解析 - `parser_control_box.hako` - 制御フロー - `using_collector_box.hako` - using文収集 #### **A2: MIR Builder基本**(完了) - **Rust実装**: `src/mir/builder.rs` (732行) - **Hakorune実装**: `lang/src/compiler/builder/` + `lang/src/compiler/pipeline_v2/` - **状態**: ✅ 基本命令(6命令)完了 **実装済み命令**: - const, binop, compare, branch, jump, ret #### **A3: Using解決**(完了) - **Rust実装**: `src/mir/resolve/` + `src/using/` - **Hakorune実装**: - `selfhost/compiler/pipeline_v2/using_resolver_box.hako` - `selfhost/compiler/pipeline_v2/namespace_box.hako` - **状態**: ✅ 完了(見積もり12日 → 実績2日、**85%短縮!**) #### **A4: Pipeline V2基盤**(完了) - **Hakorune実装**: - `selfhost/compiler/pipeline_v2/execution_pipeline_box.hako` - `selfhost/compiler/pipeline_v2/backend_box.hako` - `selfhost/compiler/pipeline_v2/mir_builder_box.hako` - **状態**: ✅ Box-First emit-only architecture完成 ### 🔥 **残り10-15%(Phase 15.7で完了予定)** #### **A5: MIR Builder拡張**(一部未完) **残り命令(優先順位順)**: 1. 🔥 **newbox**(2日) - Box生成(最重要) 2. 🔥 **boxcall**(2日) - メソッド呼び出し(最重要) 3. **phi**(2日) - SSA合流 4. **load/store**(2日) - メモリアクセス 5. **externcall**(1日) - 外部関数呼び出し 6. **unaryop/typeop**(2日) - 単項演算・型操作 **対応するRustファイル**: - `src/mir/builder/exprs.rs` - 式のMIR変換 - `src/mir/builder/calls/` - 呼び出し系命令 #### **A6: 構文サポート拡張**(Phase 16以降) **未実装構文**: - match式完全対応 - property(getter/setter) - lambda式 - async/await **対応するRustファイル**: - `src/parser/items/functions.rs` - 関数定義 - `src/parser/statements/control_flow.rs` - 制御フロー --- ## 📅 Phase B: VM移行(優先度: 高) **目標**: `apps/hakorune/vm/` を完全に動作させる ### ✅ **完了済み(40-50%)** #### **B1: VM基盤**(完了) - **Rust実装**: `src/backend/mir_interpreter/exec.rs` (約637行) - **Hakorune実装**: `apps/hakorune/vm/boxes/hakorune_vm_min.hako` - **状態**: ✅ M2/M3基盤完成(6命令動作実証) **実装済みBox**: - `InstructionScannerBox` - 命令スキャナ - `OpHandlersBox` - 命令ハンドラ - `ProgramStateBox` - プログラム状態管理 - `CfgNavigatorBox` - CFG操作 - `RetResolverBox` - 戻り値解決 - `DiagnosticsBox` - 診断出力 #### **B2: 基本命令**(完了) **実装済み**: - const, binop, compare, branch, jump, ret ### 🔥 **残り50-60%(Phase 15.7で完了予定)** #### **B3: 残り命令実装**(未完) **Phase 15.7で実装中**: 1. 🔥 **newbox**(2日) - Box生成 2. 🔥 **boxcall**(2日) - メソッド呼び出し 3. **phi**(2日) - SSA合流 4. **load/store**(2日) - フィールドアクセス 5. **externcall**(1日) - print等外部呼び出し 6. **unaryop/typeop**(2日) - 単項演算・型操作 **対応するRustファイル**: - `src/backend/mir_interpreter/handlers/` - 各命令ハンドラ - `src/backend/mir_interpreter/helpers.rs` (593行) #### **B4: 最適化・性能改善**(Phase 16以降) - メモリ管理最適化 - ホットパス最適化 - トレース・デバッグ機能 --- ## 📅 Phase C: ランタイム移行(優先度: 中〜低) **目標**: `src/runtime/` を Hakorune で置き換える ### 🔄 **現状(5-10%)** #### **C1: 基本Box実装**(一部完了) - **Rust実装**: `src/boxes/` (多数のファイル) - **Hakorune実装**: `apps/lib/boxes/` (4ファイル) **実装済みBox**: - ✅ `StringBox` → `apps/lib/boxes/string_std.hako` - ✅ `ArrayBox` → `apps/lib/boxes/array_std.hako` - ✅ `MapBox` → `apps/lib/boxes/map_std.hako` - ✅ `ConsoleBox` → `apps/lib/boxes/console_std.hako` **未実装Box**(優先順位順): 1. **IntegerBox** - 整数操作 2. **BoolBox** - ブール操作 3. **FileBox** - ファイルI/O 4. **TimerBox** - 時刻操作(一部完了: nyrt.time.now_ms) 5. **PathBox** - パス操作 6. **RegexBox** - 正規表現 7. **HttpBox** - HTTP通信 8. その他(SocketBox, P2PBox, WebBox等) #### **C2: ランタイムシステム**(未着手) **Phase 17以降で検討**: - GC(ガベージコレクション) - Plugin System - Module System - Type System - Error Handling **対応するRustファイル**: - `src/runtime/gc.rs` (多数行) - `src/runtime/plugin_loader_v2/` (多数ファイル) - `src/runtime/modules_registry.rs` - `src/runtime/type_registry.rs` --- ## 📊 移行優先度マトリックス | コンポーネント | 優先度 | 状態 | Rust行数 | Hakorune行数 | 見積期間 | 備考 | |--------------|-------|------|---------|------------|---------|------| | **Parser** | 🔴 P1 | ✅ 完了 | ~8k行 | ~2k行 | - | Phase 15.7完了 | | **MIR Builder(基本)** | 🔴 P1 | ✅ 完了 | ~5k行 | ~3k行 | - | Phase 15.7完了 | | **Using解決** | 🔴 P1 | ✅ 完了 | ~2k行 | ~500行 | - | Phase 15.7完了 | | **MIR Builder(拡張)** | 🟡 P2 | 🔥 進行中 | ~3k行 | ~1k行 | 2週間 | Phase 15.7で完了予定 | | **Hakorune VM(基本)** | 🟡 P2 | ✅ 完了 | ~2k行 | ~600行 | - | Phase 15.7完了 | | **Hakorune VM(拡張)** | 🟡 P2 | 🔥 進行中 | ~3k行 | ~500行 | 1-2週間 | Phase 15.7で完了予定 | | **基本Box** | 🟢 P3 | 🔄 一部 | ~10k行 | ~1k行 | 4-6週間 | Phase 16-17で計画 | | **構文拡張** | 🟢 P3 | 📋 計画 | ~5k行 | 未着手 | 4-8週間 | Phase 16以降 | --- ## 🧩 20.12b 追加メモ(Gate‑C / 契約・TTL) ### Gate‑C(JSON v0 直実行)の位置づけ(開発限定) - 目的: `.hako` を経ずに MIR(JSON v0) をそのまま VM に流し、契約/整合性を素早く検証する導線。 - CLI: `hakorune --nyvm-json-file `(推奨ENV: `NYASH_GATE_C_DIRECT=1`)。 - 診断: `NYASH_GATE_C_TRACE=1` で Reader/SSA の詳細ログ(定義/使用/ブロック)を出力。 ### MIR(JSON v0) 契約の明文化(要点) - functions: `[ { name, params, entry, blocks } ]`(params は VID 配列、未使用時は省略可)。 - instructions(代表): const/binop/compare/branch/jump/ret、call(`mir_call`で統一; callee={Extern|Global|ModuleFunction|Method|Constructor|Value})、 legacy newbox/boxcall は Reader が unified Call に正規化(Gate‑C)。 - SSA: `callee=Some(..)` の Call は `%func` を使用値に含めない(Placeholder)。 ### TTL/互換(フォールバックの短期運用) - `NYASH_GATE_C_COLLECTION_FALLBACK=1`(Gate‑C直実行時のみランナーが設定) - 目的: plugins OFF でも `new ArrayBox` + `push/get/set/len` が動く極小実装を登録し、JSON 直叩きを円滑化。 - 範囲: Gate‑C 経路のみに限定(既定OFF)。Rust VM 本線や通常経路には影響を与えない。 - TTL: 20.12系の bring‑up 期間のみ。Hakorune 側にコレクション実装が十分整い次第、撤退(ENV削除)。 ### alias/参照の整理(短期ガイド) - `lang/src/compiler/*` を主参照に統一。旧 `apps/selfhost-compiler/*` は短期互換(ドキュメント上も互換の注記)。 - JsonEmit は `JsonEmitBox.to_json` に統一(`JSON.stringify_map` 系は撤退)。 | **LLVM Backend** | 🟢 P3-P4 | 📋 計画 | ~8k行 | 未着手 | 8-12週間 | Phase 18以降 | | **WASM Backend** | 🟢 P3-P4 | 📋 計画 | ~5k行 | 未着手 | 6-10週間 | Phase 18以降 | | **ランタイムシステム** | ⚪ P4-P5 | 📋 計画 | ~30k行 | 未着手 | 16-24週間 | Phase 20以降 | | **Plugin System** | ⚪ P4-P5 | 📋 計画 | ~10k行 | 未着手 | 8-12週間 | Phase 20以降 | **凡例**: - 🔴 P1: 最優先(セルフホスティング必須) - 🟡 P2: 高優先度(基本機能完成) - 🟢 P3: 中優先度(機能拡張) - ⚪ P4-P5: 低優先度(長期計画) --- ## 🎯 マイルストーン ### ✅ **Milestone 1: Hakoruneコンパイラ MVP**(Phase 15.7完了予定) - **目標**: Hakorune言語で Hakorune をコンパイル可能に - **期限**: 2025-10-20(予想) - **進捗**: **85-90%完了** - **残タスク**: - Hakorune VM命令拡張(newbox/boxcall/phi/load/store/externcall) - セルフホストループE2E検証 ### 🔥 **Milestone 2: 完全なセルフホスティング**(Phase 15.7完了時) - **目標**: c0(Rustコンパイラ)→c1(Hakoruneコンパイラ)→c1'(自己コンパイル)成功 - **期限**: 2025-10-27(予想) - **進捗**: 85-90%完了 - **達成基準**: 1. UsingResolverBox/NamespaceBox動作 2. Hakorune VM 14命令すべて実装 3. .hakoソース→MIR JSON→Hakorune VM実行成功 4. c0→c1動作 5. c1→c1'成功 6. Quick smokes 全PASS維持 ### 📋 **Milestone 3: 基本Box完全実装**(Phase 16-17) - **目標**: String/Array/Map/Integer/Bool/File等の基本Boxを Hakorune で実装 - **期限**: 2025-12-31(目標) - **進捗**: 5-10%完了 - **残タスク**: - IntegerBox, BoolBox実装 - FileBox, PathBox実装 - TimerBox完全実装 ### 🌟 **Milestone 4: フル機能コンパイラ**(Phase 18-19) - **目標**: match式/property/lambda/async-await等の全構文サポート - **期限**: 2026-03-31(目標) - **進捗**: 未着手 ### 🚀 **Milestone 5: Rust依存完全排除**(Phase 20+) - **目標**: ランタイムシステム含めてすべてHakorune実装 - **期限**: 2026-12-31(目標) - **進捗**: 未着手 --- ## 🎓 教訓・ベストプラクティス ### ✅ **Phase 15.7からの学び** 1. **Box-First設計の威力** - 新機能追加が予想の**9倍速**で完了 - 小さな単位(Box)に分割することで、並行開発・テストが容易 - 例: UsingResolver/Namespace実装は1日ずつで完了(見積もり12日 → 実績2日) 2. **見積もりの精度** - 初期見積もりは慎重すぎた - 基盤が成熟すると、上位レイヤーの実装は加速する - 教訓: 「基盤整備に時間をかけるべき」 3. **順次開発 vs 並行開発** - Using解決がモジュールシステムの基盤 - コンパイラー完成 → Hakorune VM拡張の順が合理的 - 教訓: 「依存関係を正しく理解し、順序を守る」 4. **品質ファーストの重要性** - 計画外の成果(SignatureVerifier/MethodRegistry/JsonCursorBox)が開発を加速 - Fail-Fast文化の確立が重要 - 教訓: 「品質に投資すると、結果的に速度が上がる」 ### 🚨 **移行時の注意点** 1. **パリティテスト必須** - Rust実装とHakorune実装を並行実行し、出力を比較 - 差分があれば即座に調査・修正 2. **ロールバック経路の確保** - 環境変数でRust実装/Hakorune実装を切り替え可能に - 問題があれば即座にRust実装へロールバック 3. **ドキュメントの充実** - 移行の各ステップを詳細に記録 - 問題点・失敗・学びを必ず文書化 4. **スモークテストの拡充** - 新機能追加時は必ずテスト追加 - Quick smokes常緑維持 --- ## 📚 関連ドキュメント - [Phase 15.7 README](phases/phase-15.7/README.md) - セルフホスティング実現への道筋 - [00_MASTER_ROADMAP](phases/00_MASTER_ROADMAP.md) - 開発マスタープラン - [CURRENT_TASK.md](../../../CURRENT_TASK.md) - 現在のタスク --- **最終更新**: 2025-10-06 **作成者**: Claude(調査・分析・文書化) --- ## 🧹 Alias TTL(短期撤退計画 — 20.12b) 目的 - `apps/selfhost-compiler/*` へのエイリアス参照を短期で撤退し、主経路を `lang/src/compiler/*` に一本化する。 方針(最小・可逆) - 既定は `lang.compiler.*` 論理名を使用。`apps/selfhost-compiler` は互換のみ。 - 互換 alias は TTL 付き(目安: 2 週間 or 全 smokes green の早い方)。 - 解除は段階的に実施し、CI での緑確認後に alias を削除。 段取り(チェックリスト) - [x] hako.toml: `selfhost.compiler.{parser,emitter,mir}` を `lang/src/compiler/...` へ移行(debug は未移行)。TTL コメントを追加済み(2025-10-27)。 - [ ] hako.toml から `selfhost.compiler.* -> apps/selfhost-compiler/*` の alias を段階削除(残タスク: debug / legacy common)。 - [ ] docs(ROOT_MAP, guides/*)の参照を `lang/src/compiler/*` に統一。 - [ ] tools/smokes の using 行を `lang.compiler.*` に揃える(apps 参照が残っていないか `rg` で確認)。 - [ ] 最終撤退: `apps/selfhost-compiler` の残ファイルを archive へ移動 or 削除(履歴は Git に残る)。 観測とロールバック - 失敗時は alias を一時復活(可逆差分)。fail-fast のエラー文言は安定化済みログへ集約する。