📚 Add WASM documentation - Phase 9.77 planning and Rust dependency analysis

- Add docs/説明書/wasm/README.md: WASM comprehensive guide
- Add docs/説明書/wasm/rust-dependency-analysis.md: Detailed Rust dependency analysis
- Add docs/予定/native-plan/issues/phase_9_77_wasm_emergency.md: Emergency recovery plan
- Update copilot_issues.txt: Add Phase 9.77 between 9.75 and 9.8

Phase 9.77 strategy: Manual implementation → FFI foundation (Phase 9.8+)
Both approaches achieve zero Rust runtime dependency via WASM + JavaScript
This commit is contained in:
Moe Charm
2025-08-15 15:24:03 +09:00
parent d634d3f04e
commit de180d2bf5
5 changed files with 592 additions and 14 deletions

View File

@ -1,21 +1,26 @@
# 🎯 現在のタスク (2025-08-15 Phase 9.75D進行中・PR #97 フェーズC完了) # 🎯 現在のタスク (2025-08-15 Phase 10計画完了・実装待機中)
## ✅ **PR #97 フェーズC完了確認済み** ## ✅ **Phase 9.75D完全完了 - 全課題解決済み**
- **核心実装**: clone_box() vs share_box() 責務分離完全実装 ✅ - **核心実装**: clone_box() vs share_box() 責務分離完全実装 ✅
- **変数アクセス修正**: `expressions.rs:108``share_box()` 使用 - **74個の構文エラー**: 全て修正完了Claude + Task先生協調
- **主要Box修正**: ArrayBox, MapBox, BufferBox, SocketBox で Arc<RwLock> + share_box() 実装済み - **17個の欠如実装**: 全てのshare_box()メソッド追加完了
- **状態保持テスト**: 新規追加、ArrayBox状態保持問題の根本解決確認 - **traitsファイル統合**: 重複ファイル削除、src/box_trait.rs単一化
- **ビルド状況**: `cargo check` 成功(エラーなし、警告のみ) ✅
## 🚨 **現在の課題: 74個の構文エラー修正中** ## 🚀 **Phase 10: Classic C Applications Migration - Issue #98作成完了**
**問題**: 仮実装された20個のBox型で `share_box()` メソッドの構文エラー **GitHub Issue**: https://github.com/moe-charm/nyash/issues/98
- **原因**: `clone_box()` 内に `share_box()` が誤挿入される構文問題 **移植計画**: 3つの実用Cアプリケーション同時移植プロジェクト
- **進捗**: NullBox, ConsoleBox, TimerBox修正完了 (3/20)
- **残り**: 17個のBox型で同様の構文修正が必要
## 🎯 **フェーズD準備完了状況** ### 📦 **移植対象アプリケーション**
**成功部分**: ArrayBox状態保持問題の根本解決完了 1. **🌐 Tinyproxy** - ゼロコピー判定機能実証HTTPプロキシサーバー
**Gemini設計**: clone_box(値) vs share_box(参照) 責務分離アーキテクチャ実装済み 2. **🎮 Chip-8エミュレーター** - fini伝播・weak参照実戦テスト
**次段階**: 構文エラー修正完了後、VM/WASMバックエンド対応フェーズD 3. **✏️ kilo テキストエディター** - 「うっかり全体コピー」検出機能
### 🛠️ **新API要件実装予定**
- **ゼロコピー判定**: `BufferBox.is_shared_with()`, `share_reference()`
- **fini伝播システム**: 依存オブジェクト自動クリーンアップ
- **weak参照**: `WeakBox.is_alive()`, 循環参照防止
- **メモリ効率監視**: `Box.memory_footprint()`, リアルタイム警告
## 📈 **完了済みPhase要約** ## 📈 **完了済みPhase要約**
- **Phase 8**: MIR/WASM基盤構築、13.5倍高速化実証 ✅ - **Phase 8**: MIR/WASM基盤構築、13.5倍高速化実証 ✅

View File

@ -307,6 +307,66 @@ References:
------------------------------------------------------------ ------------------------------------------------------------
## ⚡ Phase 9.77: WASM緊急復旧 - BoxCall/wasmtime/基本機能復活(最優先)
Summary:
- BoxCall命令未実装により基本的なBox操作toString, print等がWASMで全停止している緊急事態を解決
- wasmtimeバージョン互換性問題によるAOT実行失敗を修正
- WASM出力エラーを根本解決し、実用的なWASM実行環境を復旧
Priority: **Critical** (Phase 9.75完了直後・全Phase前提条件)
Expected Duration: 1-2週間
GitHub Issue: 予定
### 🚨 緊急問題の現状
**基本機能全停止**:
```nyash
// ❌ 現在WASMで実行不可
local result = value.toString() // BoxCall未実装
print("Hello") // 基本出力不可
```
**エラー例**:
```bash
❌ WASM compilation error: Unsupported instruction: BoxCall
❌ Module was compiled with incompatible Wasmtime version '18.0.4' vs '35.0.0'
❌ Generated WASM is not valid UTF-8
```
### 📋 実装計画(段階的復旧)
#### Phase 1: 基本機能復旧1週間
- [ ] **BoxCall命令実装** - toString(), print()等の基本メソッド
- [ ] **wasmtimeバージョン統一** - Cargo.toml更新、互換性確保
- [ ] **WASM出力エラー修正** - WAT→WASM変換修正
#### Phase 2: 機能拡充1週間
- [ ] **RuntimeImports完全実装** - Box メモリ管理、型変換
- [ ] **メモリ管理改善** - レイアウト最適化、ガベージコレクション
### 🤖 Copilot協力期待
- BoxCall→WASM命令変換の効率実装
- wasmtimeバージョン管理の自動化
- WASM出力パイプライン修正
- メモリ管理最適化
### 成功基準
- [ ] **基本動作復旧**: toString(), print()がWASMで動作
- [ ] **AOT実行成功**: .cwasmファイルが正常実行
- [ ] **WASM出力成功**: バイナリエラーなし
- [ ] **互換性確保**: バージョン依存問題解決
### 期待される効果
- **即時価値**: NyashがWASMで実用可能に復帰
- **開発継続**: 他Phase実装の前提条件満足
- **ユーザー満足**: 基本機能の確実な動作保証
References:
- docs/予定/wasm/current_issues.md現在の問題詳細分析
- docs/予定/native-plan/issues/phase_9_77_wasm_emergency.md詳細実装計画
------------------------------------------------------------
## 📦 Phase 9.8: BIDレジストリ + 自動コード生成ツールWASM/VM/LLVM/言語) ## 📦 Phase 9.8: BIDレジストリ + 自動コード生成ツールWASM/VM/LLVM/言語)
Summary: Summary:

View File

@ -0,0 +1,255 @@
# Phase 9.77: WASM緊急復旧 - 詳細実装計画
## 🎯 概要
BoxCall命令未実装により基本的なNyash機能がWASMで全停止している緊急事態を段階的に解決する。
## 🚨 現在の緊急問題
### 1. **BoxCall命令未実装** (最高優先度)
**症状**: 基本的なBox操作が全て使用不可
```nyash
// ❌ 全て実行不可
toString() // Box → 文字列変換
print() // 基本出力
equals() // 比較
clone() // 複製
```
**エラー詳細**:
```bash
❌ 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)ファイルが実行不可
```bash
Error: Module was compiled with incompatible Wasmtime version '18.0.4'
System wasmtime: 35.0.0
```
**原因**: Cargo.tomlとシステムwasmtimeの不一致
```toml
# Cargo.toml
wasmtime = "18.0" # ← 古いバージョン
# システム
wasmtime 35.0.0 # ← 新しいバージョン
```
### 3. **WASM出力バイナリエラー**
**症状**: WAT → WASM変換でUTF-8エラー
```bash
❌ Generated WASM is not valid UTF-8
```
**推測原因**: WAT生成またはwabt crate連携の問題
## 📋 詳細実装計画
### Phase 1: 緊急復旧 (1週間)
#### Task 1.1: BoxCall命令実装 (3-4日)
**ファイル**: `src/backend/wasm/codegen.rs`
**実装アプローチ**:
```rust
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())
))
}
```
**テストケース**:
```nyash
// test_boxcall_basic.nyash
local num = 42
local str = num.toString()
print(str)
print("Expected: 42")
```
#### Task 1.2: wasmtimeバージョン統一 (1日)
**修正**: `Cargo.toml`
```toml
# 変更前
wasmtime = "18.0"
# 変更後
wasmtime = "35.0.0"
```
**互換性確認**:
```bash
# システムバージョン確認
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. バイナリ変換パイプラインの検証
**修正例**:
```rust
// 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日)
**テストスイート**:
```bash
# 基本機能テスト
./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で実行可能
### 検証用プログラム
```nyash
// 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協力)

View File

@ -0,0 +1,64 @@
# 🌐 Nyash WASM ガイド
Nyash WebAssemblyWASM実行に関する包括的ガイド
## 📖 ドキュメント一覧
### 基本ガイド
- **[Rust依存性分析](rust-dependency-analysis.md)** - 実行時Rust依存性の詳細分析
- **[Phase比較](phase-comparison.md)** - 9.77手動実装 vs 9.8+FFI基盤の比較
- **[配布ガイド](deployment-guide.md)** - WASM配布・実行方法
### 技術仕様
- **[FFI/BIDチュートリアル](ffi-bid-tutorial.md)** - 外部API統合方法
- **[メモリ管理](memory-management.md)** - WASM メモリレイアウト・最適化
## 🚀 クイックスタート
### WASM コンパイル
```bash
# 基本コンパイル
./target/release/nyash --compile-wasm program.nyash
# AOT コンパイル(配布用)
./target/release/nyash --aot program.nyash
```
### ブラウザー実行
```html
<!DOCTYPE html>
<html>
<body>
<script>
WebAssembly.instantiateStreaming(fetch('program.wasm'), importObject)
.then(instance => instance.exports.main());
</script>
</body>
</html>
```
## 🎯 実行方式選択
| 用途 | 方式 | コマンド |
|------|------|----------|
| **開発・テスト** | インタープリター | `nyash program.nyash` |
| **高速実行** | VM | `nyash --backend vm program.nyash` |
| **Web配布** | WASM | `nyash --compile-wasm program.nyash` |
| **ネイティブ配布** | AOT | `nyash --aot program.nyash` |
## 📊 性能比較
| バックエンド | 実行速度 | 配布サイズ | 依存関係 |
|-------------|----------|------------|----------|
| インタープリター | 1x | - | Rust |
| VM | 20.4x | - | Rust |
| **WASM** | **13.5x** | **小** | **なし** |
| AOT | 目標1000x+ | 小 | なし |
## 🔗 関連ドキュメント
- [言語ガイド](../LANGUAGE_GUIDE.md)
- [実行バックエンド](../execution-backends.md)
- [ビルドガイド](../build/README.md)
---
**最終更新**: 2025-08-15

View File

@ -0,0 +1,194 @@
# 🔍 Nyash WASM実行におけるRust依存性分析
## 📅 最終更新: 2025-08-15
## 🎯 概要
Nyash WASMの実行時Rust依存性について、Phase 9.77手動実装とPhase 9.8+FFI基盤を比較分析し、真のRust依存脱却の実現方法を解説。
## 🔍 重要な発見: 実行時Rust依存性は**ゼロ**
### **結論**
**どちらの方式でも実行時Rust依存はなし**
| 方式 | コンパイル時 | 実行時 | 配布ファイル |
|------|-------------|--------|-------------|
| **Phase 9.77 (手動)** | ❌ Rust必要 | ✅ **Rust不要** | .wasm + .js のみ |
| **Phase 9.8+ (FFI)** | ❌ Rust必要 | ✅ **Rust不要** | .wasm + .js のみ |
## 🛠️ Phase 9.77: 手動実装アプローチ
### **特徴**
- 基本的なCanvas/Console操作を手動でWASM import実装
- 緊急復旧に最適1-2週間で完了
- 実行時はWASM + JavaScriptのみ
### **実行時依存関係**
```mermaid
graph LR
A[ブラウザー] --> B[app.wasm]
A --> C[importObject.js]
B --> C
style A fill:#4ecdc4
style B fill:#f9ca24
style C fill:#f0932b
```
### **生成例**
```bash
# コンパイル時 - Rust必要
cargo build --target wasm32-unknown-unknown
# → app.wasm 生成
# 実行時 - Rust完全不要
# ブラウザーでWASM + JavaScriptのみ
```
## 🚀 Phase 9.8+: FFI基盤アプローチ
### **特徴**
- BIDBox Interface Definitionからの自動生成
- 新API追加が数分で完了
- 長期開発効率の飛躍的向上
### **自動生成フロー**
```mermaid
graph TD
A[BID YAML定義] --> B[nyash bid gen]
B --> C[WASM import宣言]
B --> D[JavaScript実装]
B --> E[Rust生成コード]
C --> F[配布: WASM + JS]
D --> F
style F fill:#2ed573
```
### **生成コマンド**
```bash
# BID定義から自動生成
nyash bid gen --target wasm bid/canvas.yaml
# コンパイル
cargo build --target wasm32-unknown-unknown
# 実行時 - Rust完全不要
# 同じくWASM + JavaScriptのみ
```
## 📦 配布ファイル構成(共通)
どちらの方式でも、配布時は以下のファイルのみ:
```
my_nyash_app/
├── app.wasm # コンパイル済みWASMRust不要
├── runtime.js # importObject実装JavaScript
├── index.html # HTMLページ
└── README.md # 使用説明
```
## 🌐 実際の実行例
### **HTMLファイル**Rust一切不要
```html
<!DOCTYPE html>
<html>
<head><title>Nyash App</title></head>
<body>
<canvas id="gameCanvas" width="400" height="300"></canvas>
<script src="runtime.js"></script>
<script>
// WASMロード・実行Rust依存なし
WebAssembly.instantiateStreaming(
fetch('app.wasm'),
importObject
).then(instance => {
instance.exports.main();
});
</script>
</body>
</html>
```
### **実行環境要件**
- ✅ モダンブラウザーChrome, Firefox, Safari, Edge
- ✅ WebAssembly対応
- ❌ Rust不要
- ❌ Node.js不要
- ❌ 特別なランタイム不要
## 📊 方式比較詳細
| 評価軸 | Phase 9.77 手動 | Phase 9.8+ FFI |
|--------|-----------------|----------------|
| **実行時Rust依存** | ❌ なし | ❌ なし |
| **配布ファイル** | WASM + JS | WASM + JS |
| **開発時間** | 1-2週間 | 3-4週間 |
| **API追加工数** | 数時間(手動) | 数分(自動) |
| **保守性** | 低 | 高 |
| **拡張性** | 限定的 | 無制限 |
| **学習コスト** | 中 | 高 |
## 🎯 実用的選択指針
### **Phase 9.77を選ぶべき場合**
-**即座にRust依存脱却したい**
-**基本的なCanvas/Console操作で十分**
-**短期プロジェクト**
-**学習コスト最小化**
### **Phase 9.8+を選ぶべき場合**
-**長期開発プロジェクト**
-**多様な外部API統合が必要**
-**チーム開発**
-**API拡張の自動化が重要**
## 💡 戦略的アプローチ
### **段階的進化パス**
```mermaid
graph LR
A[現在: Rust依存] --> B[Phase 9.77: 手動WASM]
B --> C[Phase 9.8+: FFI基盤]
C --> D[完全自動化]
style A fill:#ff6b6b
style B fill:#f9ca24
style C fill:#4ecdc4
style D fill:#2ed573
```
### **推奨戦略**
1. **Phase 9.77**: 手動実装で即座にRust依存脱却
2. **検証**: 実用性・性能確認
3. **Phase 9.8+**: 必要に応じてFFI基盤へ移行
## 🎉 期待される効果
### **即時効果Phase 9.77**
- **Rust依存完全排除**(実行時)
- **配布の簡素化**
- **ブラウザー単体実行**
- **学習コスト削減**
### **長期効果Phase 9.8+**
- **開発効率の飛躍的向上**
- **API拡張の自動化**
- **チーム開発の標準化**
- **エコシステム拡充**
## 🔗 関連ドキュメント
### **技術仕様**
- [FFI/ABI仕様](../reference/box-design/ffi-abi-specification.md)
- [実行バックエンド](../execution-backends.md)
### **実装計画**
- [Phase 9.77詳細](../../予定/native-plan/issues/phase_9_77_wasm_emergency.md)
- [Copilot Issues](../../予定/native-plan/copilot_issues.txt)
### **問題分析**
- [WASM現在の問題](../../予定/wasm/current_issues.md)
---
**この分析により、NyashはWASMを通じて真のRust依存脱却を実現し、ブラウザー環境での自由な実行が可能になります。** 🚀