Files
hakorune/docs/private/roadmap/rust-to-hakorune-migration-plan.md

399 lines
16 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# 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 MVPStage-2/3サポート
- ✅ MIR生成基本const/binop/compare/branch/jump/ret
- ✅ JSON v0出力
- ✅ Pipeline V2Box-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式完全対応
- propertygetter/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 追加メモGateC / 契約・TTL
### GateCJSON v0 直実行)の位置づけ(開発限定)
- 目的: `.hako` を経ずに MIR(JSON v0) をそのまま VM に流し、契約/整合性を素早く検証する導線。
- CLI: `hakorune --nyvm-json-file <path>`推奨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 に正規化GateC
- SSA: `callee=Some(..)` の Call は `%func` を使用値に含めないPlaceholder
### TTL/互換(フォールバックの短期運用)
- `NYASH_GATE_C_COLLECTION_FALLBACK=1`GateC直実行時のみランナーが設定
- 目的: plugins OFF でも `new ArrayBox` + `push/get/set/len` が動く極小実装を登録し、JSON 直叩きを円滑化。
- 範囲: GateC 経路のみに限定既定OFF。Rust VM 本線や通常経路には影響を与えない。
- TTL: 20.12系の bringup 期間のみ。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完了時)
- **目標**: c0Rustコンパイラ→c1Hakoruneコンパイラ→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
- [ ] docsROOT_MAP, guides/*)の参照を `lang/src/compiler/*` に統一。
- [ ] tools/smokes の using 行を `lang.compiler.*` に揃えるapps 参照が残っていないか `rg` で確認)。
- [ ] 最終撤退: `apps/selfhost-compiler` の残ファイルを archive へ移動 or 削除(履歴は Git に残る)。
観測とロールバック
- 失敗時は alias を一時復活可逆差分。fail-fast のエラー文言は安定化済みログへ集約する。