feat: WASMビルド完全対応+finiシステム修正 🎉

## WASMビルド対応
- TimerBox、AudioBox等の問題のあるBoxをWASM環境では条件付きコンパイルで除外
- WebBox (WebDisplayBox, WebConsoleBox, WebCanvasBox) にas_anyメソッド追加
- プラグイン関連コードに#[cfg]ガードを追加
- web-sysフィーチャーを追加(Performance、MouseEvent等)
- projects/nyash-wasmのビルドが完全に通るように!

## finiシステム修正
- フィールド差し替え時の自動fini削除(Nyashの明示的哲学に従う)
- スコープ離脱時のみfini実行(meは除外)
- ドキュメント更新で正しいfiniルールを明記

## その他
- CLAUDE.mdにWASMビルド方法を追記(wasm-pack build --target web)
- 開発サーバー起動方法を記載(python3 -m http.server 8010)
- cargo testで全テスト成功を確認

これでNyashがブラウザで動作可能に!🐱

🤖 Generated with [Claude Code](https://claude.ai/code)

Co-Authored-By: Claude <noreply@anthropic.com>
This commit is contained in:
Moe Charm
2025-08-20 07:33:18 +09:00
parent 83d3914e46
commit 670615d1de
18 changed files with 209 additions and 78 deletions

View File

@ -223,6 +223,40 @@ cargo build --release -j32 --features wasm-backend
## 🎯 今後の優先事項copilot_issues.txt参照
### 🌐 **WASMブラウザー版ビルド修正**
- **問題**: projects/nyash-wasmのビルドが失敗28個のコンパイルエラー
- **原因と解決策3ステップ**:
#### **Step 1: プラグイン関連の条件コンパイル修正**
- **問題箇所**:
- `src/interpreter/expressions/calls.rs`: `use PluginBoxV2` が無条件
- `src/bid/loader.rs`: `use libloading` が無条件
- **修正内容**:
```rust
#[cfg(all(feature = "plugins", not(target_arch = "wasm32")))]
use crate::runtime::plugin_loader_v2::PluginBoxV2;
```
#### **Step 2: web-sysフィーチャー追加**
- **不足フィーチャー**:
- Performance
- MouseEvent, TouchEvent, KeyboardEvent
- AudioContext, AudioBuffer, GainNode 等
- **修正内容**: Cargo.tomlの`[dependencies.web-sys]`に追加
#### **Step 3: wasm-pack buildコマンド修正**
- **現在**: デフォルトフィーチャーplugins含むでビルド
- **修正**: `wasm-pack build --target web --no-default-features --out-dir projects/nyash-wasm/pkg`
- **または**: WASM専用フィーチャー作成
- **最終確認**: `wasm-pack build`成功 → `nyash_playground.html`で動作確認
### 🚨 **緊急修正: finiシステムの統一**
- **問題**: ビルトインBoxにfiniメソッドがない設計の不統一
- **解決**: 全Box型ビルトイン含むにfiniメソッド追加
- **理由**: スコープ離脱時の統一的リソース管理
- **影響**: StringBox、IntegerBox等16種類のビルトインBox
### Phase 8.4: AST→MIR Lowering完全実装
- MIR命令セット設計済み35命令
- Lowering実装開始準備

View File

@ -231,18 +231,60 @@ Nyashは古典的な継承ではなく、デリゲーション委譲モデ
```
- **ファイナライズ (`fini`キーワード):**
- `fini()`は「論理的な解放フック」として機能する特別なメソッドです。
- インスタンスに対して呼び出されると、そのインスタンスがもはや使用されるべきではないことを示します。
- クリーンアップ処理を実行し、所有するすべてのフィールドに対して再帰的に`fini()`を呼び出します。
- ファイナライズされたオブジェクトを使用しようとすると(`fini`の再呼び出しを除く)、実行時エラーが発生します。
- `fini()`は「リソース解放フック」として機能する特別なメソッドです。
- **Nyashの明示的哲学**: 自動的な解放は最小限に留め、プログラマーが制御します。
**🎯 finiが呼ばれる3つのタイミング**
1. **スコープ離脱時(自動)**
- ローカル変数がスコープを抜ける時に自動的に呼ばれます
- ただし`me`(インスタンス自身)は除外されます
```nyash
function test() {
local resource = new FileBox("data.txt")
// 関数終了時、resourceのfini()が自動的に呼ばれる
}
```
2. **明示的呼び出し(推奨)**
- プログラマーが必要に応じて明示的に呼び出します
```nyash
local file = new FileBox("temp.txt")
file.write("data")
file.fini() // 明示的にリソースを解放
```
3. **インスタンスのfini時カスケード**
- インスタンスがfiniされる時、そのフィールドもfiniされます
- ただしweakフィールドは除外されます
**⚠️ 重要な注意点:**
- **フィールド差し替え時にはfiniは呼ばれません**GC的な「おせっかい」を避ける設計
- ファイナライズ後のオブジェクト使用は実行時エラーになります
- `fini()`の重複呼び出しは安全(何もしない)
- **すべてのBox型ビルトイン含むにfini実装が必要**(設計統一性)
```nyash
box ManagedResource {
init { handle }
init { handle, weak observer } // observerはweakなのでfiniされない
fini() {
// ハンドルを解放したり、他のクリーンアップ処理を実行
// リソースのクリーンアップ
me.console.log("リソースをファイナライズしました。")
// handleは自動的にfiniされるweakでない限り
}
}
// 使用例
local res = new ManagedResource()
res.handle = new FileBox("data.txt")
// ❌ これではfiniは呼ばれない明示的管理
res.handle = new FileBox("other.txt") // 古いhandleは解放されない
// ✅ 正しい方法
res.handle.fini() // 明示的に古いリソースを解放
res.handle = new FileBox("other.txt")
```
## 3. 標準ライブラリアクセス (using & namespace) 🎉 **Phase 9.75e完了**