Files
hakorune/docs/phases/phase-9/phase_9_77_wasm_emergency.md

6.7 KiB
Raw Blame History

Phase 9.77: WASM緊急復旧 - 詳細実装計画

🎯 概要

BoxCall命令未実装により基本的なNyash機能がWASMで全停止している緊急事態を段階的に解決する。

🚨 現在の緊急問題

1. BoxCall命令未実装 (最高優先度)

症状: 基本的なBox操作が全て使用不可

// ❌ 全て実行不可
toString()    // Box → 文字列変換
print()       // 基本出力
equals()      // 比較
clone()       // 複製

エラー詳細:

❌ WASM compilation error: Unsupported instruction: BoxCall { 
    dst: Some(ValueId(6)), 
    box_val: ValueId(4), 
    method: "toString", 
    args: [], 
    effects: EffectMask(16) 
}

修正ファイル: src/backend/wasm/codegen.rs

2. wasmtimeバージョン互換性問題

症状: AOT(.cwasm)ファイルが実行不可

Error: Module was compiled with incompatible Wasmtime version '18.0.4'
System wasmtime: 35.0.0

原因: Cargo.tomlとシステムwasmtimeの不一致

# Cargo.toml
wasmtime = "18.0"      # ← 古いバージョン

# システム
wasmtime 35.0.0        # ← 新しいバージョン

3. WASM出力バイナリエラー

症状: WAT → WASM変換でUTF-8エラー

❌ Generated WASM is not valid UTF-8

推測原因: WAT生成またはwabt crate連携の問題

📋 詳細実装計画

Phase 1: 緊急復旧 (1週間)

Task 1.1: BoxCall命令実装 (3-4日)

ファイル: src/backend/wasm/codegen.rs

実装アプローチ:

fn generate_box_call(&mut self, box_call: &BoxCall) -> Result<String> {
    match box_call.method.as_str() {
        "toString" => {
            // Box → 文字列変換のWASM実装
            self.generate_to_string_call(box_call)
        }
        "print" => {
            // print関数のWASM実装 
            self.generate_print_call(box_call)
        }
        "equals" => {
            // 比較処理のWASM実装
            self.generate_equals_call(box_call)
        }
        "clone" => {
            // クローン処理のWASM実装
            self.generate_clone_call(box_call)
        }
        _ => Err(format!("Unsupported BoxCall method: {}", box_call.method))
    }
}

fn generate_to_string_call(&mut self, box_call: &BoxCall) -> Result<String> {
    // 1. Box型判定
    // 2. 型に応じた文字列変換
    // 3. StringBox作成・返却
    Ok(format!(r#"
        ;; toString() implementation
        (local.get ${})
        (call $box_to_string)
        (local.set ${})
    "#, 
    self.get_value_local(box_call.box_val),
    self.get_value_local(box_call.dst.unwrap())
    ))
}

テストケース:

// test_boxcall_basic.nyash
local num = 42
local str = num.toString()
print(str)
print("Expected: 42")

Task 1.2: wasmtimeバージョン統一 (1日)

修正: Cargo.toml

# 変更前
wasmtime = "18.0"

# 変更後  
wasmtime = "35.0.0"

互換性確認:

# システムバージョン確認
wasmtime --version

# Cargoバージョン確認
cargo tree | grep wasmtime

# 実行テスト
./target/release/nyash --aot test_simple.nyash
wasmtime --allow-precompiled test_simple.cwasm

Task 1.3: WASM出力エラー修正 (2日)

対象: src/backend/wasm/codegen.rs WAT生成部分

デバッグ手順:

  1. WAT出力の文字エンコーディング確認
  2. wabt crate APIの正しい使用方法確認
  3. バイナリ変換パイプラインの検証

修正例:

// WAT → WASM変換の修正
fn wat_to_wasm(&self, wat_source: &str) -> Result<Vec<u8>> {
    // UTF-8検証を追加
    if !wat_source.is_ascii() {
        return Err("WAT source contains non-ASCII characters".into());
    }
    
    // wabt crate使用方法の修正
    let wasm_bytes = wabt::wat2wasm(wat_source.as_bytes())?;
    Ok(wasm_bytes)
}

Phase 2: 機能拡充 (1週間)

Task 2.1: RuntimeImports完全実装 (3日)

ファイル: src/backend/wasm/runtime.rs

未実装機能:

  • Box メモリ管理 (malloc, free)
  • 型キャスト・変換
  • 配列・Map操作
  • 例外ハンドリング

Task 2.2: メモリ管理改善 (2日)

ファイル: src/backend/wasm/memory.rs

最適化項目:

  • Box ヘッダーサイズ最適化
  • メモリレイアウト効率化
  • 基本的なガベージコレクション

Task 2.3: 統合テスト・検証 (2日)

テストスイート:

# 基本機能テスト
./target/release/nyash --compile-wasm test_boxcall.nyash
./target/release/nyash --compile-wasm test_basic_io.nyash

# AOTテスト
./target/release/nyash --aot test_comprehensive.nyash
wasmtime test_comprehensive.cwasm

# 互換性テスト
./scripts/test_wasm_compatibility.sh

🎯 成功基準・検証方法

Phase 1完了時

  • toString() がWASMで正常動作
  • print() による出力が成功
  • AOT(.cwasm)ファイルが実行可能
  • WASM出力エラーが解消

Phase 2完了時

  • 全基本BoxCall命令が動作
  • メモリ管理が安定動作
  • 統合テストが全て成功
  • 実用的なNyashプログラムがWASMで実行可能

検証用プログラム

// test_wasm_recovery.nyash - 復旧確認用
static box Main {
    main() {
        local console = new ConsoleBox()
        console.log("🎉 WASM復旧テスト開始")
        
        // 基本型テスト
        local num = 42
        local str = num.toString()
        console.log("数値→文字列: " + str)
        
        // Box操作テスト
        local arr = new ArrayBox()
        arr.push("Hello")
        arr.push("WASM")
        console.log("配列長: " + arr.length().toString())
        
        console.log("✅ WASM復旧完了")
        return "success"
    }
}

📊 リスク分析・対策

高リスク

  • BoxCall実装複雑化: 段階的実装で複雑性管理
  • wasmtime API変更: 公式ドキュメント参照、互換性テスト

中リスク

  • メモリ管理不具合: 小規模テストから開始
  • パフォーマンス劣化: ベンチマーク継続測定

対策

  • 毎日ビルドチェック: cargo check で早期発見
  • 段階的リリース: 小さな修正を積み重ね
  • 後戻り計画: Git branchで安全な実験環境

🔗 関連ドキュメント

  • docs/予定/wasm/current_issues.md - 問題詳細分析
  • docs/説明書/reference/box-design/ffi-abi-specification.md - 将来のAPI拡張仕様
  • src/backend/wasm/ - WASM実装ソースコード
  • tests/wasm/ - WASMテストケース

目標: Phase 1完了でWASM基本機能復旧、Nyash WASMが実用レベルに到達 期限: 2週間以内Phase 1: 1週間、Phase 2: 1週間 責任者: Copilot (Claude協力)