Files
hakorune/docs/phases/phase-11.5/IMPLEMENTATION-GUIDE.md

4.9 KiB
Raw Blame History

Phase 11.5 実装ガイド - ChatGPT5向け

🎯 実装の全体像

Phase 11.5は、Nyashの性能を産業レベルに引き上げる最終段階です。3つの主要な最適化を行います

  1. Write Barrier除去 - GCオーバーヘッドを90%削減
  2. Atomic最適化 - sync処理を10倍高速化
  3. Coroutine実装 - 真の非同期処理を実現

📋 実装順序と依存関係

graph TD
    A[11.5a: Write Barrier除去] --> D[統合テスト]
    B[11.5b: Atomic最適化] --> D
    C[11.5c: Coroutine実装] --> D
    D --> E[Phase 11.5完了]

各タスクは独立して実装可能ですが、統合テストで相互作用を検証します。

🔧 技術的な実装詳細

1. Write Barrier除去の実装手順

Step 1: MIR拡張

// src/mir/escape_analysis.rs (新規作成)
use crate::mir::{MirFunction, MirInstruction, ValueId};
use std::collections::{HashMap, HashSet};

pub struct EscapeAnalysis {
    allocations: HashMap<ValueId, AllocSite>,
    escapes: HashSet<ValueId>,
}

impl EscapeAnalysis {
    pub fn new() -> Self {
        Self {
            allocations: HashMap::new(),
            escapes: HashSet::new(),
        }
    }
    
    pub fn analyze(&mut self, func: &MirFunction) -> EscapeInfo {
        // 実装のポイント:
        // 1. NewBox, RefNew命令を追跡
        // 2. Return, Call命令でescape判定
        // 3. ループ不変式も考慮
    }
}

Step 2: VM統合

// src/backend/vm_instructions.rs の修正
pub fn execute_ref_set(&mut self, reference: ValueId, field: &str, value: ValueId) 
    -> Result<ControlFlow, VMError> {
    // 既存のコード...
    
    // Escape analysisの結果を確認
    if let Some(escape_info) = &self.escape_info {
        if !escape_info.escapes(reference) {
            // Barrierスキップ
            return Ok(ControlFlow::Continue);
        }
    }
    
    // 通常のbarrier処理
    gc_write_barrier_site(&self.runtime, "RefSet");
    Ok(ControlFlow::Continue)
}

2. Atomic最適化の実装手順

Step 1: BoxCore拡張

// src/box_trait.rs の修正
pub trait BoxCore: Send + Sync {
    // 既存のメソッド...
    
    /// Read-onlyメソッドかどうか
    fn is_readonly_method(&self, method: &str) -> bool {
        // デフォルトはfalse保守的
        false
    }
}

// 各Boxで実装
impl BoxCore for StringBox {
    fn is_readonly_method(&self, method: &str) -> bool {
        matches!(method, "length" | "isEmpty" | "charAt")
    }
}

Step 2: Atomic wrapper

// src/runtime/atomic_box.rs (新規作成)
use std::sync::atomic::{AtomicPtr, Ordering};
use std::sync::Arc;
use parking_lot::RwLock; // より高速なRwLock

pub struct AtomicBox<T> {
    inner: Arc<RwLock<T>>,
    cache: AtomicPtr<CachedValue>,
}

3. Coroutine実装の実装手順

Step 1: Parser拡張

// src/parser/keywords.rs の修正
pub const RESERVED_WORDS: &[&str] = &[
    // 既存のキーワード...
    "async",
    "await",
];

// src/parser/expressions.rs の修正
fn parse_function_declaration(&mut self) -> Result<ASTNode, ParseError> {
    let is_async = self.consume_keyword("async");
    // 既存のパース処理...
}

Step 2: MIR Coroutine変換

// src/mir/coroutine_transform.rs (新規作成)
pub fn transform_async_function(func: &MirFunction) -> MirFunction {
    // State machine変換のアルゴリズム:
    // 1. await箇所でstateを分割
    // 2. ローカル変数をstate構造体に移動
    // 3. switch文で状態遷移を実装
}

🎯 ChatGPT5への実装指示

Phase 11.5a(最優先)

  1. src/mir/escape_analysis.rsを作成
  2. 基本的なallocation追跡を実装
  3. VM統合でbarrier除去をテスト
  4. ベンチマークで効果測定

Phase 11.5b(次優先)

  1. BoxCore::is_readonly_methodを追加
  2. 主要Boxで実装StringBox, IntegerBox
  3. RwLock移行を段階的に実施

Phase 11.5c(最後)

  1. Parser拡張async/await
  2. 基本的なPromiseBox実装
  3. 簡単なasync関数の動作確認

📊 成功指標

各フェーズの完了基準:

11.5a: Write Barrier除去

  • escape_analysis.rsが動作
  • 簡単なループでbarrier除去確認
  • ベンチマークで30%以上改善

11.5b: Atomic最適化

  • Read-onlyメソッドの識別
  • RwLock使用でread性能向上
  • マルチスレッドベンチマーク改善

11.5c: Coroutine実装

  • async/awaitがパース可能
  • 簡単なasync関数が実行可能
  • Promiseチェーンが動作

🚀 実装開始コマンド

# ブランチ作成
git checkout -b phase-11.5-jit-integration

# テスト駆動開発
cargo test escape_analysis

# ベンチマーク実行
./target/release/nyash --benchmark --iterations 1000

頑張ってください、ChatGPT5これが完成すれば、Nyashは本当に世界クラスの言語になります