Phase 9.78h: VM BinOp and/or short-circuit + BoxRef<Integer> arithmetic; add diagnostic hooks. Update CURRENT_TASK with progress and VM path-tracing TODO. Align docs: MIR26 canonical spec and phase docs.

This commit is contained in:
Moe Charm
2025-08-26 00:06:35 +09:00
parent 3a8f7092e6
commit f82ad5a84d
19 changed files with 534 additions and 69 deletions

View File

@ -4,7 +4,7 @@ Nyashプログラミング言語開発に必要な情報をまとめたクイッ
## 🧭 Start Here (最初に見る) ## 🧭 Start Here (最初に見る)
- **🎯 主軸タスク**: [docs/development/roadmap/native-plan/copilot_issues.txt](docs/development/roadmap/native-plan/copilot_issues.txt) **← 最重要!** - **🎯 主軸タスク**: [docs/development/roadmap/native-plan/copilot_issues.txt](docs/development/roadmap/native-plan/copilot_issues.txt) **← 最重要!**
- 現在のタスク: [docs/development/current/CURRENT_TASK.md](docs/development/current/CURRENT_TASK.md) - 現在のタスク: [docs/development/current/CURRENT_TASK.md](docs/development/current/CURRENT_TASK.md)(近々/中期/長期の計画は同ファイル先頭)
- ドキュメント入口: [docs/README.md](docs/README.md) - ドキュメント入口: [docs/README.md](docs/README.md)
- コア概念(速習): [docs/reference/architecture/nyash_core_concepts.md](docs/reference/architecture/nyash_core_concepts.md) - コア概念(速習): [docs/reference/architecture/nyash_core_concepts.md](docs/reference/architecture/nyash_core_concepts.md)
- NetプラグインHTTP/TCP: [docs/reference/plugin-system/net-plugin.md](docs/reference/plugin-system/net-plugin.md) - NetプラグインHTTP/TCP: [docs/reference/plugin-system/net-plugin.md](docs/reference/plugin-system/net-plugin.md)
@ -17,7 +17,7 @@ Nyashプログラミング言語開発に必要な情報をまとめたクイッ
- **Phase 8.5**: MIRダイエット35命令→20命令 - **Phase 8.5**: MIRダイエット35命令→20命令
- **Phase 8.6**: VM性能改善0.9倍 → 2倍以上 - **Phase 8.6**: VM性能改善0.9倍 → 2倍以上
- **Phase 9**: JIT実装 - **Phase 9**: JIT実装
- **Phase 10**: AOT最終形態 - **Phase 10**: Cranelift JIT主経路/ LLVM AOTは後段
**迷ったらcopilot_issues.txtを確認せよ** **迷ったらcopilot_issues.txtを確認せよ**

View File

@ -1,4 +1,9 @@
# Phase 8.5: MIR 25命令完全仕様実装ChatGPT5 + AI大会議決定版 # [ARCHIVED] Phase 8.5: MIR 25命令完全仕様実装ChatGPT5 + AI大会議決定版
この文書はアーカイブされました。最新かつ唯一の命令セットは `docs/reference/mir/INSTRUCTION_SET.md`26命令を参照してください。
Status: Spec Draft / In ProgressPrinter/Verifier/Optimizer整合は未完
Last Updated: 2025-08-25
## 🎯 Issue概要 ## 🎯 Issue概要
@ -335,4 +340,4 @@ diff interp.out vm.out && diff vm.out wasm.out
**優先度**: CriticalPhase 8.4完了直後) **優先度**: CriticalPhase 8.4完了直後)
**担当**: Copilot + Claude協調実装 **担当**: Copilot + Claude協調実装
**仕様策定**: ChatGPT5 + AI大会議Gemini+Codex完全一致決定 **仕様策定**: ChatGPT5 + AI大会議Gemini+Codex完全一致決定
**最終目標**: Nyashコア価値の完璧なIR化実現 **最終目標**: Nyashコア価値の完璧なIR化実現

View File

@ -1,5 +1,33 @@
# 🎯 CURRENT TASK - 2025年8月25日状況整理 # 🎯 CURRENT TASK - 2025年8月25日状況整理
## ⏱️ 再開ショートカット(今日のフォーカス)
- フォーカス: Phase 9.78h MIR前提整備P2P/Cranelift前の総仕上げ
- 目標: MIR26命令の凍結・SSA/Verifier/Optimizer/VM整合・軽量スナップショット体制を完了
- 参照: `docs/development/roadmap/phases/phase-9/phase_9_78h_mir_pipeline_stabilization.md`
### 直近の実行タスク9.78h
1) Builder移行完了命令フィールド名/効果一致: `function→func`, `arguments→args`
2) Loop SSA復帰Phi挿入・seal・predecessor更新の段階適用
3) TypeOp網羅is/as/isType/asType早期lowering + Optimizer安全ネット強化
4) MIR26統合TypeOp/WeakRef/BarrierとPrinter/Verifier/Optimizer整合
5) VM補強and/or短絡扱いの確定と実装/BoxRef×BoxRef演算
6) 軽量スナップショット + CLI分離テスト + ResultBox移行の仕上げ
### すぐ試せるコマンド
```bash
cargo build --release -j32
nyash --dump-mir --mir-verbose local_tests/typeop_is_as_func_poc.nyash | sed -n '1,160p'
NYASH_OPT_DIAG_FAIL=1 nyash --dump-mir --mir-verbose local_tests/typeop_diag_fail.nyash || echo DIAG BLOCKED
tools/ci_check_golden.sh # 代表ケースのMIR含有チェック
```
### 重要リンク(唯一参照/ゲート)
- 命令セット唯一出典・26命令: `docs/reference/mir/INSTRUCTION_SET.md`
- 9.78h(本フェーズ詳細): `docs/development/roadmap/phases/phase-9/phase_9_78h_mir_pipeline_stabilization.md`
- 9.79P2P本体 前提: 9.78h完了): `docs/development/roadmap/phases/phase-9/phase_9_79_p2pbox_rebuild.md`
- Phase 10Cranelift JIT主経路: `docs/development/roadmap/phases/phase-10/phase_10_cranelift_jit_backend.md`
## 🚨 現在の状況2025-08-25 ## 🚨 現在の状況2025-08-25
### ✅ 完了したタスク ### ✅ 完了したタスク
@ -26,6 +54,13 @@
- execute_instruction_old削除691行削減 - execute_instruction_old削除691行削減
- vm.rs: 2075行→1382行33%削減) - vm.rs: 2075行→1382行33%削減)
### 🆕 進捗2025-08-25 夜)
- VM and/or 対応の実装を追加(短絡評価は `as_bool()` 強制で統一、`BoxRef(IntegerBox)` の四則演算にも対応)。
- ゴールデンTypeOp代表2ケースは緑のまま、Optimizer診断未lowering検知も動作確認済み。
- ただし、VM実行時に `And``execute_binop` の短絡ルートに入らず、`execute_binary_op` の汎用経路で `Type error: Unsupported binary operation: And ...` が発生。
- 兆候: `NYASH_VM_DEBUG_ANDOR` のデバッグ出力が出ない=`execute_binop` に入っていない、または別実装ルートを通過している可能性。
- 仮説: 古いVM経路の残存/リンク切替、もしくは実行時に別ビルド/別profileが使用されている。
### 🎯 次の優先タスク ### 🎯 次の優先タスク
1. **copilot_issues.txtの確認** 1. **copilot_issues.txtの確認**
@ -33,6 +68,11 @@
- Phase 8.5: MIRダイエット35命令→20命令 - Phase 8.5: MIRダイエット35命令→20命令
- Phase 8.6: VM性能改善0.9倍 → 2倍以上 - Phase 8.6: VM性能改善0.9倍 → 2倍以上
1.5 **VM実行経路の特定と修正最優先**
- `runner.rs → VM::execute_module → execute_instruction → execute_binop` の各段でデバッグログを追加し、`BinOp(And/Or)` がどこで分岐しているか特定。
- バイナリ一致確認: `strings` によるシグネチャ(デバッグ文字列)含有の照合で実行バイナリを同定。
- 代替経路の洗い出し: `src/` 全体で `execute_binop`/`And`/`Unsupported binary operation` を再走査し、影響箇所を一掃。
- 修正後、`local_tests/and_or_vm.nyash``false/true` の出力を確認。
2. **MIR26命令対応** 2. **MIR26命令対応**
- TypeOp/WeakRef/Barrierのプリンタ拡張 - TypeOp/WeakRef/Barrierのプリンタ拡張
- スナップショット整備 - スナップショット整備
@ -43,6 +83,39 @@
- 弱参照フィールドのWeakLoad/WeakNew対応 - 弱参照フィールドのWeakLoad/WeakNew対応
- 関数スタイル `isType/asType` の早期lowering強化 - 関数スタイル `isType/asType` の早期lowering強化
## 🗺️ 計画の粒度(近々/中期/長期)
### 近々12週間
- Loop SSA復帰: `loop_api` 小APIを活用し、Phi挿入・seal・predecessor更新を段階適用。簡易loweringを正しいSSAに置換。
- Builder移行完了: `builder.rs`の機能を`builder_modularized/*`へ移し切り、両者の差分(命令フィールド名・効果)を完全一致。
- TypeOp網羅: `is/as`/`isType/asType`の早期loweringを再点検、Optimizer診断未lowering検出を有効化し回帰を防止。
- 軽量スナップショット: MIRダンプverboseに対する含有チェックを代表ケースTypeOp/extern_call/loop/await/boxcallへ拡張。
### 中期34週間
- WeakRef/Barrier統合: loweringWeakNew/WeakLoad/Barrier導線を整理、統合命令フラグON/OFFでMIR差を固定化。Verifierに整合チェック追加。
- MIR26整合化: Printer/Verifier/Optimizerの26命令前提をそろえ、効果の表記・検証を強化。
- CLI分離テスト: ワークスペース分割 or lib/binaryテスト分離で、`cargo test -p core` のみで回る導線を確立CLI構成変更で止まらない
- ResultBox移行: `box_trait::ResultBox` 参照を `boxes::ResultBox` へ一掃し、レガシー実装を段階的に削除。
### 長期Phase 8.48.6連動)
- AST→MIR Lowering完全化8.4: すべての言語要素を新MIRへ安定lower。未対応分岐をゼロに。
- MIRダイエット8.5: 命令の統一・簡素化TypeOp/WeakRef/Barrierの統合効果を活用し最小集合へ。
- VM性能改善8.6: Hot-pathBoxCall/Array/Map高速化、And/OrのVM未実装の解消、BoxRef演算の抜けを補完。
### Phase 10 着手ゲートCranelift前提条件
- [ ] MIR26整合化完了Printer/Verifier/Optimizerが26命令で一致・効果表記統一
- [ ] Loop SSA復帰Phi/Seal/Pred更新がVerifierで合格
- [ ] TypeOp網羅is/as/isType/asTypeの早期loweringOptimizer診断ONで回帰ゼロ
- [ ] 軽量スナップショット緑TypeOp/extern_call/loop/await/boxcall 代表ケース)
- [ ] P2PBox再設計Phase 9.79完了・E2Eパス
- [ ] CLI分離テスト`cargo test -p core`)が安定実行
### ⚠️ トラブルートVM and/or 追跡用)
- 症状: `--backend vm``And``execute_binop` の短絡パスを経由せず、`execute_binary_op` 汎用パスで `Type error`
- 状況: `MIR --dump-mir` では `bb0: %X = %A And %B` を出力BuilderはOK
- 差分検証: `execute_instruction`/`execute_binop` に挿入したデバッグ出力が未出力→実行経路の相違が濃厚。
- 対応: 実行バイナリの署名チェックとコードパスの網羅的ログ追加でルート確定→修正。
### ⚠️ MIRビルダー引き継ぎポイントChatGPT5さんへ ### ⚠️ MIRビルダー引き継ぎポイントChatGPT5さんへ
- **状況**: MIRビルダーのモジュール化完了Phase 1-8コミット済み - **状況**: MIRビルダーのモジュール化完了Phase 1-8コミット済み
- **問題**: MIR命令構造の変更により、expressions.rsでエラー発生 - **問題**: MIR命令構造の変更により、expressions.rsでエラー発生
@ -121,6 +194,12 @@
- 関数スタイル `isType/asType` の早期loweringを強化`Literal("T")``new StringBox("T")` を確実に検出) - 関数スタイル `isType/asType` の早期loweringを強化`Literal("T")``new StringBox("T")` を確実に検出)
- `print(isType(...))` の未定義SSA回避print直前で必ず `TypeOp` のdstを生成 - `print(isType(...))` の未定義SSA回避print直前で必ず `TypeOp` のdstを生成
補足: 近々/中期で並行対応する項目
- Loop SSA復帰Phi挿入/Seal/Pred更新の段階適用、簡易loweringの置換
- Builder移行完了`builder.rs``builder_modularized/*`、命令フィールド名・効果の完全一致)
- CLI分離テスト導線`cargo test -p core` 単独で回る構成)
- ResultBox移行`box_trait::ResultBox``boxes::ResultBox`、レガシー段階削除)
3) VM/Verifierの補強中期 3) VM/Verifierの補強中期
- `TypeOp(Cast)` の数値キャストInt/Float安全化、誤用時TypeError整備 - `TypeOp(Cast)` の数値キャストInt/Float安全化、誤用時TypeError整備
- Verifierに26命令整合Barrier位置、WeakRef整合、支配関係チェックを追加 - Verifierに26命令整合Barrier位置、WeakRef整合、支配関係チェックを追加
@ -170,6 +249,12 @@ cargo build --release -j32
補足: ASTの形状確認は `--dump-ast` を使用。 補足: ASTの形状確認は `--dump-ast` を使用。
#### 代表スナップショット対象(拡張)
- TypeOp系: `typeop_is_as_poc.nyash`, `typeop_is_as_func_poc.nyash`
- extern_call: `http_get_*.nyash`, `filebox_copy_from_handle.nyash`
- loop/await: `loop_phi_seal_poc.nyash`, `await_http_timeout_poc.nyash`
- boxcall: `array_map_fastpath_poc.nyash`, `boxcall_identity_share_poc.nyash`
## ▶ 実行コマンド例 ## ▶ 実行コマンド例
計測実行: 計測実行:

View File

@ -163,22 +163,29 @@ Acceptance:
------------------------------------------------------------ ------------------------------------------------------------
## 🏆 Phase 10: LLVM Direct AOT - 実現可能性検証中 ## 🏆 Phase 10: Cranelift JIT主経路 + LLVM AOT後段研究
Summary: Summary:
- **調査・実証段階**: MIR→LLVM IR直接変換による最高性能AOT実現を目指す - **主経路**: MIR→VMを維持しつつ、ホットパスをCraneliftでJIT化して2倍以上の高速化を狙う
- インタープリターとの併用で最適な開発・実行体験を提供 - **LLVM AOT**: 設計資産は維持しつつ、JIT安定後Phase 11以降に検討
- 非同期処理フルサポートasync/await のネイティブ実装) - **目標**: VMのホットパスBoxCall/Array/Mapで体感高速化、ベンチで優位性を実証
Priority: **Research** (Phase 9.8完了後に実現可能性評価) Priority: **High**Phase 8.6完了直後着手)
Expected Duration: **調査3週間 + 実装3-6ヶ月**(実現可能性次第) Expected Duration: **実装6-8週間段階導入**
### 🔍 実現可能性チェック項目 ### 🚧 Start Gate着手前の必須完了
- ✅ **技術的基盤**: MIR 26命令セットLLVM IR変換可能 - MIRダイエット26命令整合完了Printer/Verifier/Optimizer一致・効果ラベル統一
- ✅ **AOTスケルトン**: 基本構造完成済み - Loop SSA復帰Phi/Seal/Pred更新のVerifierチェック合格
- ✅ **型情報システム**: 最適化に必要な情報完備 - TypeOp網羅is/as/isType/asTypeの早期loweringOptimizer診断未lowering検出
- 🔄 **Proof of Concept**: 基本的なMIR→LLVM変換の実証 - 軽量スナップショットTypeOp/extern_call/loop/await/boxcallでゴールデン緑
- ❓ **実装工数**: 現実的な期間での完成可能性 - P2PBox再設計Phase 9.79完了・E2Eグリーン
- CLI分離テスト導線`cargo test -p core`)安定
### 🔍 実現可能性チェック項目Cranelift
- ✅ **技術的基盤**: MIR26整合TypeOp/WeakRef/Barrier
- ✅ **VM統計**: `--vm-stats` でホット関数抽出可能
- 🔄 **Proof of Concept**: MIR→CLIFの最小Lower算術/比較/分岐)
- ❓ **実装工数**: BoxCall/Array/MapのJIT最適化の妥当性
### 🌟 インタープリター併用戦略 ### 🌟 インタープリター併用戦略
``` ```
@ -188,54 +195,39 @@ Expected Duration: **調査3週間 + 実装3-6ヶ月**(実現可能性次第
Web配布: WASMブラウザ対応 Web配布: WASMブラウザ対応
``` ```
### 🏗️ Phase 10.1: Proof of Concept3週間)**実現可能性評価** ### 🏗️ Phase 10.1: Proof of Concept2週間)
Investigation Steps: Steps:
1) **MIR→LLVM IR変換調査**: 基本命令の変換可能性検証 1) **JITマネージャ**: プロファイル収集・しきい値設計
2) **Box型表現調査**: LLVM IRでのBox型効率的実装方法 2) **MIR→CLIF最小Lower**: Const/BinOp/Compare/Branch/Return
3) **C-ABI統合調査**: プラグインとの連携可能性 3) **呼出しABI**: VMとの引数/戻り値・BoxRef受け渡し
4) **性能予測**: 理論的な高速化効果の算出
### 🏗️ Phase 10.2: 基本実装(3ヶ月**実現可能と判断した場合** ### 🏗️ Phase 10.2: 基本実装(4週間
Implementation Steps: Implementation Steps:
1) `src/backend/llvm/` 基盤構築 1) `src/backend/cranelift/` 基盤構築
2) MIR→LLVM IR基本変換 2) MIR→CLIF Lowerの拡充Call/BoxCall/Array系
3) Box操作の最適化エスケープ解析 3) JIT関数テーブル + VM切替の安定化
4) ベンチマーク: 100倍目標 4) ベンチ: VM比2×目標、BoxCallホットパス優位
### 🌐 Phase 10.3: 非同期拡張2ヶ月**基本実装完了後** ### 🌐 Phase 10.3: 非同期の扱い(最小)
- awaitは当面VM側で処理継続JIT対象外
非同期サポート戦略: - JIT関数は同期区間を優先将来拡張
- **async/await ネイティブ実装**: Rust風の効率的な非同期
- **軽量ランタイム**: 独自Future実装
- **インタープリター互換**: 同じ非同期セマンティクス
```rust
// Phase 10.3: 非同期LLVM実装予定
FutureNew → LLVM coroutine intrinsics
Await → LLVM suspend/resume points
FutureSet → completion notification
```
### 技術アプローチ ### 技術アプローチ
🤖 Copilot協力期待: 🤖 Copilot協力期待:
- **LLVM統合**: MIR→LLVM IR変換基盤 - **Cranelift統合**: MIR→CLIF Lower
- **非同期実装**: coroutine/suspend points - **VMハイブリッド**: JITスイッチ・例外/フォールバック
- **エスケープ解析**: Box→スタック値最適化 - **ホットパス最適化**: BoxCall/Array/Mapの直結最適化
- **型特殊化**: コンパイル時型推論・特殊化
### パフォーマンス目標 ### パフォーマンス目標
- **同期処理**: 100-1000倍高速化 - **同期処理**: VM比 2×以上段階的に引き上げ
- **非同期処理**: Tokio並みの効率性 - **起動時間**: 低オーバーヘッドJIT初回コストを隠蔽
- **メモリ効率**: Box割当数80%削減
- **起動時間**: ネイティブレベル(<10ms
### Acceptance Criteria ### Acceptance Criteria
- インタープリターとの完全な互換性 - インタープリター/VMとの互換性結果一致
- 非同期処理の効率的実装 - ホットパスでの実測高速化2×
- 1000倍高速化達成同期処理 - 回帰テスト・スナップショットの整備
- プロダクションレベル最適化
References: References:
- docs/予定/native-plan/issues/phase_10_x_llvm_backend_skeleton.md - docs/予定/native-plan/issues/phase_10_x_llvm_backend_skeleton.md
@ -464,7 +456,7 @@ Acceptance Criteria:
## Phase 10以降の展望 ## Phase 10以降の展望
🚀 **WASM復旧完了** (Phase 9.77): 基本機能の完全動作 🚀 **WASM復旧完了** (Phase 9.77): 基本機能の完全動作
🚀 **LLVM Direct AOT** (Phase 10): 100-1000倍高速化 🚀 **Cranelift JIT** (Phase 10): VM比2×以上の高速化段階導入
🚀 **非同期ネイティブ実装** (Phase 10.2): async/await完全対応 🚀 **非同期ネイティブ実装** (Phase 10.2): async/await完全対応
🚀 **インタープリター併用** : 開発・本番両対応 🚀 **インタープリター併用** : 開発・本番両対応

View File

@ -1,5 +1,8 @@
# 🏆 Phase 10: LLVM Direct AOT最高性能実現 # 🏆 Phase 10: LLVM Direct AOT最高性能実現
Status: DeferredCranelift JITをPhase 10の主経路に採用、AOTは後段研究
Last Updated: 2025-08-25
## 📋 Summary ## 📋 Summary
MIR→LLVM IR直接変換による最高性能AOT実現。Cranelift JITをスキップし、実用優先戦略でLLVMの強力な最適化を直接活用する。 MIR→LLVM IR直接変換による最高性能AOT実現。Cranelift JITをスキップし、実用優先戦略でLLVMの強力な最適化を直接活用する。

View File

@ -0,0 +1,62 @@
# Phase 10: Cranelift JIT BackendMIR→VM→Cranelift
Status: Planned (Primary path for native speed)
Last Updated: 2025-08-25
## 🎯 ゴール
- 実行系の主経路を「MIR→VM」を維持しつつ、ホットパスをCraneliftでJIT化して高速化する。
- LLVM AOTは後段Phase 11以降の研究対象へ繰り延べ。
## 🔗 位置づけ
- これまでの案MIR→LLVM AOTを改め、現実的な開発速度と安定性を優先してCranelift JITを先行。
- VMとのハイブリッド実行OSR/ホットカウントに基づくJITを採用。
## 📐 アーキテクチャ
```
AST → MIR → Optimizer → VM Dispatcher
└─(Hot)→ Cranelift JIT (fn単位)
```
- VMが命令カウント・プロファイルを集計し、しきい値超過関数をJITコンパイル。
- JIT済み関数は関数テーブルから直接呼び出し、VMはフォールバック先として維持。
## 📋 スコープ
1) 基盤
- JITマネージャ関数プロファイル・コンパイルキャッシュ
- Craneliftコード生成MIR→CLIF Lower
- 呼出しABINyash VMスタック/レジスタとのブリッジ)
2) 命令カバレッジ(段階導入)
- Phase A: Const/Copy/BinOp/Compare/Jump/Branch/Return純関数相当
- Phase B: Call/BoxCall/ArrayGet/ArraySetホットパス対応
- Phase C: TypeOp/Ref*/Weak*/Barrier必要最小
3) ランタイム連携
- Boxの所有・参照モデルを維持共有/クローンの意味論を破らない)
- 例外・TypeErrorはVMの例外パスへエスケープ
## ✅ 受け入れ基準Milestone
- M1: 算術/比較/分岐/returnの関数がJIT化され、VMより高速に実行
- M2: Array/Mapの代表操作get/set/push/sizeがJITで安定動作
- M3: BoxCallホットパス特にArray/Mapで有意な高速化2×目標
- M4: 回帰防止のベンチと`--vm-stats`連携JITカウント/時間)
## 🪜 実装ステップ
1. JITマネージャ/関数プロファイルの導入VM統計と統合
2. MIR→CLIF Lower骨子基本型/算術/比較/制御)
3. 呼出しABIブリッジ引数/戻り値/BoxRefの表現
4. JIT関数テーブル + VMディスパッチ切替
5. Array/Map/BoxCallのホットパス最適化
6. TypeOp/Ref/Weak/Barrierの必要最小を実装
7. ベンチ/スナップショット整備・回帰検出
## ⚠️ 依存・前提
- MIR26整合TypeOp/WeakRef/Barrierの統合前提
- P2PBox再設計Phase 9.xを先に安定化しておくVM/プラグインE2E維持
## 📚 参考
- Cranelift: Peepmatic/CLIF、simple_jitの最小例
- JIT/VMハイブリッド: LuaJIT/HotSpotのOSR設計
---
備考: LLVM AOTはPhase 11以降の研究路線に移行設計ドキュメントは維持

View File

@ -1,5 +1,8 @@
# Phase 10: LLVM Backend SkeletonMIR→LLVM IR AOT 最小実装) # Phase 10: LLVM Backend SkeletonMIR→LLVM IR AOT 最小実装)
Status: DeferredCranelift JIT先行のため、AOTは後段で検討
Last Updated: 2025-08-25
目的 目的
- MIRからLLVM IRへの直接変換と、最小AOTパイプラインを構築するための実装ガイドCopilot向けタスクリスト - MIRからLLVM IRへの直接変換と、最小AOTパイプラインを構築するための実装ガイドCopilot向けタスクリスト
- Phase 9.7ABI/BIDExternCallを前提に、外部呼び出しの取り扱いも含めて安全に前進。 - Phase 9.7ABI/BIDExternCallを前提に、外部呼び出しの取り扱いも含めて安全に前進。

View File

@ -1,5 +1,8 @@
# Phase 8.4: AST→MIR Lowering完全実装 # Phase 8.4: AST→MIR Lowering完全実装
Status: In Progress (builder分割完了、lowering未完)
Last Updated: 2025-08-25
## 🎯 Issue概要 ## 🎯 Issue概要
**現在の最重要課題**: Phase 8.3のBox操作WASMが実際にテストできない **現在の最重要課題**: Phase 8.3のBox操作WASMが実際にテストできない
@ -332,4 +335,4 @@ $HOME/.wasmtime/bin/wasmtime run clean_test.wat --invoke main
**優先度**: Critical **優先度**: Critical
**担当**: Copilot + Claude協調実装 **担当**: Copilot + Claude協調実装
**最終目標**: test_wasm_box_integration.nyash が完全動作 **最終目標**: test_wasm_box_integration.nyash が完全動作

View File

@ -1,5 +1,8 @@
# Phase 8.5: MIR 35→26命令削減プロジェクト緊急実装 # Phase 8.5: MIR 35→26命令削減プロジェクト緊急実装
Status: In ProgressTypeOp/WeakRef/Barrier統合の整合中
Last Updated: 2025-08-25
## 🚨 **緊急度: Critical** ## 🚨 **緊急度: Critical**
**発見日**: 2025年8月17日 **発見日**: 2025年8月17日
@ -256,4 +259,4 @@ fn verify_ownership_forest_constraints(mir: &MirModule) -> Result<(), VerifyErro
**想定完了**: 2025年8月17日中本日中 **想定完了**: 2025年8月17日中本日中
**優先度**: Critical他全作業に優先 **優先度**: Critical他全作業に優先
**驚異的な進捗**: 当初5週間想定だった作業を1日で90%完了! **驚異的な進捗**: 当初5週間想定だった作業を1日で90%完了!

View File

@ -1,5 +1,8 @@
# Phase 8.6: VM性能改善実装緊急修正 # Phase 8.6: VM性能改善実装緊急修正
Status: In ProgressCritical; 0.9×→2×目標
Last Updated: 2025-08-25
## 🚨 Issue概要 ## 🚨 Issue概要
**緊急課題**: VMがインタープリターより性能劣化0.9倍)している根本問題の解決 **緊急課題**: VMがインタープリターより性能劣化0.9倍)している根本問題の解決
@ -435,4 +438,4 @@ echo "✅ 全テスト完了"
**期間**: 2週間 **期間**: 2週間
**担当**: Copilot + Claude協調 **担当**: Copilot + Claude協調
この問題解決によりNyash言語のVM実行性能が飛躍的に向上しPhase 9 JIT実装への道筋が確立されます 🚀 この問題解決によりNyash言語のVM実行性能が飛躍的に向上しPhase 9 JIT実装への道筋が確立されます 🚀

View File

@ -1,4 +1,4 @@
# 🚀 Phase 9.75h-0 Complete: Unified Plugin System Developer Guide # 🚀 Phase 9.75g-0 Complete: Unified Plugin System Developer Guide
**Completion Date**: 2025-08-18 **Completion Date**: 2025-08-18
**Status**: ✅ **PRODUCTION READY** **Status**: ✅ **PRODUCTION READY**
@ -404,4 +404,4 @@ Phase 9.75g-0 **perfectly positions** Nyash for Phase 10 (LLVM AOT):
**Last Updated**: 2025-08-19 **Last Updated**: 2025-08-19
**Author**: Claude (AI Assistant) **Author**: Claude (AI Assistant)
**Review Status**: Ready for Team Review **Review Status**: Ready for Team Review
**Confidentiality**: Open Source Development Documentation **Confidentiality**: Open Source Development Documentation

View File

@ -1,5 +1,8 @@
# Phase 9.78b: インタープリター・VM統合アーキテクチャ再設計 # Phase 9.78b: インタープリター・VM統合アーキテクチャ再設計
Status: Not Started設計完了、実装未着手
Last Updated: 2025-08-25
**作成日**: 2025-08-21 **作成日**: 2025-08-21
**優先度**: 最高Phase 9.78aの前提条件) **優先度**: 最高Phase 9.78aの前提条件)
**設計者**: Codex exec (天才的洞察) **設計者**: Codex exec (天才的洞察)
@ -209,4 +212,4 @@ use core::model::BoxDeclaration as InterpreterBoxDecl;
--- ---
**総工数見積もり**: 14日各ステップにバッファ含む **総工数見積もり**: 14日各ステップにバッファ含む
**推奨アプローチ**: Step 1-2を先行実施して感触を掴む **推奨アプローチ**: Step 1-2を先行実施して感触を掴む

View File

@ -0,0 +1,72 @@
# Phase 9.78h: MIRパイプライン前提整備P2P/Cranelift前の全作業
Status: In Progress9.79 P2PBox前のゲート
Last Updated: 2025-08-25
## 🎯 目的
P2PBoxPhase 9.79に着手する前に、MIRパイプラインBuilder/SSA/MIR26/Verifier/Optimizer/VM整合を完全に安定化し、26命令セットで凍結する。これにより、P2P/Craneliftの土台を強固にする。
## 📦 スコープMIRまわりの全タスク
0) 命令セットの凍結26命令が正
- 命令セットの単一出典: `docs/reference/mir/INSTRUCTION_SET.md` を唯一の参照に統一
- コード側の列挙とテスト: `src/mir/instruction.rs` の列挙と一致、総数26のテストで保証ドキュメント≧コードではなくコード≡ドキュメント
- 25命令文献はアーカイブへ移動本流は26命令
1) Builder/Loweringの確定
- Builder移行完了: `builder.rs``builder_modularized/*`(命令フィールド名・効果一致: `function→func`, `arguments→args`
- Loop SSA復帰: `loop_api` によるPhi挿入・seal・predecessor更新の段階適用、簡易lowering除去
- TypeOp早期lowering網羅: `is/as/isType/asType` の関数/メソッド両パスで確実に `TypeOp(Check/Cast)` 生成、`print(isType(...))` 直下もdst化
2) MIR26命令ダイエットの凍結
- TypeOp統合: Check/Castの意味論確定、Printer表示/エフェクト統一
- WeakRef/Barrier統合: flag ON/OFFで差分固定PoC featureで比較可能に
- 命令リストの合意化: 26命令でのPrinter/Verifier/Optimizer整合
3) Verifier/Printer/Optimizer整合
- Verifier: mergeでのphi未使用検知/支配関係、Barrier位置/WeakRef整合のチェック
- Printer: `--mir-verbose` で TypeOp/WeakRef/Barrier を明示、`--mir-verbose-effects``pure|readonly|side`
- Optimizer: 未lowering安全ネットCall/BoxCall→TypeOp強化、`NYASH_OPT_DIAG_FAIL=1` で診断をCIゲート化
4) VM整合ホットパス健全化
- BinOp: `and`/`or` 実装、BoxRef×BoxRefの数値演算サポート
- Compare/Branch: 既定のVoid/Bool/Intセマンティクスを維持、回帰テスト
- Array/Map/BoxCall: get/set/push/size のfast-path・identity shareの確認
- VM Stats: `--vm-stats`, `--vm-stats-json` の代表ケース更新
5) スナップショット/CI導線
- 軽量スナップショット: TypeOp/extern_call/loop/await/boxcall の含有チェックを代表ケースで固定
- ゴールデン比較: `tools/snapshot_mir.sh` + `tools/ci_check_golden.sh` の運用整備
- CLI分離テスト: `cargo test -p core` のみで回る構成CLI変更で止まらない
6) ランタイム/API整備
- ResultBox移行: `box_trait::ResultBox``boxes::ResultBox` へ全面置換、互換層の段階削除
- ドキュメント同期: CURRENT_TASK/CLAUDE/phase-docを更新し参照経路を一本化
## ✅ 受け入れ基準P2P着手ゲート
- [ ] MIR26整合完了Printer/Verifier/Optimizer一致・効果表記統一
- [ ] Loop SSA復帰Phi/Seal/Pred更新がVerifierで合格
- [ ] TypeOp網羅is/as/isType/asTypeの早期loweringOptimizer診断ONで回帰ゼロ
- [ ] 軽量スナップショット緑TypeOp/extern_call/loop/await/boxcall
- [ ] VM未実装の解消And/Or・BoxRef演算
- [ ] CLI分離テスト導線`cargo test -p core`)安定
- [ ] ResultBox移行完了旧参照なし
- [ ] 命令セットの単一出典化INSTRUCTION_SET.mdと総数26のテストがCIで緑
## 🪜 タスク分解(実行順)
1. Builder移行完了命令フィールド名・効果一致
2. Loop SSA復帰Phi/Seal/Pred更新の段階適用
3. TypeOp早期loweringの網羅 + Optimizer安全ネットの強化
4. MIR26統合TypeOp/WeakRef/BarrierとPrinter/Verifier/Optimizer整合
5. VM補強and/or, BoxRef演算, Array/Map fast-path確認
6. 軽量スナップショット + CLI分離テスト + ResultBox移行の仕上げ
## 🔗 依存/参照
- 次フェーズP2P本体: [phase_9_79_p2pbox_rebuild.md](phase_9_79_p2pbox_rebuild.md)
- CURRENT_TASKの「近々/中期」および「Phase 10 着手ゲート」
- `docs/reference/execution-backend/p2p_spec.md`P2Pは9.79で実装)
## 🚫 非スコープ
- P2PBox/IntentBox/MessageBus実装9.79で扱う)
- Cranelift JIT/LLVM AOTPhase 10以降
---
メモ: 9.78hは「MIRの足場を固める」段階。ここで26命令・SSA・検証・スナップショット・VM整合・ResultBox移行までを完了し、9.79(P2P)→Phase 10(Cranelift)へ安全に進む。

View File

@ -0,0 +1,44 @@
# Phase 9.79: P2PBox再設計・実装Cranelift前に完了
Status: Planned (Pre-Cranelift priority)
Last Updated: 2025-08-25
## 🎯 目的
Cranelift導入前にP2P通信基盤P2PBox/IntentBox/MessageBus/Transportsを再設計・実装し、VM/インタープリター双方で安定動作させる。
## 📦 スコープ
1) モデル/API
- IntentBoxTLV/serde互換
- MessageBus単一共有・購読/発行・ログ)
- P2PBoxnew/on/send/pack、デリゲーション整合
2) Transports段階導入
- InProcess同プロセスbus
- WebSocketWSクライアント/サーバ連携)
- WebRTC将来、 signalingはOut of Scope
3) 実行統合
- VM/InterpreterのBoxCall経由で同一API
- プラグイン/ExternCallと競合しない設計BIDと将来統合
## ✅ 受け入れ基準
- `p2p_spec.md` の代表ケースがVM/Interpreterで成功
- E2E: `node_a.send("bob", IntentBox(...))` が InProcess で往復確認
- `NYASH_VM_DEBUG_BOXCALL=1` でも追跡容易(ログ整備)
## 🪜 実装ステップ
前提9.78h: [phase_9_78h_mir_pipeline_stabilization.md](phase_9_78h_mir_pipeline_stabilization.md) の受け入れ基準を満たすこと。
1. IntentBoxの最小実装payload: MapBox/ArrayBox
2. MessageBus購読/発行、ハンドラ登録)
3. P2PBoxnew/on/send、packはビルトインのみ
4. InProcessTransport同プロセス配送
5. WebSocketTransport PoC非同期I/OはInterpreter側、VMはフォールバック
6. E2E/スナップショット・ドキュメント整備
## 🔗 参考
- docs/reference/execution-backend/p2p_spec.md
- docs/guides/p2p-guide.md
---
備考: 既存 `src/boxes/p2p_box.rs` は古い設計。完全新規で実装する。

View File

@ -1,5 +1,8 @@
# Phase 9.8: BIDレジストリ + 自動コード生成ツールWASM/VM/LLVM/言語) # Phase 9.8: BIDレジストリ + 自動コード生成ツールWASM/VM/LLVM/言語)
Status: PlannedPhase 8.6完了後に着手)
Last Updated: 2025-08-25
目的What/Why 目的What/Why
- 外部ライブラリをBoxBIDとして配布・発見・利用するための基盤を用意する。 - 外部ライブラリをBoxBIDとして配布・発見・利用するための基盤を用意する。
- 当面は nyash.toml にBID情報を“埋め込む”方式で回し、将来は外部BID(manifest)参照+自動生成へ段階拡張する。 - 当面は nyash.toml にBID情報を“埋め込む”方式で回し、将来は外部BID(manifest)参照+自動生成へ段階拡張する。

View File

@ -1,5 +1,8 @@
# 🌐 P2PBox完全実装 - AI大会議仕様準拠 # 🌐 P2PBox完全実装 - AI大会議仕様準拠
Status: PlannedPhase 9.79で実装、Cranelift前に完了
Roadmap: docs/development/roadmap/phases/phase-9/phase_9_79_p2pbox_rebuild.md
## 📋 Issue概要 ## 📋 Issue概要
**目標**: NyaMeshP2Pライブラリ実現のためのP2P通信システムを、AI大会議で決定した最新仕様に従って完全実装する **目標**: NyaMeshP2Pライブラリ実現のためのP2P通信システムを、AI大会議で決定した最新仕様に従って完全実装する
@ -251,4 +254,4 @@ pub enum SendError {
--- ---
🎉 **この実装により、Nyashは本格的なP2P通信システムを持つ現代的プログラミング言語になります** 🎉 **この実装により、Nyashは本格的なP2P通信システムを持つ現代的プログラミング言語になります**

View File

@ -0,0 +1,45 @@
# Nyash MIR Instruction Set (Canonical 26)
Status: Canonical (Source of Truth)
Last Updated: 2025-08-25
この文書はNyashのMIR命令セットの唯一の参照26命令だよ。実装は常にこの一覧に一致し、総数はテストで26に固定する。
注意: Debug/Nop/Safepointはビルドモードでの降格用メタ命令であり、コア26命令には数えない。
## Core Instructions26
- Const
- Copy
- Load
- Store
- UnaryOp
- BinOp
- Compare
- Jump
- Branch
- Phi
- Return
- Call
- ExternCall
- BoxCall
- NewBox
- ArrayGet
- ArraySet
- RefNew
- RefGet
- RefSet
- Await
- Print
- TypeOpTypeCheck/Cast統合
- WeakRefWeakNew/WeakLoad統合
- BarrierRead/Write統合
## Meta (降格対象; カウント外)
- Debug
- Nop
- Safepoint
## 同期ルール
- 命令の追加/削除/統合は、まずこの文書を更新し、次に実装(列挙/Printer/Verifier/Optimizer/VMを同期。最後に「総数=26」テストを更新する。
- 実装が26を外れた場合はCIを赤にする設計の合意なく増減させないため

View File

@ -428,8 +428,12 @@ impl VM {
MirInstruction::Const { dst, value } => MirInstruction::Const { dst, value } =>
self.execute_const(*dst, value), self.execute_const(*dst, value),
MirInstruction::BinOp { dst, op, lhs, rhs } => MirInstruction::BinOp { dst, op, lhs, rhs } => {
self.execute_binop(*dst, op, *lhs, *rhs), if std::env::var("NYASH_VM_DEBUG_ANDOR").ok().as_deref() == Some("1") {
eprintln!("[VM] execute_instruction -> BinOp({:?})", op);
}
self.execute_binop(*dst, op, *lhs, *rhs)
},
MirInstruction::UnaryOp { dst, op, operand } => MirInstruction::UnaryOp { dst, op, operand } =>
self.execute_unaryop(*dst, op, *operand), self.execute_unaryop(*dst, op, *operand),
@ -624,7 +628,122 @@ impl VM {
/// Execute binary operation /// Execute binary operation
pub(super) fn execute_binary_op(&self, op: &BinaryOp, left: &VMValue, right: &VMValue) -> Result<VMValue, VMError> { pub(super) fn execute_binary_op(&self, op: &BinaryOp, left: &VMValue, right: &VMValue) -> Result<VMValue, VMError> {
// Fast path: logical AND/OR accept any truthy via as_bool (supports BoxRef BoolBox/Void coercions)
if matches!(*op, BinaryOp::And | BinaryOp::Or) {
let l = left.as_bool()?;
let r = right.as_bool()?;
return Ok(VMValue::Bool(match *op { BinaryOp::And => l && r, BinaryOp::Or => l || r, _ => unreachable!() }));
}
match (left, right) { match (left, right) {
// Logical booleans (native)
(VMValue::Bool(l), VMValue::Bool(r)) => {
let result = match op {
BinaryOp::And => *l && *r,
BinaryOp::Or => *l || *r,
_ => return Err(VMError::TypeError(format!(
"Unsupported boolean operation: {:?}", op
))),
};
Ok(VMValue::Bool(result))
}
// Logical booleans (BoxRef BoolBox)
(VMValue::BoxRef(lb), VMValue::BoxRef(rb))
if lb.as_any().downcast_ref::<BoolBox>().is_some()
&& rb.as_any().downcast_ref::<BoolBox>().is_some() =>
{
let l = lb.as_any().downcast_ref::<BoolBox>().unwrap().value;
let r = rb.as_any().downcast_ref::<BoolBox>().unwrap().value;
let result = match op {
BinaryOp::And => l && r,
BinaryOp::Or => l || r,
_ => return Err(VMError::TypeError(format!(
"Unsupported boolean BoxRef operation: {:?}", op
))),
};
Ok(VMValue::Bool(result))
}
// Mixed boolean forms (BoxRef BoolBox with native Bool)
(VMValue::BoxRef(lb), VMValue::Bool(r)) if lb.as_any().downcast_ref::<BoolBox>().is_some() => {
let l = lb.as_any().downcast_ref::<BoolBox>().unwrap().value;
let result = match op {
BinaryOp::And => l && *r,
BinaryOp::Or => l || *r,
_ => return Err(VMError::TypeError(format!(
"Unsupported boolean operation: {:?}", op
))),
};
Ok(VMValue::Bool(result))
}
(VMValue::Bool(l), VMValue::BoxRef(rb)) if rb.as_any().downcast_ref::<BoolBox>().is_some() => {
let r = rb.as_any().downcast_ref::<BoolBox>().unwrap().value;
let result = match op {
BinaryOp::And => *l && r,
BinaryOp::Or => *l || r,
_ => return Err(VMError::TypeError(format!(
"Unsupported boolean operation: {:?}", op
))),
};
Ok(VMValue::Bool(result))
}
// Arithmetic with BoxRef(IntegerBox)
(VMValue::BoxRef(li), VMValue::BoxRef(ri))
if li.as_any().downcast_ref::<IntegerBox>().is_some()
&& ri.as_any().downcast_ref::<IntegerBox>().is_some() =>
{
let l = li.as_any().downcast_ref::<IntegerBox>().unwrap().value;
let r = ri.as_any().downcast_ref::<IntegerBox>().unwrap().value;
let res = match op {
BinaryOp::Add => l + r,
BinaryOp::Sub => l - r,
BinaryOp::Mul => l * r,
BinaryOp::Div => {
if r == 0 { return Err(VMError::DivisionByZero); }
l / r
}
_ => return Err(VMError::InvalidInstruction(format!(
"Unsupported integer BoxRef operation: {:?}", op
))),
};
Ok(VMValue::Integer(res))
}
// Mixed Integer forms: BoxRef<IntegerBox> with native Integer
(VMValue::BoxRef(li), VMValue::Integer(r)) if li.as_any().downcast_ref::<IntegerBox>().is_some() => {
let l = li.as_any().downcast_ref::<IntegerBox>().unwrap().value;
let res = match op {
BinaryOp::Add => l + *r,
BinaryOp::Sub => l - *r,
BinaryOp::Mul => l * *r,
BinaryOp::Div => {
if *r == 0 { return Err(VMError::DivisionByZero); }
l / *r
}
_ => return Err(VMError::InvalidInstruction(format!(
"Unsupported integer operation: {:?}", op
))),
};
Ok(VMValue::Integer(res))
}
(VMValue::Integer(l), VMValue::BoxRef(ri)) if ri.as_any().downcast_ref::<IntegerBox>().is_some() => {
let r = ri.as_any().downcast_ref::<IntegerBox>().unwrap().value;
let res = match op {
BinaryOp::Add => *l + r,
BinaryOp::Sub => *l - r,
BinaryOp::Mul => *l * r,
BinaryOp::Div => {
if r == 0 { return Err(VMError::DivisionByZero); }
*l / r
}
_ => return Err(VMError::InvalidInstruction(format!(
"Unsupported integer operation: {:?}", op
))),
};
Ok(VMValue::Integer(res))
}
(VMValue::Integer(l), VMValue::Integer(r)) => { (VMValue::Integer(l), VMValue::Integer(r)) => {
let result = match op { let result = match op {
BinaryOp::Add => *l + *r, BinaryOp::Add => *l + *r,
@ -681,7 +800,7 @@ impl VM {
} }
}, },
_ => Err(VMError::TypeError(format!("Unsupported binary operation: {:?} on {:?} and {:?}", op, left, right))), _ => Err(VMError::TypeError(format!("Unsupported binary operation [vm.rs updated]: {:?} on {:?} and {:?}", op, left, right))),
} }
} }

View File

@ -19,11 +19,28 @@ impl VM {
/// Execute a binary operation instruction /// Execute a binary operation instruction
pub(super) fn execute_binop(&mut self, dst: ValueId, op: &BinaryOp, lhs: ValueId, rhs: ValueId) -> Result<ControlFlow, VMError> { pub(super) fn execute_binop(&mut self, dst: ValueId, op: &BinaryOp, lhs: ValueId, rhs: ValueId) -> Result<ControlFlow, VMError> {
let left = self.get_value(lhs)?; // Short-circuit semantics for logical ops using boolean coercion
let right = self.get_value(rhs)?; match *op {
let result = self.execute_binary_op(op, &left, &right)?; BinaryOp::And | BinaryOp::Or => {
self.set_value(dst, result); if std::env::var("NYASH_VM_DEBUG_ANDOR").ok().as_deref() == Some("1") {
Ok(ControlFlow::Continue) eprintln!("[VM] And/Or short-circuit path");
}
let left = self.get_value(lhs)?;
let right = self.get_value(rhs)?;
let lb = left.as_bool()?;
let rb = right.as_bool()?;
let out = match *op { BinaryOp::And => lb && rb, BinaryOp::Or => lb || rb, _ => unreachable!() };
self.set_value(dst, VMValue::Bool(out));
Ok(ControlFlow::Continue)
}
_ => {
let left = self.get_value(lhs)?;
let right = self.get_value(rhs)?;
let result = self.execute_binary_op(op, &left, &right)?;
self.set_value(dst, result);
Ok(ControlFlow::Continue)
}
}
} }
/// Execute a unary operation instruction /// Execute a unary operation instruction
@ -485,4 +502,4 @@ impl VM {
Ok(ControlFlow::Continue) Ok(ControlFlow::Continue)
} }
} }