📚 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:
@ -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倍高速化実証 ✅
|
||||||
|
|||||||
@ -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:
|
||||||
|
|||||||
255
docs/予定/native-plan/issues/phase_9_77_wasm_emergency.md
Normal file
255
docs/予定/native-plan/issues/phase_9_77_wasm_emergency.md
Normal 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協力)
|
||||||
64
docs/説明書/wasm/README.md
Normal file
64
docs/説明書/wasm/README.md
Normal file
@ -0,0 +1,64 @@
|
|||||||
|
# 🌐 Nyash WASM ガイド
|
||||||
|
|
||||||
|
Nyash WebAssembly(WASM)実行に関する包括的ガイド
|
||||||
|
|
||||||
|
## 📖 ドキュメント一覧
|
||||||
|
|
||||||
|
### 基本ガイド
|
||||||
|
- **[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
|
||||||
194
docs/説明書/wasm/rust-dependency-analysis.md
Normal file
194
docs/説明書/wasm/rust-dependency-analysis.md
Normal 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基盤アプローチ
|
||||||
|
|
||||||
|
### **特徴**
|
||||||
|
- BID(Box 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 # コンパイル済みWASM(Rust不要)
|
||||||
|
├── 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依存脱却を実現し、ブラウザー環境での自由な実行が可能になります。** 🚀
|
||||||
Reference in New Issue
Block a user