Files
hakorune/docs/development/roadmap/phases/phase-15.5/migration-phases.md
Selfhosting Dev 07f96ab4fb feat: Phase 15.5 Week 1完了!llvmlite革命&環境変数完全整理
 llvmlite統一Call基盤革命達成
- mir_call.py: delegate→真の統一実装(6種Callee完全対応)
- Global/Method/Constructor/Closure/Value/Extern統一処理
- 実際のLLVMハーネス動作確認(モックルート完全回避)

 環境変数体系完全整理
- CLAUDE.md: モックルート回避設定完全文書化
- 複雑な環境変数組み合わせの成功パターン確立

 Phase 15.5ドキュメント体系確立
- 実装状況追跡システム構築
- Week 1→2移行準備完了

🎯 Week 2開始準備: JSON出力統一→mir_json_emit.rs実装へ

🤖 Generated with [Claude Code](https://claude.ai/code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-09-24 02:13:43 +09:00

6.0 KiB
Raw Blame History

Phase 15.5段階移行計画

セルフホスティング前の基盤革命・詳細実装ロードマップ

🎯 全体戦略

基本原則

  1. 急がない: 一気にJSON化せず段階的に
  2. 壊さない: 既存機能の完全互換性維持
  3. 戻れる: 各段階で前状態への撤退可能

3段階アプローチ

Phase A (今) → Phase B (次) → Phase C (最終)
JSON出力統一   JSON中心移行   完全JSON化

📋 Phase A: JSON出力統一今すぐ実装

🎯 目標

出力を統一Call対応JSON v1に

📊 優先度1: mir_json_emit統一Call対応

実装箇所

// src/runner/mir_json_emit.rs
I::Call { dst, func, callee, args, effects } => {
    if let Some(callee_info) = callee {
        // 統一Call v1形式でJSON出力
        emit_unified_call_json(callee_info, dst, args, effects)
    } else {
        // 旧形式(互換性維持)
        emit_legacy_call_json(func, dst, args)
    }
}

JSON v1スキーマ

{
  "op": "call",
  "dst": 12,
  "callee": {
    "kind": "Method",
    "box_id": "StringBox",
    "method": "upper",
    "receiver": 7
  },
  "args": [42],
  "flags": [],
  "effects": ["IO"]
}

環境変数制御

# v1形式出力統一Call対応
NYASH_MIR_UNIFIED_CALL=1 ./target/release/nyash program.nyash

# v0形式出力既存互換
NYASH_MIR_UNIFIED_CALL=0 ./target/release/nyash program.nyash

📊 優先度2: スキーマ情報追加

ヘッダー情報

{
  "ir_schema": "nyash-mir-json",
  "version": 1,
  "capabilities": [
    "unified_callee",
    "effect_mask",
    "call_flags"
  ],
  "generator": "nyash-rust-v0.1.0",
  "timestamp": "2025-09-24T...",
  "module": { ... }
}

📊 優先度3: Python側対応

instruction_lower.py更新

def handle_json_v1(inst_data):
    version = inst_data.get("version", 0)
    if version >= 1:
        # v1の統一Call処理
        return lower_unified_call_v1(inst_data)
    else:
        # v0の個別処理既存
        return lower_legacy_calls_v0(inst_data)

Phase A完了条件

  • 統一Call 6パターンのJSON化完了
  • Python LLVM/PyVMでv1形式実行成功
  • NYASH_MIR_UNIFIED_CALL=0で既存互換性維持
  • round-trip整合性テスト通過

📋 Phase B: JSON中心化移行次段階

🎯 目標

MIR ModuleをJSON v0のラッパー化

📊 優先度1: JSON→MIRリーダー薄化

現状問題

// 現在: 重厚なMIR Module構造体
pub struct MirModule {
    functions: HashMap<String, MirFunction>,
    globals: HashMap<String, MirGlobal>,
    // ... 大量のRust固有構造
}

理想形

// 将来: JSON v0の薄いラッパー
pub struct MirModule {
    json_data: JsonValue,  // 実データはJSON
    // 型安全アクセサのみ
}

impl MirModule {
    fn get_function(&self, name: &str) -> Option<MirFunction> {
        // JSON→型安全ビューの変換
    }
}

📊 優先度2: HIR情報のJSON化

名前解決情報

{
  "hir_metadata": {
    "bindings": [
      {"id": "var_1", "name": "count", "scope": "local"},
      {"id": "func_main", "name": "main", "scope": "global"}
    ],
    "function_signatures": [
      {"id": "func_main", "params": [], "return_type": "void"}
    ]
  }
}

📊 優先度3: 型情報保持

型安全性維持

// JSON v0 + 型情報のハイブリッド
pub struct TypedMirModule {
    json: JsonValue,           // データ
    type_info: TypeRegistry,   // 型安全性
}

Phase B完了条件

  • JSON→MIRリーダーの薄化完了
  • HIR情報の完全JSON化
  • 型安全性・パフォーマンス維持
  • 既存最適化の動作確認

📋 Phase C: 完全JSON化最終段階

🎯 目標

JSON v0を唯一の真実に

📊 優先度1: MIR Module廃止準備

依存箇所の洗い出し

# MIR Module直接利用の箇所を特定
grep -r "MirModule" src/ --include="*.rs"

移行計画

  1. 最適化エンジン → JSON v0 + 型ビュー
  2. VM実行器 → JSON v0直接読み
  3. デバッガー → JSON v0直接表示

📊 優先度2: 多言語実装技術実証

Python実装PoC

# PyNyash: Nyash in Python
class NyashInterpreter:
    def __init__(self, json_v0_data):
        self.program = json_v0_data

    def execute(self):
        # JSON v0を直接実行
        pass

JavaScript実装PoC

// nyash.js: Nyash in Browser
class NyashVM {
    constructor(jsonV0) {
        this.program = jsonV0;
    }

    execute() {
        // JSON v0をブラウザで実行
    }
}

📊 優先度3: プリンターのJSON化

現状維持vs移行判断

利点: 統一性、他言語での再利用
欠点: 型情報喪失、パフォーマンス

→ Phase Cで慎重に判断

Phase C完了条件

  • 他言語実装の技術実証完了
  • Rust依存の段階的削除
  • セルフホスティング基盤完成
  • パフォーマンス劣化なし

タイムライン

Phase A: 2-3週間

  • Week 1: mir_json_emit統一Call実装
  • Week 2: Python側対応・テスト
  • Week 3: 統合テスト・安定化

Phase B: 4-6週間

  • Week 1-2: JSON→MIRリーダー薄化
  • Week 3-4: HIR情報JSON化
  • Week 5-6: 型安全性確保・テスト

Phase C: 8-12週間

  • Week 1-4: 依存箇所移行
  • Week 5-8: 多言語実装PoC
  • Week 9-12: 最終統合・テスト

セルフホスティング準備完了

Phase 15.5完了後、Phase 15本格開始


🚨 クリティカルパス

絶対に守るべき順序

  1. Phase A完了まではRust MIR触らない
  2. 各段階で既存機能の完全テスト
  3. 撤退戦略の常時確保

並行作業可能項目

  • ドキュメント整備
  • テストケース拡充
  • Python側の準備作業

これにより、セルフホスティング成功の確実な基盤が構築される。