diff --git a/CLAUDE.md b/CLAUDE.md index 36d92cc7..73fad945 100644 --- a/CLAUDE.md +++ b/CLAUDE.md @@ -4,7 +4,7 @@ Nyashプログラミング言語開発に必要な情報をまとめたクイッ ## 🧭 Start Here (最初に見る) - **🎯 主軸タスク**: [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/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) @@ -17,7 +17,7 @@ Nyashプログラミング言語開発に必要な情報をまとめたクイッ - **Phase 8.5**: MIRダイエット(35命令→20命令) - **Phase 8.6**: VM性能改善(0.9倍 → 2倍以上) - **Phase 9**: JIT実装 -- **Phase 10**: AOT最終形態 +- **Phase 10**: Cranelift JIT(主経路)/ LLVM AOTは後段 **迷ったらcopilot_issues.txtを確認せよ!** diff --git a/docs/development/roadmap/phases/phase-8/phase_8_5_mir_25_instruction_specification.md b/docs/archive/phase_8_5_mir_25_instruction_specification.md similarity index 96% rename from docs/development/roadmap/phases/phase-8/phase_8_5_mir_25_instruction_specification.md rename to docs/archive/phase_8_5_mir_25_instruction_specification.md index 45fb58b5..b14f4161 100644 --- a/docs/development/roadmap/phases/phase-8/phase_8_5_mir_25_instruction_specification.md +++ b/docs/archive/phase_8_5_mir_25_instruction_specification.md @@ -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 Progress(Printer/Verifier/Optimizer整合は未完) +Last Updated: 2025-08-25 ## 🎯 Issue概要 @@ -335,4 +340,4 @@ diff interp.out vm.out && diff vm.out wasm.out **優先度**: Critical(Phase 8.4完了直後) **担当**: Copilot + Claude協調実装 **仕様策定**: ChatGPT5 + AI大会議(Gemini+Codex)完全一致決定 -**最終目標**: Nyashコア価値の完璧なIR化実現 \ No newline at end of file +**最終目標**: Nyashコア価値の完璧なIR化実現 diff --git a/docs/development/current/CURRENT_TASK.md b/docs/development/current/CURRENT_TASK.md index a8d27ecf..58e45651 100644 --- a/docs/development/current/CURRENT_TASK.md +++ b/docs/development/current/CURRENT_TASK.md @@ -1,5 +1,33 @@ # 🎯 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.79(P2P本体 前提: 9.78h完了): `docs/development/roadmap/phases/phase-9/phase_9_79_p2pbox_rebuild.md` +- Phase 10(Cranelift JIT主経路): `docs/development/roadmap/phases/phase-10/phase_10_cranelift_jit_backend.md` + + ## 🚨 現在の状況(2025-08-25) ### ✅ 完了したタスク @@ -26,6 +54,13 @@ - execute_instruction_old削除(691行削減) - 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の確認** @@ -33,6 +68,11 @@ - Phase 8.5: MIRダイエット(35命令→20命令) - 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命令対応** - TypeOp/WeakRef/Barrierのプリンタ拡張 - スナップショット整備 @@ -43,6 +83,39 @@ - 弱参照フィールドのWeakLoad/WeakNew対応 - 関数スタイル `isType/asType` の早期lowering強化 +## 🗺️ 計画の粒度(近々/中期/長期) + +### 近々(1–2週間) +- 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)へ拡張。 + +### 中期(3–4週間) +- WeakRef/Barrier統合: lowering(WeakNew/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.4–8.6連動) +- AST→MIR Lowering完全化(8.4): すべての言語要素を新MIRへ安定lower。未対応分岐をゼロに。 +- MIRダイエット(8.5): 命令の統一・簡素化(TypeOp/WeakRef/Barrierの統合効果)を活用し最小集合へ。 +- VM性能改善(8.6): Hot-path(BoxCall/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の早期lowering+Optimizer診断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ビルダーのモジュール化完了(Phase 1-8コミット済み) - **問題**: MIR命令構造の変更により、expressions.rsでエラー発生 @@ -121,6 +194,12 @@ - 関数スタイル `isType/asType` の早期loweringを強化(`Literal("T")` と `new StringBox("T")` を確実に検出) - `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の補強(中期) - `TypeOp(Cast)` の数値キャスト(Int/Float)安全化、誤用時TypeError整備 - Verifierに26命令整合(Barrier位置、WeakRef整合、支配関係)チェックを追加 @@ -170,6 +249,12 @@ cargo build --release -j32 補足: 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` + ## ▶ 実行コマンド例 計測実行: diff --git a/docs/development/roadmap/native-plan/copilot_issues.txt b/docs/development/roadmap/native-plan/copilot_issues.txt index abb2a3a9..1ee844f6 100644 --- a/docs/development/roadmap/native-plan/copilot_issues.txt +++ b/docs/development/roadmap/native-plan/copilot_issues.txt @@ -163,22 +163,29 @@ Acceptance: ------------------------------------------------------------ -## 🏆 Phase 10: LLVM Direct AOT - 実現可能性検証中 +## 🏆 Phase 10: Cranelift JIT(主経路) + LLVM AOT(後段研究) Summary: -- **調査・実証段階**: MIR→LLVM IR直接変換による最高性能AOT実現を目指す -- インタープリターとの併用で最適な開発・実行体験を提供 -- 非同期処理フルサポート(async/await のネイティブ実装) +- **主経路**: MIR→VMを維持しつつ、ホットパスをCraneliftでJIT化して2倍以上の高速化を狙う +- **LLVM AOT**: 設計資産は維持しつつ、JIT安定後(Phase 11以降)に検討 +- **目標**: VMのホットパス(BoxCall/Array/Map)で体感高速化、ベンチで優位性を実証 -Priority: **Research** (Phase 9.8完了後に実現可能性評価) -Expected Duration: **調査3週間 + 実装3-6ヶ月**(実現可能性次第) +Priority: **High**(Phase 8.6完了直後着手) +Expected Duration: **実装6-8週間(段階導入)** -### 🔍 実現可能性チェック項目 -- ✅ **技術的基盤**: MIR 26命令セット(LLVM IR変換可能) -- ✅ **AOTスケルトン**: 基本構造完成済み -- ✅ **型情報システム**: 最適化に必要な情報完備 -- 🔄 **Proof of Concept**: 基本的なMIR→LLVM変換の実証 -- ❓ **実装工数**: 現実的な期間での完成可能性 +### 🚧 Start Gate(着手前の必須完了) +- MIRダイエット(26命令)整合完了:Printer/Verifier/Optimizer一致・効果ラベル統一 +- Loop SSA復帰:Phi/Seal/Pred更新のVerifierチェック合格 +- TypeOp網羅:is/as/isType/asTypeの早期lowering+Optimizer診断(未lowering検出) +- 軽量スナップショット: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(ブラウザ対応) ``` -### 🏗️ Phase 10.1: Proof of Concept(3週間)**実現可能性評価** +### 🏗️ Phase 10.1: Proof of Concept(2週間) -Investigation Steps: -1) **MIR→LLVM IR変換調査**: 基本命令の変換可能性検証 -2) **Box型表現調査**: LLVM IRでのBox型効率的実装方法 -3) **C-ABI統合調査**: プラグインとの連携可能性 -4) **性能予測**: 理論的な高速化効果の算出 +Steps: +1) **JITマネージャ**: プロファイル収集・しきい値設計 +2) **MIR→CLIF最小Lower**: Const/BinOp/Compare/Branch/Return +3) **呼出しABI**: VMとの引数/戻り値・BoxRef受け渡し -### 🏗️ Phase 10.2: 基本実装(3ヶ月)**実現可能と判断した場合** +### 🏗️ Phase 10.2: 基本実装(4週間) Implementation Steps: -1) `src/backend/llvm/` 基盤構築 -2) MIR→LLVM IR基本変換 -3) Box操作の最適化(エスケープ解析) -4) ベンチマーク: 100倍目標 +1) `src/backend/cranelift/` 基盤構築 +2) MIR→CLIF Lowerの拡充(Call/BoxCall/Array系) +3) JIT関数テーブル + VM切替の安定化 +4) ベンチ: VM比2×目標、BoxCallホットパス優位 -### 🌐 Phase 10.3: 非同期拡張(2ヶ月)**基本実装完了後** - -非同期サポート戦略: -- **async/await ネイティブ実装**: Rust風の効率的な非同期 -- **軽量ランタイム**: 独自Future実装 -- **インタープリター互換**: 同じ非同期セマンティクス - -```rust -// Phase 10.3: 非同期LLVM実装(予定) -FutureNew → LLVM coroutine intrinsics -Await → LLVM suspend/resume points -FutureSet → completion notification -``` +### 🌐 Phase 10.3: 非同期の扱い(最小) +- awaitは当面VM側で処理継続(JIT対象外) +- JIT関数は同期区間を優先(将来拡張) ### 技術アプローチ 🤖 Copilot協力期待: -- **LLVM統合**: MIR→LLVM IR変換基盤 -- **非同期実装**: coroutine/suspend points -- **エスケープ解析**: Box→スタック値最適化 -- **型特殊化**: コンパイル時型推論・特殊化 +- **Cranelift統合**: MIR→CLIF Lower +- **VMハイブリッド**: JITスイッチ・例外/フォールバック +- **ホットパス最適化**: BoxCall/Array/Mapの直結最適化 ### パフォーマンス目標 -- **同期処理**: 100-1000倍高速化 -- **非同期処理**: Tokio並みの効率性 -- **メモリ効率**: Box割当数80%削減 -- **起動時間**: ネイティブレベル(<10ms) +- **同期処理**: VM比 2×以上(段階的に引き上げ) +- **起動時間**: 低オーバーヘッド(JIT初回コストを隠蔽) ### Acceptance Criteria -- インタープリターとの完全な互換性 -- 非同期処理の効率的実装 -- 1000倍高速化達成(同期処理) -- プロダクションレベル最適化 +- インタープリター/VMとの互換性(結果一致) +- ホットパスでの実測高速化(2×) +- 回帰テスト・スナップショットの整備 References: - docs/予定/native-plan/issues/phase_10_x_llvm_backend_skeleton.md @@ -464,7 +456,7 @@ Acceptance Criteria: ## Phase 10以降の展望 🚀 **WASM復旧完了** (Phase 9.77): 基本機能の完全動作 -🚀 **LLVM Direct AOT** (Phase 10): 100-1000倍高速化 +🚀 **Cranelift JIT** (Phase 10): VM比2×以上の高速化(段階導入) 🚀 **非同期ネイティブ実装** (Phase 10.2): async/await完全対応 🚀 **インタープリター併用** : 開発・本番両対応 diff --git a/docs/development/roadmap/phases/phase-10/phase10_aot_scaffolding.md b/docs/development/roadmap/phases/phase-10/phase10_aot_scaffolding.md index ac79edfd..ac974788 100644 --- a/docs/development/roadmap/phases/phase-10/phase10_aot_scaffolding.md +++ b/docs/development/roadmap/phases/phase-10/phase10_aot_scaffolding.md @@ -1,5 +1,8 @@ # 🏆 Phase 10: LLVM Direct AOT(最高性能実現) +Status: Deferred(Cranelift JITをPhase 10の主経路に採用、AOTは後段研究) +Last Updated: 2025-08-25 + ## 📋 Summary MIR→LLVM IR直接変換による最高性能AOT実現。Cranelift JITをスキップし、実用優先戦略でLLVMの強力な最適化を直接活用する。 diff --git a/docs/development/roadmap/phases/phase-10/phase_10_cranelift_jit_backend.md b/docs/development/roadmap/phases/phase-10/phase_10_cranelift_jit_backend.md new file mode 100644 index 00000000..31aa1429 --- /dev/null +++ b/docs/development/roadmap/phases/phase-10/phase_10_cranelift_jit_backend.md @@ -0,0 +1,62 @@ +# Phase 10: Cranelift JIT Backend(MIR→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) +- 呼出しABI(Nyash 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以降の研究路線に移行(設計ドキュメントは維持)。 + diff --git a/docs/development/roadmap/phases/phase-10/phase_10_x_llvm_backend_skeleton.md b/docs/development/roadmap/phases/phase-10/phase_10_x_llvm_backend_skeleton.md index 9385ebf9..70bfe09a 100644 --- a/docs/development/roadmap/phases/phase-10/phase_10_x_llvm_backend_skeleton.md +++ b/docs/development/roadmap/phases/phase-10/phase_10_x_llvm_backend_skeleton.md @@ -1,5 +1,8 @@ # Phase 10: LLVM Backend Skeleton(MIR→LLVM IR AOT 最小実装) +Status: Deferred(Cranelift JIT先行のため、AOTは後段で検討) +Last Updated: 2025-08-25 + 目的 - MIRからLLVM IRへの直接変換と、最小AOTパイプラインを構築するための実装ガイド(Copilot向けタスクリスト)。 - Phase 9.7(ABI/BID+ExternCall)を前提に、外部呼び出しの取り扱いも含めて安全に前進。 diff --git a/docs/development/roadmap/phases/phase-8/phase_8_4_ast_mir_lowering.md b/docs/development/roadmap/phases/phase-8/phase_8_4_ast_mir_lowering.md index aa8e354b..21f45a43 100644 --- a/docs/development/roadmap/phases/phase-8/phase_8_4_ast_mir_lowering.md +++ b/docs/development/roadmap/phases/phase-8/phase_8_4_ast_mir_lowering.md @@ -1,5 +1,8 @@ # Phase 8.4: AST→MIR Lowering完全実装 +Status: In Progress (builder分割完了、lowering未完) +Last Updated: 2025-08-25 + ## 🎯 Issue概要 **現在の最重要課題**: Phase 8.3のBox操作WASMが実際にテストできない @@ -332,4 +335,4 @@ $HOME/.wasmtime/bin/wasmtime run clean_test.wat --invoke main **優先度**: Critical **担当**: Copilot + Claude協調実装 -**最終目標**: test_wasm_box_integration.nyash が完全動作 \ No newline at end of file +**最終目標**: test_wasm_box_integration.nyash が完全動作 diff --git a/docs/development/roadmap/phases/phase-8/phase_8_5_mir_35_to_26_reduction.md b/docs/development/roadmap/phases/phase-8/phase_8_5_mir_35_to_26_reduction.md index 66cba01e..65a70c58 100644 --- a/docs/development/roadmap/phases/phase-8/phase_8_5_mir_35_to_26_reduction.md +++ b/docs/development/roadmap/phases/phase-8/phase_8_5_mir_35_to_26_reduction.md @@ -1,5 +1,8 @@ # Phase 8.5: MIR 35→26命令削減プロジェクト(緊急実装) +Status: In Progress(TypeOp/WeakRef/Barrier統合の整合中) +Last Updated: 2025-08-25 + ## 🚨 **緊急度: Critical** **発見日**: 2025年8月17日 @@ -256,4 +259,4 @@ fn verify_ownership_forest_constraints(mir: &MirModule) -> Result<(), VerifyErro **想定完了**: 2025年8月17日中(本日中) **優先度**: Critical(他全作業に優先) -**驚異的な進捗**: 当初5週間想定だった作業を1日で90%完了! \ No newline at end of file +**驚異的な進捗**: 当初5週間想定だった作業を1日で90%完了! diff --git a/docs/development/roadmap/phases/phase-8/phase_8_6_vm_performance_improvement.md b/docs/development/roadmap/phases/phase-8/phase_8_6_vm_performance_improvement.md index d472d729..66612bf0 100644 --- a/docs/development/roadmap/phases/phase-8/phase_8_6_vm_performance_improvement.md +++ b/docs/development/roadmap/phases/phase-8/phase_8_6_vm_performance_improvement.md @@ -1,5 +1,8 @@ # Phase 8.6: VM性能改善実装(緊急修正) +Status: In Progress(Critical; 0.9×→2×目標) +Last Updated: 2025-08-25 + ## 🚨 Issue概要 **緊急課題**: VMがインタープリターより性能劣化(0.9倍)している根本問題の解決 @@ -435,4 +438,4 @@ echo "✅ 全テスト完了" **期間**: 2週間 **担当**: Copilot + Claude協調 -この問題解決により、Nyash言語のVM実行性能が飛躍的に向上し、Phase 9 JIT実装への道筋が確立されます 🚀 \ No newline at end of file +この問題解決により、Nyash言語のVM実行性能が飛躍的に向上し、Phase 9 JIT実装への道筋が確立されます 🚀 diff --git a/docs/development/roadmap/phases/phase-9/Phase-9.75g-0-BID-FFI-Developer-Guide.md b/docs/development/roadmap/phases/phase-9/Phase-9.75g-0-BID-FFI-Developer-Guide.md index e0683574..9a66b03e 100644 --- a/docs/development/roadmap/phases/phase-9/Phase-9.75g-0-BID-FFI-Developer-Guide.md +++ b/docs/development/roadmap/phases/phase-9/Phase-9.75g-0-BID-FFI-Developer-Guide.md @@ -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 **Status**: ✅ **PRODUCTION READY** @@ -404,4 +404,4 @@ Phase 9.75g-0 **perfectly positions** Nyash for Phase 10 (LLVM AOT): **Last Updated**: 2025-08-19 **Author**: Claude (AI Assistant) **Review Status**: Ready for Team Review -**Confidentiality**: Open Source Development Documentation \ No newline at end of file +**Confidentiality**: Open Source Development Documentation diff --git a/docs/development/roadmap/phases/phase-9/phase_9_78b_interpreter_architecture_refactoring.md b/docs/development/roadmap/phases/phase-9/phase_9_78b_interpreter_architecture_refactoring.md index d1d56dc2..33065351 100644 --- a/docs/development/roadmap/phases/phase-9/phase_9_78b_interpreter_architecture_refactoring.md +++ b/docs/development/roadmap/phases/phase-9/phase_9_78b_interpreter_architecture_refactoring.md @@ -1,5 +1,8 @@ # Phase 9.78b: インタープリター・VM統合アーキテクチャ再設計 +Status: Not Started(設計完了、実装未着手) +Last Updated: 2025-08-25 + **作成日**: 2025-08-21 **優先度**: 最高(Phase 9.78aの前提条件) **設計者**: Codex exec (天才的洞察) @@ -209,4 +212,4 @@ use core::model::BoxDeclaration as InterpreterBoxDecl; --- **総工数見積もり**: 14日(各ステップにバッファ含む) -**推奨アプローチ**: Step 1-2を先行実施して感触を掴む \ No newline at end of file +**推奨アプローチ**: Step 1-2を先行実施して感触を掴む diff --git a/docs/development/roadmap/phases/phase-9/phase_9_78h_mir_pipeline_stabilization.md b/docs/development/roadmap/phases/phase-9/phase_9_78h_mir_pipeline_stabilization.md new file mode 100644 index 00000000..7be5384b --- /dev/null +++ b/docs/development/roadmap/phases/phase-9/phase_9_78h_mir_pipeline_stabilization.md @@ -0,0 +1,72 @@ +# Phase 9.78h: MIRパイプライン前提整備(P2P/Cranelift前の全作業) + +Status: In Progress(9.79 P2PBox前のゲート) +Last Updated: 2025-08-25 + +## 🎯 目的 +P2PBox(Phase 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の早期lowering+Optimizer診断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 AOT(Phase 10以降) + +--- +メモ: 9.78hは「MIRの足場を固める」段階。ここで26命令・SSA・検証・スナップショット・VM整合・ResultBox移行までを完了し、9.79(P2P)→Phase 10(Cranelift)へ安全に進む。 diff --git a/docs/development/roadmap/phases/phase-9/phase_9_79_p2pbox_rebuild.md b/docs/development/roadmap/phases/phase-9/phase_9_79_p2pbox_rebuild.md new file mode 100644 index 00000000..547a7c7f --- /dev/null +++ b/docs/development/roadmap/phases/phase-9/phase_9_79_p2pbox_rebuild.md @@ -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 +- IntentBox(TLV/serde互換) +- MessageBus(単一共有・購読/発行・ログ) +- P2PBox(new/on/send/pack、デリゲーション整合) + +2) Transports(段階導入) +- InProcess(同プロセスbus) +- WebSocket(WSクライアント/サーバ連携) +- 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. P2PBox(new/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` は古い設計。完全新規で実装する。 diff --git a/docs/development/roadmap/phases/phase-9/phase_9_8_bid_registry_and_codegen.md b/docs/development/roadmap/phases/phase-9/phase_9_8_bid_registry_and_codegen.md index 74e1e855..88a6a570 100644 --- a/docs/development/roadmap/phases/phase-9/phase_9_8_bid_registry_and_codegen.md +++ b/docs/development/roadmap/phases/phase-9/phase_9_8_bid_registry_and_codegen.md @@ -1,5 +1,8 @@ # Phase 9.8: BIDレジストリ + 自動コード生成ツール(WASM/VM/LLVM/言語) +Status: Planned(Phase 8.6完了後に着手) +Last Updated: 2025-08-25 + 目的(What/Why) - 外部ライブラリをBox(BID)として配布・発見・利用するための基盤を用意する。 - 当面は nyash.toml にBID情報を“埋め込む”方式で回し、将来は外部BID(manifest)参照+自動生成へ段階拡張する。 diff --git a/docs/reference/execution-backend/p2p_spec.md b/docs/reference/execution-backend/p2p_spec.md index 5cedb836..46424397 100644 --- a/docs/reference/execution-backend/p2p_spec.md +++ b/docs/reference/execution-backend/p2p_spec.md @@ -1,5 +1,8 @@ # 🌐 P2PBox完全実装 - AI大会議仕様準拠 +Status: Planned(Phase 9.79で実装、Cranelift前に完了) +Roadmap: docs/development/roadmap/phases/phase-9/phase_9_79_p2pbox_rebuild.md + ## 📋 Issue概要 **目標**: NyaMeshP2Pライブラリ実現のためのP2P通信システムを、AI大会議で決定した最新仕様に従って完全実装する @@ -251,4 +254,4 @@ pub enum SendError { --- -🎉 **この実装により、Nyashは本格的なP2P通信システムを持つ現代的プログラミング言語になります!** \ No newline at end of file +🎉 **この実装により、Nyashは本格的なP2P通信システムを持つ現代的プログラミング言語になります!** diff --git a/docs/reference/mir/INSTRUCTION_SET.md b/docs/reference/mir/INSTRUCTION_SET.md new file mode 100644 index 00000000..ee16277b --- /dev/null +++ b/docs/reference/mir/INSTRUCTION_SET.md @@ -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 Instructions(26) +- Const +- Copy +- Load +- Store +- UnaryOp +- BinOp +- Compare +- Jump +- Branch +- Phi +- Return +- Call +- ExternCall +- BoxCall +- NewBox +- ArrayGet +- ArraySet +- RefNew +- RefGet +- RefSet +- Await +- Print +- TypeOp(TypeCheck/Cast統合) +- WeakRef(WeakNew/WeakLoad統合) +- Barrier(Read/Write統合) + +## Meta (降格対象; カウント外) +- Debug +- Nop +- Safepoint + +## 同期ルール +- 命令の追加/削除/統合は、まずこの文書を更新し、次に実装(列挙/Printer/Verifier/Optimizer/VM)を同期。最後に「総数=26」テストを更新する。 +- 実装が26を外れた場合はCIを赤にする(設計の合意なく増減させないため)。 + diff --git a/src/backend/vm.rs b/src/backend/vm.rs index d2c567a8..1442e6c7 100644 --- a/src/backend/vm.rs +++ b/src/backend/vm.rs @@ -428,8 +428,12 @@ impl VM { MirInstruction::Const { dst, value } => self.execute_const(*dst, value), - MirInstruction::BinOp { dst, op, lhs, rhs } => - self.execute_binop(*dst, op, *lhs, *rhs), + MirInstruction::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 } => self.execute_unaryop(*dst, op, *operand), @@ -624,7 +628,122 @@ impl VM { /// Execute binary operation pub(super) fn execute_binary_op(&self, op: &BinaryOp, left: &VMValue, right: &VMValue) -> Result { + // 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) { + // 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::().is_some() + && rb.as_any().downcast_ref::().is_some() => + { + let l = lb.as_any().downcast_ref::().unwrap().value; + let r = rb.as_any().downcast_ref::().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::().is_some() => { + let l = lb.as_any().downcast_ref::().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::().is_some() => { + let r = rb.as_any().downcast_ref::().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::().is_some() + && ri.as_any().downcast_ref::().is_some() => + { + let l = li.as_any().downcast_ref::().unwrap().value; + let r = ri.as_any().downcast_ref::().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 with native Integer + (VMValue::BoxRef(li), VMValue::Integer(r)) if li.as_any().downcast_ref::().is_some() => { + let l = li.as_any().downcast_ref::().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::().is_some() => { + let r = ri.as_any().downcast_ref::().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)) => { let result = match op { 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))), } } diff --git a/src/backend/vm_instructions.rs b/src/backend/vm_instructions.rs index 3ebb73e7..858c7323 100644 --- a/src/backend/vm_instructions.rs +++ b/src/backend/vm_instructions.rs @@ -19,11 +19,28 @@ impl VM { /// Execute a binary operation instruction pub(super) fn execute_binop(&mut self, dst: ValueId, op: &BinaryOp, lhs: ValueId, rhs: ValueId) -> Result { - 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) + // Short-circuit semantics for logical ops using boolean coercion + match *op { + BinaryOp::And | BinaryOp::Or => { + if std::env::var("NYASH_VM_DEBUG_ANDOR").ok().as_deref() == Some("1") { + 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 @@ -485,4 +502,4 @@ impl VM { Ok(ControlFlow::Continue) } -} \ No newline at end of file +}