Files
hakorune/docs/private/roadmap/architecture-strategy.md

12 KiB
Raw Blame History

🎯 Hakorune アーキテクチャ戦略

作成日: 2025-10-02 関連: 言語進化ロードマップ

核心の問い: セルフホスティングが主流になるなら、Rust実装はどこまで作るべきか


📖 エグゼクティブサマリー

結論: 戦略ARust最小化を採用

「Rustは実行エンジン、セルフホストは言語進化」

MIR中間言語だからこそできる、理想的な責任分離。

理由:

  1. MIR中間言語の本質 - パーサーは交換可能コンポーネント
  2. セルフホストの圧倒的コンパクトさ - Rust実装の10分の1
  3. 開発効率最大化 - 重複実装の悲劇を回避
  4. 言語進化の加速 - セルフホストで新機能を素早く試せる

タイムライン:

  • Phase 17: Rustパーサー機能凍結宣言
  • Phase 18: セルフホストがデフォルトパーサーに昇格
  • Phase 19+: 新機能はすべてセルフホスト実装

📊 現状分析

実装規模比較

Rustコンパイラ実装:
- src/parser/   6,699行  (パーサー)
- src/runner/  10,672行  (パイプライン・MIR生成)
- src/mir/     17,730行  (MIR定義・最適化)
----------------------------------------
合計:          35,101行

セルフホストコンパイラ:
- parser_box       921行  (パーサー)
- pipeline_v2    1,580行  (パイプライン)
- その他         1,270行
----------------------------------------
合計:            3,771行

圧縮率: 10.7% (約10分の1)

MIR中間言語の威力

┌─────────────────┐
│  任意のパーサー   │ ← セルフホスト主流 (3,771行)
│  (Rust/Selfhost)│ ← Rustフォールバック (6,699行)
└────────┬────────┘
         │
         ▼
    ┌─────────┐
    │ MIR JSON │ ← 中間言語(交換可能インターフェース)
    └────┬────┘
         │
    ┌────┴────┐
    ▼         ▼
┌──────┐  ┌──────┐
│  VM  │  │ LLVM │ ← 実行エンジンRust実装
└──────┘  └──────┘

重要な洞察:

  • パーサーは交換可能
  • 実行エンジンVM/LLVM共通
  • MIRがあれば何とでもなる

🎯 3つの戦略案

戦略A: Rust最小化 推奨

方針: Rustは「実行エンジン」に特化、パーサー・コンパイラはセルフホスト主流

役割分担

Rust層の役割凍結対象:
✅ VM実行エンジン (src/runner/vm/)
✅ LLVM実行エンジン (src/llvm_py/)
✅ プラグインシステム (crates/hakorune_kernel/)
✅ MIR定義 (src/mir/)
⚠️ リファレンスパーサー (src/parser/) - Phase 17で機能凍結

セルフホスト層の役割(成長対象):
🚀 メインパーサー (apps/selfhost-compiler/)
🚀 MIR生成・最適化
🚀 新機能実装
🚀 言語進化

タイムライン

Phase 15-17: セルフホストパーサー完成
    ↓
Phase 17: Rustパーサー機能凍結宣言
    ↓
Phase 18: セルフホストがメインパーサーに昇格
    ↓
Phase 19+: Rustパーサーは「フォールバック」のみ
    ↓
Phase 21+: 新機能はすべてセルフホスト実装

メリット

  • 重複実装を避ける(開発効率最大化)
  • セルフホストに注力できる
  • Rust層は安定・高速実行に専念
  • 言語進化がセルフホストで加速

デメリット

  • ⚠️ Rustパーサーが古くなる意図的
  • ⚠️ セルフホストパーサーバグ時のフォールバックが限定的

戦略B: 完全二重実装 非推奨

方針: RustとセルフホストでフルParity維持

Rust層:
✅ 完全なパーサー実装(継続更新)
✅ 完全なMIR生成実装継続更新
✅ すべての言語機能をサポート

セルフホスト層:
✅ 完全なパーサー実装(継続更新)
✅ 完全なMIR生成実装継続更新
✅ すべての言語機能をサポート

メリット:

  • どちらも完全に動作
  • 相互検証できる

デメリット:

  • 重複実装の悪夢2倍の開発負担
  • 片方だけで十分なのに無駄
  • 新機能を2回実装する必要
  • MIRの利点を殺している

結論: 非推奨。開発効率が最悪。


戦略C: Stable/Nightly分離 △ 中間案

方針: Rust=Stable Channel、セルフホスト=Nightly Channel

Rust層 (Stable):
✅ 実証済み機能のみ
✅ Phase 15完成機能で凍結
✅ 安定性・互換性優先
⏸️ 新機能は追加しない

セルフホスト層 (Nightly):
🚀 実験的新機能
🚀 言語進化の最前線
🚀 破壊的変更OK

メリット:

  • 安定版が保証される
  • 実験を気軽にできる

デメリット:

  • ⚠️ 2つのバージョン管理が必要
  • ⚠️ ユーザーが混乱する可能性
  • ⚠️ Rustに新機能を移植する手間

💡 推奨戦略の詳細: 戦略ARust最小化

採用理由4つの柱

1. MIR中間言語の本質

  • パーサーは交換可能コンポーネント
  • 実行エンジンが本体
  • フロントエンド/バックエンド完全分離が設計思想

2. セルフホストの圧倒的コンパクトさ

Rust実装:       35,101行 (パーサー+MIR生成)
セルフホスト:    3,771行 (同機能)
圧縮率:         10.7% (約10分の1)

10分の1の実装量で同等機能を実現できる!

3. 開発効率の最大化

  • 1つの実装に集中できる
  • 重複コードの悲劇を回避
  • バグフィックスも1箇所のみ

4. 言語進化の加速

  • セルフホストで新機能を素早く試せる
  • 実験的機能の実装が容易
  • Rustで安定実行を保証

📅 具体的な移行計画

Phase 17: Rustパーサー機能凍結宣言

凍結内容:

src/parser/ の機能凍結(6,699行を固定):

 基本構文
   - box/flow/static
   - loop/if/match
   - return/break/continue

 高度な機能
   - プロパティシステム(stored/computed/once/birth_once
   - 例外処理(try/catch/cleanup
   - 非同期(nowait/await
   - using/namespace基本

 演算子・式
   - 算術/比較/論理演算子
   - Lambda式
   - ?演算子(Result伝播

「これで十分」宣言 🎯

Phase 17でのドキュメント整備:

  • docs/reference/rust-parser-freeze.md を作成
  • 凍結機能一覧を明記
  • 新機能はセルフホストで実装する旨を宣言

Phase 18: セルフホストパーサー主流化

デフォルト切替:

# デフォルト: セルフホストパーサー
$ hakorune program.hkr
  → apps/selfhost-compiler/ 使用

# フォールバック: Rustパーサー
$ hakorune --parser rust program.hkr
  → src/parser/ 使用

互換性保証:

  • Phase 17凍結機能セットでは完全互換
  • セルフホストパーサーバグ時はRustパーサーにフォールバック

Phase 19+: セルフホスト一本化

新機能開発方針:

新機能開発:
✅ テストフレームワーク → セルフホストのみ実装
✅ ジェネリクス → セルフホストのみ実装
✅ チャネル → セルフホストのみ実装
✅ 型システム強化 → セルフホストのみ実装

Rust実装:
✅ バグフィックスのみ
✅ セキュリティパッチのみ
⏸️ 新機能追加なし

理由: 重複実装を避け、セルフホストに注力


🎯 Rust層の最終形態

保持すべき部分(コア実行基盤)

// 1. 実行エンジンVM
src/runner/vm/              // VM実装約712行
src/runner/dispatch.rs      // ディスパッチャー
src/runner/vm_pipeline.rs   // VMパイプライン

// 2. LLVM実行エンジン
src/llvm_py/                // Python llvmlite実装
src/runner/modes/llvm.rs    // LLVMモード

// 3. プラグインシステム
crates/hakorune_kernel/     // Kernel実装約10,000行

// 4. MIR定義
src/mir/mod.rs              // MIR型定義
src/mir/types.rs            // MIR基本型

// 5. CLI・エントリポイント
src/main.rs                 // CLIエントリ
src/cli.rs                  // CLI引数処理

推定合計: 25,000行(Phase 30時点)

凍結すべき部分Phase 17

// Phase 17で機能凍結・保守モードへ
src/parser/                 // パーサー実装6,699行
src/runner/pipeline.rs      // MIR生成パイプライン

// 理由: セルフホストに譲る
// 方針: バグフィックス・セキュリティパッチのみ

削減・削除候補

// Phase 20+で削除検討
src/runner/modes/common_util/legacy/  // レガシーコード
src/runner/entry_resolve.rs          // 既に削除済み

// 削減により: 48,344行 → 30,000行Phase 20
//           → 25,000行Phase 30、安定

📊 コード行数の未来予測

Phase 17時点現在

Rust実装:    48,344行
  - parser:     6,699行
  - runner:    10,672行
  - mir:       17,730行
  - boxes:     13,243行

セルフホスト:  3,771行
  - parser:       921行
  - pipeline:   1,580行
  - その他:     1,270行

Phase 20予測凍結・削減後

Rust実装:    30,000行 (-18,344行)
  - VM/LLVM実行エンジン: 15,000行
  - プラグイン:          10,000行
  - CLI/ユーティリティ:   5,000行

セルフホスト: 10,000行 (+6,229行)
  - パーサー:    2,000行
  - MIR生成:     3,000行
  - 最適化:      2,000行
  - テスト:      3,000行

Phase 30予測Parity到達

Rust実装:    25,000行 (安定・最小化)
  - 実行エンジン: 15,000行
  - プラグイン:   10,000行

セルフホスト: 25,000行 (Parity到達)
  - パーサー:     5,000行
  - MIR生成:      8,000行
  - 最適化:       5,000行
  - テスト:       7,000行

合計: 50,000行現在の48,344行から微増

重要: セルフホストがParityに到達しても、合計行数はほぼ変わらない → 重複実装を避けることで、無駄な肥大化を防止


🎊 結論と次のアクション

戦略ARust最小化採用を推奨

理由の再確認:

  1. MIR中間言語の本質に忠実
  2. 開発効率最大化(重複回避)
  3. セルフホストの圧倒的コンパクトさ活用
  4. 言語進化の加速

具体的アクション

Phase 15現在:

  • セルフホストパーサー実装中
  • Pipeline v2設計・実装
  • テスト充実化

Phase 17次の大目標:

  • Rustパーサー機能凍結宣言
  • docs/reference/rust-parser-freeze.md 作成
  • セルフホストパーサー完全Parity確認
  • フォールバック機構実装

Phase 18主流化:

  • セルフホストがデフォルトパーサーに昇格
  • --parser rust フォールバックオプション実装
  • ドキュメント・チュートリアル更新

Phase 19+(一本化):


名言化(再掲)

「Rustは実行エンジン、セルフホストは言語進化」

MIR中間言語だからこそできる、理想的な責任分離。

これがHakoruneアーキテクチャの真髄。


📚 関連ドキュメント


作成者: Claude Sonnet 4.5(深層思考モード) 作成日: 2025-10-02 ベース: セルフホスティング進捗分析・アーキテクチャ戦略深層考察