feat(plugin): Fix plugin BoxRef return and Box argument support
- Fixed deadlock in FileBox plugin copyFrom implementation (single lock) - Added TLV Handle (tag=8) parsing in calls.rs for returned BoxRefs - Improved plugin loader with config path consistency and detailed logging - Fixed loader routing for proper Handle type_id/fini_method_id resolution - Added detailed logging for TLV encoding/decoding in plugin_loader_v2 Test docs/examples/plugin_boxref_return.nyash now works correctly: - cloneSelf() returns FileBox Handle properly - copyFrom(Box) accepts plugin Box arguments - Both FileBox instances close and fini correctly 🤖 Generated with [Claude Code](https://claude.ai/code) Co-Authored-By: Claude <noreply@anthropic.com>
This commit is contained in:
64
docs/guides/wasm-guide/README.md
Normal file
64
docs/guides/wasm-guide/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
|
||||
23
docs/guides/wasm-guide/planning/README.md
Normal file
23
docs/guides/wasm-guide/planning/README.md
Normal file
@ -0,0 +1,23 @@
|
||||
# 🌐 WASM/AOT WASM 問題・課題管理
|
||||
|
||||
## 📁 フォルダ概要
|
||||
NyashのWebAssembly(WASM)およびAOT WASM機能の問題点、制限事項、今後の改善計画を管理します。
|
||||
|
||||
## 📋 ドキュメント一覧
|
||||
|
||||
### 現在の問題・制限
|
||||
- **[current_issues.md](current_issues.md)**: 現在発生中の技術的問題
|
||||
- **[compatibility_matrix.md](compatibility_matrix.md)**: wasmtimeバージョン互換性マトリクス
|
||||
- **[unsupported_features.md](unsupported_features.md)**: 未実装MIR命令・機能一覧
|
||||
|
||||
### 改善計画
|
||||
- **[improvement_roadmap.md](improvement_roadmap.md)**: WASM/AOT機能改善計画
|
||||
- **[optimization_targets.md](optimization_targets.md)**: 性能最適化目標
|
||||
|
||||
### 技術仕様
|
||||
- **[wasm_backend_spec.md](wasm_backend_spec.md)**: WASM Backend詳細仕様
|
||||
- **[aot_pipeline_spec.md](aot_pipeline_spec.md)**: AOT変換パイプライン仕様
|
||||
|
||||
---
|
||||
|
||||
**目標**: NyashのWASM/AOT機能を Production Ready レベルまで向上させる
|
||||
185
docs/guides/wasm-guide/planning/compatibility_matrix.md
Normal file
185
docs/guides/wasm-guide/planning/compatibility_matrix.md
Normal file
@ -0,0 +1,185 @@
|
||||
# 🔄 wasmtime互換性マトリクス
|
||||
|
||||
## 📅 最終更新: 2025-08-15
|
||||
|
||||
## 🎯 **現在の状況**
|
||||
|
||||
### 開発環境
|
||||
```toml
|
||||
# Cargo.toml
|
||||
wasmtime = "18.0"
|
||||
wabt = "0.10"
|
||||
```
|
||||
|
||||
### 実行環境
|
||||
```bash
|
||||
# システムインストール
|
||||
wasmtime 35.0.0 (509af9e5f 2025-07-22)
|
||||
```
|
||||
|
||||
### 互換性状況
|
||||
❌ **非互換**: 18.0.4 vs 35.0.0 - 実行不可
|
||||
|
||||
---
|
||||
|
||||
## 📊 **バージョン互換性マトリクス**
|
||||
|
||||
| Nyash wasmtime | System wasmtime | 互換性 | 状況 | 対応 |
|
||||
|----------------|-----------------|--------|------|------|
|
||||
| **18.0.4** | **35.0.0** | ❌ | 現在 | 要修正 |
|
||||
| 35.0.x | 35.0.x | ✅ | 目標 | 推奨 |
|
||||
| 34.0.x | 35.0.x | ⚠️ | 検証必要 | テスト |
|
||||
| 33.0.x | 35.0.x | ❌ | 古すぎ | 非推奨 |
|
||||
|
||||
---
|
||||
|
||||
## 🔧 **修正オプション**
|
||||
|
||||
### Option A: Nyash側更新 (推奨)
|
||||
```toml
|
||||
# Cargo.toml - 更新案
|
||||
wasmtime = "35.0"
|
||||
wabt = "0.10" # 互換性確認必要
|
||||
```
|
||||
|
||||
**メリット**:
|
||||
- ✅ 最新機能・性能向上
|
||||
- ✅ セキュリティ修正取り込み
|
||||
- ✅ 将来性
|
||||
|
||||
**リスク**:
|
||||
- ⚠️ API変更による修正必要
|
||||
- ⚠️ 既存.cwasmファイル互換性喪失
|
||||
|
||||
### Option B: システム側ダウングレード
|
||||
```bash
|
||||
# wasmtime 18.0.4 をインストール
|
||||
curl -sSf https://wasmtime.dev/install.sh | bash -s -- --version 18.0.4
|
||||
```
|
||||
|
||||
**メリット**:
|
||||
- ✅ Nyashコード修正不要
|
||||
- ✅ 即座対応可能
|
||||
|
||||
**デメリット**:
|
||||
- ❌ 古いバージョン使用
|
||||
- ❌ セキュリティリスク
|
||||
- ❌ 他プロジェクトへの影響
|
||||
|
||||
---
|
||||
|
||||
## 🎯 **推奨対応手順**
|
||||
|
||||
### Step 1: 依存関係調査 (30分)
|
||||
```bash
|
||||
# 現在の依存関係確認
|
||||
cargo tree | grep wasmtime
|
||||
cargo tree | grep wabt
|
||||
|
||||
# API変更点調査
|
||||
# https://github.com/bytecodealliance/wasmtime/releases
|
||||
```
|
||||
|
||||
### Step 2: テスト環境構築 (30分)
|
||||
```bash
|
||||
# ブランチ作成
|
||||
git checkout -b feature/wasmtime-35-upgrade
|
||||
|
||||
# Cargo.toml更新
|
||||
# wasmtime = "35.0"
|
||||
|
||||
# 依存関係更新
|
||||
cargo update
|
||||
```
|
||||
|
||||
### Step 3: ビルド修正 (2-4時間)
|
||||
予想される修正箇所:
|
||||
- `src/backend/aot/compiler.rs`: Engine設定API
|
||||
- `src/backend/wasm/mod.rs`: Module生成API
|
||||
- `src/backend/aot/config.rs`: Config構造変更
|
||||
|
||||
### Step 4: 動作確認 (1時間)
|
||||
```bash
|
||||
# 基本コンパイル
|
||||
cargo build --release
|
||||
|
||||
# WASM/AOT テスト
|
||||
./target/release/nyash --aot test_simple.nyash
|
||||
wasmtime --allow-precompiled test_simple.cwasm
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 📋 **wasmtime API変更予想箇所**
|
||||
|
||||
### 18.x → 35.x 主要変更点
|
||||
|
||||
#### Engine/Store API
|
||||
```rust
|
||||
// 18.x (予想)
|
||||
let engine = Engine::default();
|
||||
let store = Store::new(&engine, ());
|
||||
|
||||
// 35.x (要確認)
|
||||
let engine = Engine::new(&Config::default())?;
|
||||
let mut store = Store::new(&engine, ());
|
||||
```
|
||||
|
||||
#### Module serialize/deserialize
|
||||
```rust
|
||||
// 18.x
|
||||
module.serialize()?;
|
||||
Module::deserialize(&engine, bytes)?;
|
||||
|
||||
// 35.x (API変更可能性)
|
||||
module.serialize()?; // 戻り値型変更?
|
||||
unsafe { Module::deserialize(&engine, bytes)? } // unsafe要求?
|
||||
```
|
||||
|
||||
#### Config API
|
||||
```rust
|
||||
// 18.x
|
||||
let config = Config::new();
|
||||
|
||||
// 35.x
|
||||
let mut config = Config::new();
|
||||
config.cranelift_opt_level(OptLevel::Speed)?;
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## ✅ **アクションアイテム**
|
||||
|
||||
### 緊急 (今日)
|
||||
- [ ] wasmtime 35.0 API ドキュメント確認
|
||||
- [ ] 修正工数見積もり (2-8時間予想)
|
||||
|
||||
### 短期 (今週)
|
||||
- [ ] **wasmtime 35.0 への更新実装**
|
||||
- [ ] 全WASM/AOT機能のテスト実行
|
||||
- [ ] 互換性問題解決
|
||||
|
||||
### 中期 (来週)
|
||||
- [ ] wasmtime自動バージョン検知機能
|
||||
- [ ] CI/CDでの互換性テスト自動化
|
||||
|
||||
---
|
||||
|
||||
## 🎯 **成功指標**
|
||||
|
||||
### 技術指標
|
||||
```bash
|
||||
# ✅ 成功条件
|
||||
./target/release/nyash --aot test.nyash # コンパイル成功
|
||||
wasmtime --allow-precompiled test.cwasm # 実行成功
|
||||
echo $? # 0 (正常終了)
|
||||
```
|
||||
|
||||
### 性能指標
|
||||
- コンパイル時間: 18.x と同等以上
|
||||
- 実行速度: 18.x と同等以上
|
||||
- メモリ使用量: 18.x と同等以下
|
||||
|
||||
---
|
||||
|
||||
**🚀 Next Action**: wasmtime 35.0 へのアップグレード実装を最優先で開始
|
||||
176
docs/guides/wasm-guide/planning/current_issues.md
Normal file
176
docs/guides/wasm-guide/planning/current_issues.md
Normal file
@ -0,0 +1,176 @@
|
||||
# 🚨 WASM/AOT WASM 現在の問題・制限事項
|
||||
|
||||
## 📅 最終更新: 2025-08-15
|
||||
|
||||
## 🔴 **緊急度: 高**
|
||||
|
||||
### 1. **BoxCall命令未実装**
|
||||
**問題**: `toString()`, `print()` 等のBox メソッド呼び出しがWASMで未対応
|
||||
|
||||
**エラー例**:
|
||||
```bash
|
||||
❌ WASM compilation error: Unsupported instruction: BoxCall {
|
||||
dst: Some(ValueId(6)),
|
||||
box_val: ValueId(4),
|
||||
method: "toString",
|
||||
args: [],
|
||||
effects: EffectMask(16)
|
||||
}
|
||||
```
|
||||
|
||||
**影響範囲**:
|
||||
- 基本的なBox操作(toString, print等)が全て使用不可
|
||||
- 実用的なNyashプログラムがWASMでコンパイル不可
|
||||
|
||||
**修正必要ファイル**:
|
||||
- `src/backend/wasm/codegen.rs`: BoxCall命令の実装
|
||||
|
||||
---
|
||||
|
||||
### 2. **wasmtimeバージョン互換性問題**
|
||||
**問題**: コンパイル時wasmtimeとシステムwasmtimeのバージョン不一致
|
||||
|
||||
**エラー例**:
|
||||
```bash
|
||||
Error: Module was compiled with incompatible Wasmtime version '18.0.4'
|
||||
System wasmtime: 35.0.0
|
||||
```
|
||||
|
||||
**原因**:
|
||||
```toml
|
||||
# Cargo.toml
|
||||
wasmtime = "18.0" # コンパイル時
|
||||
|
||||
# システム
|
||||
wasmtime 35.0.0 # 実行時
|
||||
```
|
||||
|
||||
**影響**:
|
||||
- AOT (.cwasm) ファイルが実行不可
|
||||
- 配布用実行ファイル生成失敗
|
||||
|
||||
**修正策**:
|
||||
1. **短期**: Cargo.tomlのwasmtimeバージョン更新
|
||||
2. **長期**: 互換性保証メカニズム実装
|
||||
|
||||
---
|
||||
|
||||
### 3. **WASM出力バイナリエラー**
|
||||
**問題**: WAT → WASM変換でUTF-8エラー発生
|
||||
|
||||
**エラー例**:
|
||||
```bash
|
||||
❌ Generated WASM is not valid UTF-8
|
||||
```
|
||||
|
||||
**推測原因**:
|
||||
- WAT形式の生成に問題
|
||||
- wabt crateとの連携ミス
|
||||
|
||||
**修正必要箇所**:
|
||||
- `src/backend/wasm/codegen.rs`: WAT生成ロジック
|
||||
- WASM バイナリ出力パイプライン
|
||||
|
||||
---
|
||||
|
||||
## 🟠 **緊急度: 中**
|
||||
|
||||
### 4. **RuntimeImports未実装機能**
|
||||
**問題**: WASMで必要なランタイム関数が部分実装
|
||||
|
||||
**未実装機能**:
|
||||
- Box メモリ管理 (malloc, free)
|
||||
- 型キャスト・変換
|
||||
- 配列・Map操作
|
||||
- 例外ハンドリング
|
||||
|
||||
**ファイル**: `src/backend/wasm/runtime.rs`
|
||||
|
||||
---
|
||||
|
||||
### 5. **メモリ管理最適化不足**
|
||||
**問題**: WASMメモリレイアウトが非効率
|
||||
|
||||
**課題**:
|
||||
- Box ヘッダーサイズ固定 (12 bytes)
|
||||
- ガベージコレクション未実装
|
||||
- メモリ断片化対策なし
|
||||
|
||||
**ファイル**: `src/backend/wasm/memory.rs`
|
||||
|
||||
---
|
||||
|
||||
## 🟡 **緊急度: 低**
|
||||
|
||||
### 6. **デバッグ情報不足**
|
||||
**問題**: WASM実行時のエラー情報が不十分
|
||||
|
||||
**改善点**:
|
||||
- ソースマップ生成
|
||||
- スタックトレース詳細化
|
||||
- ブレークポイント対応
|
||||
|
||||
---
|
||||
|
||||
### 7. **最適化機能未実装**
|
||||
**問題**: WASM出力が最適化されていない
|
||||
|
||||
**未実装最適化**:
|
||||
- デッドコード除去
|
||||
- インライン展開
|
||||
- 定数畳み込み
|
||||
|
||||
---
|
||||
|
||||
## 📊 **問題優先度マトリクス**
|
||||
|
||||
| 問題 | 緊急度 | 重要度 | 修正工数 | 優先順位 |
|
||||
|------|--------|--------|----------|----------|
|
||||
| BoxCall未実装 | 高 | 高 | 中 | **1** |
|
||||
| wasmtimeバージョン | 高 | 高 | 低 | **2** |
|
||||
| WASM出力エラー | 高 | 中 | 中 | **3** |
|
||||
| RuntimeImports | 中 | 高 | 高 | **4** |
|
||||
| メモリ管理 | 中 | 中 | 高 | **5** |
|
||||
| デバッグ情報 | 低 | 中 | 中 | **6** |
|
||||
| 最適化 | 低 | 低 | 高 | **7** |
|
||||
|
||||
## 🎯 **修正ロードマップ**
|
||||
|
||||
### Phase 1: 基本機能復旧 (1週間)
|
||||
1. **BoxCall命令実装**
|
||||
2. **wasmtimeバージョン統一**
|
||||
3. **WASM出力エラー修正**
|
||||
|
||||
### Phase 2: 機能拡充 (2週間)
|
||||
4. **RuntimeImports完全実装**
|
||||
5. **メモリ管理改善**
|
||||
|
||||
### Phase 3: 品質向上 (1週間)
|
||||
6. **デバッグ情報強化**
|
||||
7. **基本最適化実装**
|
||||
|
||||
## 📝 **テスト必要項目**
|
||||
|
||||
### 基本動作テスト
|
||||
```bash
|
||||
# BoxCall テスト
|
||||
./target/release/nyash --compile-wasm test_boxcall.nyash
|
||||
|
||||
# AOT テスト
|
||||
./target/release/nyash --aot test_simple.nyash
|
||||
wasmtime --allow-precompiled test_simple.cwasm
|
||||
```
|
||||
|
||||
### 互換性テスト
|
||||
```bash
|
||||
# バージョン確認
|
||||
cargo tree | grep wasmtime
|
||||
wasmtime --version
|
||||
|
||||
# 実行テスト
|
||||
wasmtime test_output.wasm
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
**🎯 目標**: Phase 1完了でWASM基本機能復旧、Nyash WASMが実用レベルに到達
|
||||
228
docs/guides/wasm-guide/planning/unsupported_features.md
Normal file
228
docs/guides/wasm-guide/planning/unsupported_features.md
Normal file
@ -0,0 +1,228 @@
|
||||
# 🚫 WASM Backend 未実装機能一覧
|
||||
|
||||
## 📅 最終更新: 2025-08-15
|
||||
|
||||
## 🎯 **概要**
|
||||
NyashのWASM Backend で現在未実装のMIR命令・機能・Nyash言語機能を体系的にまとめました。
|
||||
|
||||
---
|
||||
|
||||
## 🔴 **緊急度: 高 - 基本機能**
|
||||
|
||||
### 1. **BoxCall命令**
|
||||
**MIR命令**: `BoxCall { dst, box_val, method, args, effects }`
|
||||
|
||||
**未実装メソッド**:
|
||||
```rust
|
||||
// 基本Box操作
|
||||
toString() // ❌ 文字列変換
|
||||
equals(other) // ❌ 等価比較
|
||||
clone() // ❌ オブジェクト複製
|
||||
|
||||
// StringBox
|
||||
length() // ❌ 文字列長
|
||||
substring(start, end) // ❌ 部分文字列
|
||||
indexOf(str) // ❌ 文字列検索
|
||||
|
||||
// IntegerBox/Math
|
||||
add(other) // ❌ 加算
|
||||
subtract(other) // ❌ 減算
|
||||
multiply(other) // ❌ 乗算
|
||||
divide(other) // ❌ 除算
|
||||
|
||||
// ArrayBox
|
||||
push(item) // ❌ 要素追加
|
||||
pop() // ❌ 要素削除
|
||||
get(index) // ❌ 要素取得
|
||||
length() // ❌ 配列長
|
||||
|
||||
// ConsoleBox
|
||||
log(message) // ❌ コンソール出力
|
||||
warn(message) // ❌ 警告出力
|
||||
error(message) // ❌ エラー出力
|
||||
```
|
||||
|
||||
**修正ファイル**: `src/backend/wasm/codegen.rs`
|
||||
|
||||
---
|
||||
|
||||
### 2. **ExternCall命令**
|
||||
**MIR命令**: `ExternCall { dst, extern_name, method, args, effects }`
|
||||
|
||||
**未実装機能**:
|
||||
```rust
|
||||
// ブラウザーAPI
|
||||
console_log(msg) // ❌ JavaScript console.log
|
||||
canvas_fillRect() // ❌ Canvas描画
|
||||
fetch(url) // ❌ HTTP通信
|
||||
|
||||
// システムAPI
|
||||
file_read(path) // ❌ ファイル読み取り
|
||||
file_write(path, data) // ❌ ファイル書き込み
|
||||
```
|
||||
|
||||
**修正ファイル**: `src/backend/wasm/runtime.rs`
|
||||
|
||||
---
|
||||
|
||||
## 🟠 **緊急度: 中 - 制御フロー**
|
||||
|
||||
### 3. **条件分岐最適化**
|
||||
**MIR命令**: `Branch`, `Jump`, `Compare`
|
||||
|
||||
**問題**:
|
||||
- ネストした条件分岐のブロック管理
|
||||
- Switch文相当の最適化
|
||||
- 短絡評価 (and, or) の効率化
|
||||
|
||||
### 4. **ループ最適化**
|
||||
**MIR命令**: `Loop`, `Phi`
|
||||
|
||||
**未実装**:
|
||||
- ループ内変数の最適化
|
||||
- 無限ループ検出・対策
|
||||
- ループアンローリング
|
||||
|
||||
---
|
||||
|
||||
## 🟡 **緊急度: 低 - 高級機能**
|
||||
|
||||
### 5. **メモリ管理高級機能**
|
||||
**未実装機能**:
|
||||
```rust
|
||||
// 弱参照
|
||||
WeakNew, WeakLoad, WeakCheck // ❌ 弱参照システム
|
||||
|
||||
// メモリ同期
|
||||
MemCopy, AtomicFence // ❌ メモリ操作・同期
|
||||
|
||||
// ガベージコレクション
|
||||
// 自動メモリ解放、循環参照検出
|
||||
```
|
||||
|
||||
### 6. **並行処理**
|
||||
**未実装機能**:
|
||||
```rust
|
||||
// 非同期・並行
|
||||
Send, Recv // ❌ メッセージパッシング
|
||||
Safepoint // ❌ GC安全点
|
||||
|
||||
// スレッド・タスク
|
||||
spawn_task() // ❌ タスク生成
|
||||
await_result() // ❌ 非同期待機
|
||||
```
|
||||
|
||||
### 7. **例外処理**
|
||||
**未実装機能**:
|
||||
```rust
|
||||
// 例外・エラーハンドリング
|
||||
try_catch() // ❌ 例外キャッチ
|
||||
throw_error() // ❌ 例外スロー
|
||||
finally_block() // ❌ finally実行
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 📊 **実装優先度マトリクス**
|
||||
|
||||
| 機能カテゴリ | 緊急度 | 実装工数 | ユーザー影響 | 優先順位 |
|
||||
|--------------|--------|----------|--------------|----------|
|
||||
| **BoxCall基本** | 高 | 中 | 致命的 | **1** |
|
||||
| **ExternCall** | 高 | 高 | 高 | **2** |
|
||||
| **条件分岐** | 中 | 低 | 中 | **3** |
|
||||
| **ループ最適化** | 中 | 中 | 中 | **4** |
|
||||
| **メモリ管理** | 低 | 高 | 低 | **5** |
|
||||
| **並行処理** | 低 | 高 | 低 | **6** |
|
||||
| **例外処理** | 低 | 中 | 低 | **7** |
|
||||
|
||||
---
|
||||
|
||||
## 🛠️ **実装戦略**
|
||||
|
||||
### Phase 1: BoxCall基本実装 (1週間)
|
||||
```rust
|
||||
// 目標: 基本的なNyashプログラムがWASMで動作
|
||||
impl WasmCodegen {
|
||||
fn generate_box_call(&mut self, dst: Option<ValueId>, box_val: ValueId,
|
||||
method: &str, args: Vec<ValueId>) -> Result<(), WasmError> {
|
||||
match method {
|
||||
"toString" => self.generate_to_string_call(dst, box_val),
|
||||
"equals" => self.generate_equals_call(dst, box_val, args),
|
||||
"length" => self.generate_length_call(dst, box_val),
|
||||
// ... 基本メソッド追加
|
||||
_ => Err(WasmError::UnsupportedInstruction(format!("Unknown method: {}", method)))
|
||||
}
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
### Phase 2: ExternCall統合 (2週間)
|
||||
```rust
|
||||
// 目標: ブラウザーとの連携動作
|
||||
impl RuntimeImports {
|
||||
fn register_browser_apis(&mut self) {
|
||||
self.register("console_log", console_log_impl);
|
||||
self.register("canvas_fillRect", canvas_fill_rect_impl);
|
||||
// ... ブラウザーAPI追加
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
### Phase 3: 最適化・高級機能 (1ヶ月)
|
||||
- 制御フロー最適化
|
||||
- メモリ管理改善
|
||||
- パフォーマンス向上
|
||||
|
||||
---
|
||||
|
||||
## 📋 **テストケース**
|
||||
|
||||
### Level 1: 基本BoxCall
|
||||
```nyash
|
||||
# test_basic_boxcall.nyash
|
||||
local str = "Hello"
|
||||
local len = str.length() # BoxCall実装必要
|
||||
print("Length: " + len.toString()) # BoxCall + ExternCall
|
||||
```
|
||||
|
||||
### Level 2: Box操作
|
||||
```nyash
|
||||
# test_box_operations.nyash
|
||||
local arr = new ArrayBox()
|
||||
arr.push("item1") # BoxCall実装必要
|
||||
local item = arr.get(0) # BoxCall実装必要
|
||||
print(item.toString()) # BoxCall実装必要
|
||||
```
|
||||
|
||||
### Level 3: 外部連携
|
||||
```nyash
|
||||
# test_extern_integration.nyash
|
||||
local console = new ExternBox("console")
|
||||
console.call("log", "Hello Browser!") # ExternCall実装必要
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## ✅ **実装完了判定基準**
|
||||
|
||||
### 基本機能復旧
|
||||
```bash
|
||||
# 以下が全て成功すること
|
||||
./target/release/nyash --compile-wasm test_basic_boxcall.nyash
|
||||
./target/release/nyash --compile-wasm test_box_operations.nyash
|
||||
./target/release/nyash --compile-wasm test_extern_integration.nyash
|
||||
|
||||
# WASM実行成功
|
||||
wasmtime test_basic_boxcall.wasm
|
||||
wasmtime test_box_operations.wasm
|
||||
wasmtime test_extern_integration.wasm
|
||||
```
|
||||
|
||||
### パフォーマンス基準
|
||||
- コンパイル時間: インタープリター比 2倍以内
|
||||
- 実行速度: インタープリター比 5倍以上高速
|
||||
- メモリ使用量: 合理的範囲内
|
||||
|
||||
---
|
||||
|
||||
**🎯 目標**: Phase 1完了でNyash WASM基本機能が実用レベルに到達し、Phase 2でブラウザー連携が完全動作する状態を実現
|
||||
194
docs/guides/wasm-guide/rust-dependency-analysis.md
Normal file
194
docs/guides/wasm-guide/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依存脱却を実現し、ブラウザー環境での自由な実行が可能になります。** 🚀
|
||||
114
docs/guides/wasm-guide/wasm_browser_plan.md
Normal file
114
docs/guides/wasm-guide/wasm_browser_plan.md
Normal file
@ -0,0 +1,114 @@
|
||||
# 🌐 Nyash WebAssembly ブラウザデビュー計画
|
||||
|
||||
## 🎯 なぜこれが天才的か
|
||||
|
||||
1. **extern box不要** - Rust側でWASM対応Boxを実装すればOK
|
||||
2. **GUI即実現** - Canvas/DOM使って即座にビジュアルアプリ
|
||||
3. **配布超簡単** - URLアクセスだけで動く
|
||||
4. **既存資産活用** - 現在のNyashインタープリターをそのままWASM化
|
||||
|
||||
## 🏗️ アーキテクチャ
|
||||
|
||||
```
|
||||
ブラウザ
|
||||
↓
|
||||
Nyashコード(テキストエリア)
|
||||
↓
|
||||
NyashインタープリターWASM
|
||||
↓
|
||||
WasmBox / DOMBox / CanvasBox
|
||||
↓
|
||||
ブラウザAPI(DOM/Canvas/Event)
|
||||
```
|
||||
|
||||
## 📦 新しいBox実装案
|
||||
|
||||
### 1. WasmBox - WebAssembly制御
|
||||
```nyash
|
||||
wasm = new WasmBox()
|
||||
console = wasm.getConsole()
|
||||
console.log("Hello from Nyash in Browser!")
|
||||
```
|
||||
|
||||
### 2. DOMBox - DOM操作
|
||||
```nyash
|
||||
dom = new DOMBox()
|
||||
button = dom.createElement("button")
|
||||
button.setText("Click me!")
|
||||
button.onClick(new MethodBox(me, "handleClick"))
|
||||
dom.body.appendChild(button)
|
||||
```
|
||||
|
||||
### 3. CanvasBox - 描画
|
||||
```nyash
|
||||
canvas = new CanvasBox(800, 600)
|
||||
ctx = canvas.getContext2D()
|
||||
ctx.fillStyle = "red"
|
||||
ctx.fillRect(100, 100, 50, 50)
|
||||
```
|
||||
|
||||
### 4. EventBox - イベント処理
|
||||
```nyash
|
||||
events = new EventBox()
|
||||
events.onKeyDown(new MethodBox(me, "handleKey"))
|
||||
events.onMouseMove(new MethodBox(me, "handleMouse"))
|
||||
```
|
||||
|
||||
## 🚀 実装手順
|
||||
|
||||
### Phase 1: 基本WASM化
|
||||
1. Cargo.tomlにwasm-bindgen追加
|
||||
2. lib.rsでWASM用エクスポート作成
|
||||
3. 簡単なeval関数を公開
|
||||
4. HTMLページで動作確認
|
||||
|
||||
### Phase 2: ブラウザBox実装
|
||||
1. ConsoleBox - console.log対応
|
||||
2. DOMBox - 基本的なDOM操作
|
||||
3. AlertBox - alert/confirm/prompt
|
||||
|
||||
### Phase 3: ビジュアルアプリ
|
||||
1. CanvasBox実装
|
||||
2. Snakeゲーム移植
|
||||
3. お絵かきアプリ
|
||||
4. 簡単なIDE
|
||||
|
||||
## 💡 サンプルアプリ
|
||||
|
||||
### 1. インタラクティブREPL
|
||||
```nyash
|
||||
// ブラウザ上でNyashコード実行
|
||||
input = dom.getElementById("code-input")
|
||||
output = dom.getElementById("output")
|
||||
button = dom.getElementById("run-button")
|
||||
|
||||
button.onClick(new MethodBox(me, "runCode"))
|
||||
|
||||
runCode() {
|
||||
code = input.getValue()
|
||||
result = eval(code)
|
||||
output.setText(result.toString())
|
||||
}
|
||||
```
|
||||
|
||||
### 2. ビジュアルSnakeゲーム
|
||||
```nyash
|
||||
canvas = new CanvasBox(400, 400)
|
||||
game = new SnakeGame(canvas)
|
||||
game.start()
|
||||
```
|
||||
|
||||
### 3. Nyashプレイグラウンド
|
||||
- コードエディタ
|
||||
- 実行結果表示
|
||||
- サンプルコード集
|
||||
- 共有機能
|
||||
|
||||
## 🎉 メリット
|
||||
|
||||
1. **即座にデモ可能** - URL共有だけ
|
||||
2. **ビジュアルフィードバック** - GUIアプリが作れる
|
||||
3. **学習曲線なし** - ブラウザだけあればOK
|
||||
4. **実用アプリ** - 本格的なWebアプリも可能
|
||||
|
||||
これ、本当にすぐできるにゃ!
|
||||
141
docs/guides/wasm-guide/wasm_quick_start.md
Normal file
141
docs/guides/wasm-guide/wasm_quick_start.md
Normal file
@ -0,0 +1,141 @@
|
||||
# 🚀 Nyash WASM クイックスタート実装
|
||||
|
||||
## Step 1: Cargo.toml修正
|
||||
|
||||
```toml
|
||||
[dependencies]
|
||||
wasm-bindgen = "0.2"
|
||||
web-sys = "0.3"
|
||||
|
||||
[lib]
|
||||
crate-type = ["cdylib", "rlib"]
|
||||
|
||||
[dependencies.web-sys]
|
||||
version = "0.3"
|
||||
features = [
|
||||
"console",
|
||||
"Document",
|
||||
"Element",
|
||||
"HtmlElement",
|
||||
"HtmlCanvasElement",
|
||||
"CanvasRenderingContext2d",
|
||||
"Window",
|
||||
]
|
||||
```
|
||||
|
||||
## Step 2: lib.rsにWASMエクスポート追加
|
||||
|
||||
```rust
|
||||
use wasm_bindgen::prelude::*;
|
||||
|
||||
#[wasm_bindgen]
|
||||
pub struct NyashWasm {
|
||||
interpreter: NyashInterpreter,
|
||||
}
|
||||
|
||||
#[wasm_bindgen]
|
||||
impl NyashWasm {
|
||||
#[wasm_bindgen(constructor)]
|
||||
pub fn new() -> Self {
|
||||
// panicをconsole.errorに
|
||||
console_error_panic_hook::set_once();
|
||||
|
||||
let mut interpreter = NyashInterpreter::new();
|
||||
// WASMBox等を登録
|
||||
Self { interpreter }
|
||||
}
|
||||
|
||||
#[wasm_bindgen]
|
||||
pub fn eval(&mut self, code: &str) -> String {
|
||||
match self.interpreter.eval(code) {
|
||||
Ok(result) => format!("{:?}", result),
|
||||
Err(e) => format!("Error: {}", e),
|
||||
}
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
## Step 3: ConsoleBox実装
|
||||
|
||||
```rust
|
||||
// src/boxes/console_box.rs
|
||||
pub struct ConsoleBox;
|
||||
|
||||
impl NyashBox for ConsoleBox {
|
||||
fn box_type(&self) -> &'static str { "ConsoleBox" }
|
||||
|
||||
fn call_method(&self, name: &str, args: Vec<Arc<dyn NyashBox>>) -> Result<Arc<dyn NyashBox>, String> {
|
||||
match name {
|
||||
"log" => {
|
||||
let msg = args[0].to_string();
|
||||
web_sys::console::log_1(&msg.into());
|
||||
Ok(Arc::new(VoidBox))
|
||||
}
|
||||
_ => Err(format!("Unknown method: {}", name))
|
||||
}
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
## Step 4: 簡単なHTML
|
||||
|
||||
```html
|
||||
<!DOCTYPE html>
|
||||
<html>
|
||||
<head>
|
||||
<title>Nyash in Browser!</title>
|
||||
<style>
|
||||
#editor { width: 100%; height: 200px; }
|
||||
#output { border: 1px solid #ccc; padding: 10px; }
|
||||
</style>
|
||||
</head>
|
||||
<body>
|
||||
<h1>🐱 Nyash Browser Playground</h1>
|
||||
<textarea id="editor">
|
||||
// Nyashコードをここに書くにゃ!
|
||||
console = new ConsoleBox()
|
||||
console.log("Hello from Nyash in Browser!")
|
||||
|
||||
x = 10
|
||||
y = 20
|
||||
console.log("x + y = " + (x + y))
|
||||
</textarea>
|
||||
<br>
|
||||
<button onclick="runNyash()">実行!</button>
|
||||
<div id="output"></div>
|
||||
|
||||
<script type="module">
|
||||
import init, { NyashWasm } from './nyash_wasm.js';
|
||||
|
||||
let nyash;
|
||||
|
||||
async function main() {
|
||||
await init();
|
||||
nyash = new NyashWasm();
|
||||
window.runNyash = () => {
|
||||
const code = document.getElementById('editor').value;
|
||||
const output = nyash.eval(code);
|
||||
document.getElementById('output').textContent = output;
|
||||
};
|
||||
}
|
||||
|
||||
main();
|
||||
</script>
|
||||
</body>
|
||||
</html>
|
||||
```
|
||||
|
||||
## ビルドコマンド
|
||||
|
||||
```bash
|
||||
# wasm-packインストール
|
||||
cargo install wasm-pack
|
||||
|
||||
# ビルド
|
||||
wasm-pack build --target web --out-dir www
|
||||
|
||||
# ローカルサーバー起動
|
||||
cd www && python3 -m http.server 8000
|
||||
```
|
||||
|
||||
これで http://localhost:8000 でNyashがブラウザで動く!🎉
|
||||
Reference in New Issue
Block a user