ResultBox migration (stage 0): suppress legacy deprecation warnings in box_trait impls; keep dual handling in VM. Fix verifier Display for SuspiciousBarrierContext. Expose VM stats fields to vm_stats module. CLI core_ci guide and script in place.
This commit is contained in:
105
CLAUDE.md
105
CLAUDE.md
@ -3,11 +3,11 @@
|
|||||||
Nyashプログラミング言語開発に必要な情報をまとめたクイックリファレンス。
|
Nyashプログラミング言語開発に必要な情報をまとめたクイックリファレンス。
|
||||||
|
|
||||||
## 🧭 Start Here (最初に見る)
|
## 🧭 Start Here (最初に見る)
|
||||||
- **🎯 主軸タスク**: [docs/development/roadmap/native-plan/copilot_issues.txt](docs/development/roadmap/native-plan/copilot_issues.txt) **← 最重要!**
|
- **🎯 主軸タスク**: [copilot_issues.txt](docs/development/roadmap/native-plan/copilot_issues.txt) **← 最重要!**
|
||||||
- 現在のタスク: [docs/development/current/CURRENT_TASK.md](docs/development/current/CURRENT_TASK.md)(近々/中期/長期の計画は同ファイル先頭)
|
- **📋 現在のタスク**: [CURRENT_TASK.md](docs/development/current/CURRENT_TASK.md)(近々/中期/長期の計画は同ファイル先頭)
|
||||||
- ドキュメント入口: [docs/README.md](docs/README.md)
|
- **📚 言語仕様**: まず[LANGUAGE_REFERENCE_2025.md](docs/reference/language/LANGUAGE_REFERENCE_2025.md)を読む
|
||||||
- コア概念(速習): [docs/reference/architecture/nyash_core_concepts.md](docs/reference/architecture/nyash_core_concepts.md)
|
- **📦 Box システム**: [boxes-system/](docs/reference/boxes-system/)でAPI確認
|
||||||
- Netプラグイン(HTTP/TCP): [docs/reference/plugin-system/net-plugin.md](docs/reference/plugin-system/net-plugin.md)
|
- **⚙️ 実行バックエンド**: [execution-backends.md](docs/reference/architecture/execution-backends.md)
|
||||||
|
|
||||||
## 🤖 **Claude×Copilot協調開発の主軸**
|
## 🤖 **Claude×Copilot協調開発の主軸**
|
||||||
### 📋 **copilot_issues.txt - 開発の軸となるファイル**
|
### 📋 **copilot_issues.txt - 開発の軸となるファイル**
|
||||||
@ -21,6 +21,23 @@ Nyashプログラミング言語開発に必要な情報をまとめたクイッ
|
|||||||
|
|
||||||
**迷ったらcopilot_issues.txtを確認せよ!**
|
**迷ったらcopilot_issues.txtを確認せよ!**
|
||||||
|
|
||||||
|
## 🏃 開発の基本方針: 80/20ルール - 完璧より進捗
|
||||||
|
|
||||||
|
### なぜこのルールか?
|
||||||
|
**実装後、必ず新しい問題や転回点が生まれるから。**
|
||||||
|
- 100%完璧を目指すと、要件が変わったときの手戻りが大きい
|
||||||
|
- 80%で動くものを作れば、実際の使用からフィードバックが得られる
|
||||||
|
- 残り20%は、本当に必要かどうか実装後に判断できる
|
||||||
|
|
||||||
|
### 実践方法
|
||||||
|
1. **まず動くものを作る**(80%)
|
||||||
|
2. **改善アイデアは `ideas/` フォルダに記録**(20%)
|
||||||
|
3. **優先度に応じて後から改善**
|
||||||
|
|
||||||
|
例: VM and/or実装
|
||||||
|
- 80%: `as_bool()`で基本動作 → コミット ✅
|
||||||
|
- 20%: 短絡評価、型最適化 → `ideas/improvements/2025-08-25-vm-andor-shortcircuit.md`
|
||||||
|
|
||||||
## 🚀 クイックスタート
|
## 🚀 クイックスタート
|
||||||
|
|
||||||
### 🎯 実行方式選択 (重要!)
|
### 🎯 実行方式選択 (重要!)
|
||||||
@ -92,21 +109,16 @@ python3 -m http.server 8010
|
|||||||
- ネイティブ計画: [docs/development/roadmap/native-plan/](docs/development/roadmap/native-plan/)
|
- ネイティブ計画: [docs/development/roadmap/native-plan/](docs/development/roadmap/native-plan/)
|
||||||
- フェーズ課題: [docs/development/roadmap/](docs/development/roadmap/)
|
- フェーズ課題: [docs/development/roadmap/](docs/development/roadmap/)
|
||||||
- アーカイブ: [docs/archive/](docs/archive/)
|
- アーカイブ: [docs/archive/](docs/archive/)
|
||||||
### 🎯 よく使う情報
|
|
||||||
- Getting Started: [docs/guides/getting-started.md](docs/guides/getting-started.md)
|
### 🎯 よく使う情報(クイックアクセス)
|
||||||
- Language Guide: [docs/guides/language-guide.md](docs/guides/language-guide.md)
|
- **🔴 現在のタスク**: [CURRENT_TASK.md](docs/development/current/CURRENT_TASK.md) ← 今ココ!
|
||||||
- Playground Guide: [docs/guides/tutorials/playground_guide.md](docs/guides/tutorials/playground_guide.md)
|
- **🎮 Phase 9.78h**: [phase_9_78h_mir_pipeline_stabilization.md](docs/development/roadmap/phases/phase-9/phase_9_78h_mir_pipeline_stabilization.md)
|
||||||
### 📊 最新開発状況
|
- **📐 言語仕様**: [LANGUAGE_REFERENCE_2025.md](docs/reference/language/LANGUAGE_REFERENCE_2025.md)
|
||||||
- 現在のタスク: [docs/development/current/CURRENT_TASK.md](docs/development/current/CURRENT_TASK.md)
|
- **🤖 MIR 26命令**: [INSTRUCTION_SET.md](docs/reference/mir/INSTRUCTION_SET.md)
|
||||||
- ロードマップ: [docs/development/roadmap/](docs/development/roadmap/)
|
- **📦 Box API**: [boxes-system/](docs/reference/boxes-system/)
|
||||||
### 📖 詳細リファレンス
|
- **⚡ VM実装**: [VM_README.md](docs/reference/execution-backend/VM_README.md)
|
||||||
- リファレンス: [docs/reference/](docs/reference/)
|
- **🌐 Netプラグイン**: [net-plugin.md](docs/reference/plugin-system/net-plugin.md)
|
||||||
- 言語仕様: [docs/reference/language/LANGUAGE_REFERENCE_2025.md](docs/reference/language/LANGUAGE_REFERENCE_2025.md)
|
- **🎮 実装済みアプリ**: サイコロRPG・統計計算・LISPインタープリター
|
||||||
- 可視性/デリゲーション: [docs/reference/language/field-visibility-and-delegation.md](docs/reference/language/field-visibility-and-delegation.md)
|
|
||||||
- Box/プラグイン: [docs/reference/boxes-system/](docs/reference/boxes-system/), [docs/reference/plugin-system/](docs/reference/plugin-system/)
|
|
||||||
### 🎮 実用例・アプリ
|
|
||||||
- **[実用例](docs/guides/)** - サンプルコード・パターン集
|
|
||||||
- **実装済みアプリ**: サイコロRPG・統計計算・LISPインタープリター
|
|
||||||
|
|
||||||
## ⚡ 重要な設計原則
|
## ⚡ 重要な設計原則
|
||||||
|
|
||||||
@ -445,6 +457,47 @@ NYASH_VM_DEBUG=1 # VM のみ
|
|||||||
gemini -p "Nyashの実装で困っています..."
|
gemini -p "Nyashの実装で困っています..."
|
||||||
```
|
```
|
||||||
|
|
||||||
|
### 💡 アイデア管理(ideas/フォルダ)
|
||||||
|
|
||||||
|
**80/20ルールの「残り20%」を整理して管理**
|
||||||
|
|
||||||
|
```
|
||||||
|
ideas/
|
||||||
|
├── improvements/ # 80%実装の残り20%改善候補
|
||||||
|
│ ├── 2025-08-25-vm-andor-shortcircuit.md
|
||||||
|
│ └── archived/ # 実装済みor却下
|
||||||
|
│
|
||||||
|
├── new-features/ # 新機能アイデア
|
||||||
|
│ ├── 2025-08-25-repl-mode.md
|
||||||
|
│ └── archived/
|
||||||
|
│
|
||||||
|
└── other/ # その他すべて(調査、メモ、設計案)
|
||||||
|
├── 2025-08-25-cranelift-research.md
|
||||||
|
└── archived/
|
||||||
|
```
|
||||||
|
|
||||||
|
#### 📝 改善候補ファイルの形式
|
||||||
|
```markdown
|
||||||
|
# VM and/or 短絡評価の実装
|
||||||
|
Status: Pending (80%実装済み)
|
||||||
|
Created: 2025-08-25
|
||||||
|
Priority: Low
|
||||||
|
Related-Code: src/backend/vm_instructions.rs::execute_binop()
|
||||||
|
|
||||||
|
## 現状(80%実装)
|
||||||
|
- `as_bool()`で全オペランドを評価してから論理演算
|
||||||
|
- 基本動作は完全に正常
|
||||||
|
|
||||||
|
## 改善案(残り20%)
|
||||||
|
### 1. 短絡評価
|
||||||
|
- And: 左辺false → 右辺評価スキップ
|
||||||
|
- Or: 左辺true → 右辺評価スキップ
|
||||||
|
|
||||||
|
## 実装タイミング
|
||||||
|
- [ ] パフォーマンス問題が報告されたら
|
||||||
|
- [ ] Phase 10(最適化フェーズ)で一括対応
|
||||||
|
```
|
||||||
|
|
||||||
### 🧪 テスト実行
|
### 🧪 テスト実行
|
||||||
|
|
||||||
#### 📁 **テストファイル配置ルール(重要!)**
|
#### 📁 **テストファイル配置ルール(重要!)**
|
||||||
@ -680,11 +733,7 @@ let new_plugin_box = PluginBoxV2 {
|
|||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
最終更新: 2025年8月20日 - **📝 プラグインBox開発の注意点追加**
|
最終更新: 2025年8月25日 - **🏃 80/20ルールとideas/フォルダ構造追加**
|
||||||
- **TLV Handle処理**: type_idとfini_method_idの正しい扱い方を追記
|
- **80/20ルール**: 完璧より進捗を優先する開発方針を明記
|
||||||
- **Phase 9.75g-0完了**: BID-FFI Step 1-3実装成功(プラグイン・テスター・設定)
|
- **ideas/フォルダ**: 改善案・新機能・その他アイデアの管理構造を追加
|
||||||
- **plugin-tester**: 汎用プラグイン診断ツール完成(CLAUDE.mdに追加)
|
- **ドキュメント整理**: 重複セクションを統合してスリム化
|
||||||
- **設計原則達成**: Box名非決め打ち・birth/finiライフサイクル・メモリ管理明確化
|
|
||||||
- **次のステップ**: Step 4 - Nyashとの統合(src/bid/モジュール実装)
|
|
||||||
- **copilot_issues.txt**: Phase順開発計画の軸として継続
|
|
||||||
- **次期最優先**: AST→MIR Lowering完全実装(Phase 8.4)
|
|
||||||
|
|||||||
20
docs/development/current/CLI_TESTING_GUIDE.md
Normal file
20
docs/development/current/CLI_TESTING_GUIDE.md
Normal file
@ -0,0 +1,20 @@
|
|||||||
|
## CLI分離テスト導線(軽量版)
|
||||||
|
|
||||||
|
目的: CLI変更に引きずられずにコアのMIR/VMを検証できる導線を用意する(構成は今は変えない)。
|
||||||
|
|
||||||
|
### 推奨手順
|
||||||
|
- コアのビルドとゴールデン照合のみで回す:
|
||||||
|
- `cargo build --release -j32`
|
||||||
|
- `./tools/ci_check_golden.sh`
|
||||||
|
- 代表E2E(プラグイン前提)のみ任意:
|
||||||
|
- `cargo test --features plugins -q -- --nocapture`
|
||||||
|
|
||||||
|
### ヘルパースクリプト
|
||||||
|
- `tools/core_ci.sh`: コアのビルド+ゴールデン照合を一括実行(CI/ローカル共用)
|
||||||
|
|
||||||
|
### 将来の分割方針(メモ)
|
||||||
|
- Cargo workspace化 or lib/binary分割で `cargo test -p core` を走らせる。
|
||||||
|
- runner(CLIフラグ/バックエンド選択)変更の影響をコア側に伝播させない。
|
||||||
|
|
||||||
|
最終更新: 2025-08-25
|
||||||
|
|
||||||
@ -75,7 +75,7 @@ tools/ci_check_golden.sh # 代表ケースのMIR含有チェック
|
|||||||
- 修正後、`local_tests/and_or_vm.nyash` で `false/true` の出力を確認。
|
- 修正後、`local_tests/and_or_vm.nyash` で `false/true` の出力を確認。
|
||||||
2. **MIR26命令対応**
|
2. **MIR26命令対応**
|
||||||
- TypeOp/WeakRef/Barrierのプリンタ拡張
|
- TypeOp/WeakRef/Barrierのプリンタ拡張
|
||||||
- スナップショット整備
|
- スナップショット整備(extern_call/loop/boxcall/typeop_mixed 追加済)
|
||||||
- vm-stats差分確認
|
- vm-stats差分確認
|
||||||
|
|
||||||
3. **Builder適用拡大**
|
3. **Builder適用拡大**
|
||||||
@ -365,3 +365,9 @@ tools/run_vm_stats.sh local_tests/vm_stats_http_err.nyash vm_stats_err.json
|
|||||||
# 7) VM BoxCall デバッグ(任意)
|
# 7) VM BoxCall デバッグ(任意)
|
||||||
NYASH_VM_DEBUG_BOXCALL=1 ./target/release/nyash --backend vm local_tests/test_vm_array_getset.nyash
|
NYASH_VM_DEBUG_BOXCALL=1 ./target/release/nyash --backend vm local_tests/test_vm_array_getset.nyash
|
||||||
```
|
```
|
||||||
|
- MIR26 整合(候補1)確認:
|
||||||
|
- Printer: `--mir-verbose-effects` の `pure|readonly|side` 表記と TypeOp/WeakRef/Barrier/ExternCall の表示が整合。
|
||||||
|
- Verifier: SSA/支配/CFG/merge-phi に加え WeakRef/Barrier の最小検証+Strict Barrier診断を実装(環境変数でON)。
|
||||||
|
- Optimizer: 未lowering検知(is/as/isType/asType)をBoxCall/Call両経路で検出、`NYASH_OPT_DIAG_FAIL=1` と連携。
|
||||||
|
- 代表スナップショット: extern_call/loop/boxcall/typeop_mixed をCIに追加、全件緑。
|
||||||
|
- 注: WeakRef/Barrier の“統合”はPoCフラグで切替可能(レガシー命令も支援)—MIR26はドキュメントの正典、実装は互換を維持。
|
||||||
|
|||||||
3
docs/status/golden/await_simple.mir.txt
Normal file
3
docs/status/golden/await_simple.mir.txt
Normal file
@ -0,0 +1,3 @@
|
|||||||
|
🔌 v2 plugin system initialized from nyash.toml
|
||||||
|
✅ v2 plugin system fully configured
|
||||||
|
🚀 Nyash MIR Compiler - Processing file: local_tests/await_simple.nyash 🚀
|
||||||
80
ideas/README.md
Normal file
80
ideas/README.md
Normal file
@ -0,0 +1,80 @@
|
|||||||
|
# 📁 Ideas フォルダ - 80/20ルールの「残り20%」管理
|
||||||
|
|
||||||
|
このフォルダは、80/20ルールに基づいて「まず動くものを作る」方針で開発した後の、
|
||||||
|
残り20%の改善案や新機能アイデアを整理して管理する場所です。
|
||||||
|
|
||||||
|
## 📂 フォルダ構造
|
||||||
|
|
||||||
|
```
|
||||||
|
ideas/
|
||||||
|
├── improvements/ # 80%実装の残り20%改善候補
|
||||||
|
│ ├── *.md # 各改善案
|
||||||
|
│ └── archived/ # 実装済みor却下
|
||||||
|
│
|
||||||
|
├── new-features/ # 新機能アイデア
|
||||||
|
│ ├── *.md # 各新機能案
|
||||||
|
│ └── archived/ # 実装済みor却下
|
||||||
|
│
|
||||||
|
└── other/ # その他すべて
|
||||||
|
├── *.md # 調査、メモ、設計案など
|
||||||
|
└── archived/ # 完了済み
|
||||||
|
```
|
||||||
|
|
||||||
|
## 📝 ファイル形式
|
||||||
|
|
||||||
|
### improvements/ 用テンプレート
|
||||||
|
```markdown
|
||||||
|
# [機能名] の改善
|
||||||
|
Status: Pending (80%実装済み)
|
||||||
|
Created: YYYY-MM-DD
|
||||||
|
Priority: High/Medium/Low
|
||||||
|
Related-Code: src/path/to/file.rs::function_name()
|
||||||
|
|
||||||
|
## 現状(80%実装)
|
||||||
|
- 現在の実装内容
|
||||||
|
- 動作状況
|
||||||
|
|
||||||
|
## 改善案(残り20%)
|
||||||
|
### 1. 改善項目1
|
||||||
|
- 詳細
|
||||||
|
- 効果
|
||||||
|
|
||||||
|
### 2. 改善項目2
|
||||||
|
- 詳細
|
||||||
|
- 効果
|
||||||
|
|
||||||
|
## 実装タイミング
|
||||||
|
- [ ] 条件1が満たされたら
|
||||||
|
- [ ] 条件2が発生したら
|
||||||
|
- [ ] Phase Xで一括対応
|
||||||
|
```
|
||||||
|
|
||||||
|
## 🏷️ ファイル命名規則
|
||||||
|
|
||||||
|
`YYYY-MM-DD-feature-name.md`
|
||||||
|
|
||||||
|
例:
|
||||||
|
- `2025-08-25-vm-andor-shortcircuit.md`
|
||||||
|
- `2025-08-26-mir-builder-cleanup.md`
|
||||||
|
|
||||||
|
## 📊 優先度
|
||||||
|
|
||||||
|
- **High**: ユーザーから要望があった、または性能に大きく影響
|
||||||
|
- **Medium**: 改善すると良いが、現状でも問題ない
|
||||||
|
- **Low**: Nice to have、時間があれば
|
||||||
|
|
||||||
|
## 🔄 ワークフロー
|
||||||
|
|
||||||
|
1. アイデアが生まれる → 適切なフォルダに`.md`作成
|
||||||
|
2. 実装タイミングが来る → 実装
|
||||||
|
3. 実装完了 → `archived/`へ移動(削除せず記録として残す)
|
||||||
|
|
||||||
|
## 💡 なぜこの管理方法?
|
||||||
|
|
||||||
|
- **80/20ルール遵守**: 完璧主義を防ぎ、進捗を優先
|
||||||
|
- **アイデアの可視化**: 良いアイデアを忘れない
|
||||||
|
- **優先順位明確化**: 本当に必要な20%だけを後で実装
|
||||||
|
- **変化への対応**: 要件変更時も80%実装なら修正が楽
|
||||||
|
|
||||||
|
---
|
||||||
|
Created: 2025-08-25
|
||||||
52
ideas/improvements/2025-08-25-vm-andor-shortcircuit.md
Normal file
52
ideas/improvements/2025-08-25-vm-andor-shortcircuit.md
Normal file
@ -0,0 +1,52 @@
|
|||||||
|
# VM and/or 短絡評価の実装
|
||||||
|
Status: Pending (80%実装済み)
|
||||||
|
Created: 2025-08-25
|
||||||
|
Priority: Low
|
||||||
|
Related-Code: src/backend/vm_instructions.rs::execute_binop()
|
||||||
|
|
||||||
|
## 現状(80%実装)
|
||||||
|
- `as_bool()`で両オペランドを評価してから論理演算を実行
|
||||||
|
- 基本動作は完全に正常、テストもすべて通過
|
||||||
|
- コード:
|
||||||
|
```rust
|
||||||
|
BinOp::And => {
|
||||||
|
let left_bool = left_val.as_bool();
|
||||||
|
let right_bool = right_val.as_bool();
|
||||||
|
Ok(self.allocate_value(VMValue::Bool(left_bool && right_bool)))
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
## 改善案(残り20%)
|
||||||
|
### 1. 短絡評価の実装
|
||||||
|
- `And`: 左辺がfalseなら右辺の評価をスキップ
|
||||||
|
- `Or`: 左辺がtrueなら右辺の評価をスキップ
|
||||||
|
- 効果: 不要な計算の削減、副作用のある式での正しい動作
|
||||||
|
|
||||||
|
### 2. 実装スケッチ
|
||||||
|
```rust
|
||||||
|
BinOp::And => {
|
||||||
|
let left_val = self.get_value(left)?;
|
||||||
|
if !left_val.as_bool() {
|
||||||
|
// 左辺がfalseなら即座にfalseを返す
|
||||||
|
return Ok(self.allocate_value(VMValue::Bool(false)));
|
||||||
|
}
|
||||||
|
// 左辺がtrueの場合のみ右辺を評価
|
||||||
|
let right_val = self.get_value(right)?;
|
||||||
|
Ok(self.allocate_value(VMValue::Bool(right_val.as_bool())))
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
### 3. 考慮事項
|
||||||
|
- MIRレベルでの最適化との整合性
|
||||||
|
- デバッグ時のステップ実行への影響
|
||||||
|
- パフォーマンステストの必要性
|
||||||
|
|
||||||
|
## 実装タイミング
|
||||||
|
- [ ] パフォーマンス問題が報告されたら
|
||||||
|
- [ ] 副作用のある式(関数呼び出し等)で問題が発生したら
|
||||||
|
- [ ] Phase 10(最適化フェーズ)で一括対応
|
||||||
|
|
||||||
|
## メモ
|
||||||
|
- 現在の実装でも機能的には問題ない
|
||||||
|
- Pythonも初期は短絡評価なしだった(後から追加)
|
||||||
|
- まずは動くことを優先する80/20ルールの良い例
|
||||||
56
ideas/new-features/2025-08-25-repl-mode.md
Normal file
56
ideas/new-features/2025-08-25-repl-mode.md
Normal file
@ -0,0 +1,56 @@
|
|||||||
|
# REPL (Read-Eval-Print Loop) モード
|
||||||
|
Status: Idea
|
||||||
|
Created: 2025-08-25
|
||||||
|
Priority: Medium
|
||||||
|
Related: CLI機能拡張
|
||||||
|
|
||||||
|
## 概要
|
||||||
|
Nyashの対話的実行環境。Pythonのような即座にコードを試せる環境を提供。
|
||||||
|
|
||||||
|
## 想定される使用例
|
||||||
|
```bash
|
||||||
|
$ nyash --repl
|
||||||
|
Nyash REPL v1.0.0
|
||||||
|
>>> local x = 42
|
||||||
|
>>> print(x + 8)
|
||||||
|
50
|
||||||
|
>>> box Point { init { x, y } }
|
||||||
|
>>> local p = new Point()
|
||||||
|
>>> p.x = 10
|
||||||
|
>>> p.y = 20
|
||||||
|
>>> print(p)
|
||||||
|
Point { x: 10, y: 20 }
|
||||||
|
>>> exit()
|
||||||
|
```
|
||||||
|
|
||||||
|
## 実装案
|
||||||
|
### Phase 1: 基本REPL
|
||||||
|
- 単一行の評価と実行
|
||||||
|
- 変数の永続化
|
||||||
|
- 基本的なエラーハンドリング
|
||||||
|
|
||||||
|
### Phase 2: 高度な機能
|
||||||
|
- 複数行入力(継続行)のサポート
|
||||||
|
- ヒストリー機能(上下キーで履歴)
|
||||||
|
- タブ補完(変数名、メソッド名)
|
||||||
|
- `.help`、`.clear`などのメタコマンド
|
||||||
|
|
||||||
|
### Phase 3: デバッグ統合
|
||||||
|
- ブレークポイント設定
|
||||||
|
- 変数の詳細表示
|
||||||
|
- メモリ使用状況の確認
|
||||||
|
|
||||||
|
## 技術的考慮事項
|
||||||
|
- 現在のインタープリター構造との統合
|
||||||
|
- 状態管理(グローバルスコープの扱い)
|
||||||
|
- rustyline等のREPLライブラリの活用
|
||||||
|
|
||||||
|
## 実装タイミング
|
||||||
|
- [ ] 基本的な開発ツールが整った後
|
||||||
|
- [ ] ユーザーからの要望が多い場合
|
||||||
|
- [ ] 教育用途での需要が高まった場合
|
||||||
|
|
||||||
|
## 参考
|
||||||
|
- Python REPL
|
||||||
|
- Node.js REPL
|
||||||
|
- Rust playground(Web版も検討)
|
||||||
77
ideas/other/2025-08-25-cranelift-research.md
Normal file
77
ideas/other/2025-08-25-cranelift-research.md
Normal file
@ -0,0 +1,77 @@
|
|||||||
|
# Cranelift JIT 調査メモ
|
||||||
|
Status: Research
|
||||||
|
Created: 2025-08-25
|
||||||
|
Priority: High (Phase 10関連)
|
||||||
|
Related: Phase 10 - Cranelift JIT実装
|
||||||
|
|
||||||
|
## 調査内容
|
||||||
|
|
||||||
|
### Craneliftとは
|
||||||
|
- Wasmtime/Firefoxで使用されているコード生成器
|
||||||
|
- LLVMより軽量で高速なコンパイル
|
||||||
|
- Rustで書かれており、Nyashとの統合が容易
|
||||||
|
|
||||||
|
### 基本的な使用方法
|
||||||
|
```rust
|
||||||
|
use cranelift::prelude::*;
|
||||||
|
use cranelift_module::{Module, Linkage};
|
||||||
|
|
||||||
|
// 関数シグネチャ定義
|
||||||
|
let mut sig = module.make_signature();
|
||||||
|
sig.params.push(AbiParam::new(types::I64));
|
||||||
|
sig.returns.push(AbiParam::new(types::I64));
|
||||||
|
|
||||||
|
// 関数生成
|
||||||
|
let func_id = module.declare_function("add_one", Linkage::Export, &sig)?;
|
||||||
|
```
|
||||||
|
|
||||||
|
### MIR → Cranelift IR変換の検討
|
||||||
|
- MIR命令とCranelift命令の対応関係
|
||||||
|
- Box型の表現方法(ポインタ vs 値)
|
||||||
|
- GCとの統合方法
|
||||||
|
|
||||||
|
### パフォーマンス予測
|
||||||
|
- コンパイル時間: LLVM比 10x高速
|
||||||
|
- 実行速度: インタープリター比 10-100x高速
|
||||||
|
- メモリ使用量: 中程度
|
||||||
|
|
||||||
|
## 実装スケッチ
|
||||||
|
```rust
|
||||||
|
// MIR → Cranelift変換器
|
||||||
|
struct MirToCranelift {
|
||||||
|
builder: FunctionBuilder<'static>,
|
||||||
|
module: Module<SimpleJITBackend>,
|
||||||
|
}
|
||||||
|
|
||||||
|
impl MirToCranelift {
|
||||||
|
fn translate_instruction(&mut self, inst: &MirInstruction) {
|
||||||
|
match inst {
|
||||||
|
MirInstruction::Const { dst, value } => {
|
||||||
|
// Cranelift IRへの変換
|
||||||
|
}
|
||||||
|
// ...
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
## 課題と検討事項
|
||||||
|
1. **Box型の扱い**: ヒープ割り当てとGCの統合
|
||||||
|
2. **動的ディスパッチ**: BoxCallの効率的な実装
|
||||||
|
3. **例外処理**: Nyashのエラーハンドリングとの統合
|
||||||
|
4. **デバッグ情報**: ソース位置の保持
|
||||||
|
|
||||||
|
## 次のステップ
|
||||||
|
- [ ] 最小限のPoC実装(整数演算のみ)
|
||||||
|
- [ ] ベンチマーク環境の構築
|
||||||
|
- [ ] VM実装との性能比較
|
||||||
|
|
||||||
|
## 参考資料
|
||||||
|
- [Cranelift公式ドキュメント](https://github.com/bytecodealliance/wasmtime/tree/main/cranelift)
|
||||||
|
- [Cranelift IR Reference](https://github.com/bytecodealliance/wasmtime/blob/main/cranelift/docs/ir.md)
|
||||||
|
- wasmtimeのJIT実装
|
||||||
|
|
||||||
|
## メモ
|
||||||
|
- Phase 10での実装が決定
|
||||||
|
- まずはホットパスの特定から
|
||||||
|
- 段階的な移行が重要(全部一度には無理)
|
||||||
@ -203,9 +203,9 @@ pub struct VM {
|
|||||||
/// Active MIR module during execution (for function calls)
|
/// Active MIR module during execution (for function calls)
|
||||||
module: Option<MirModule>,
|
module: Option<MirModule>,
|
||||||
/// Instruction execution counters (by MIR opcode)
|
/// Instruction execution counters (by MIR opcode)
|
||||||
instr_counter: std::collections::HashMap<&'static str, usize>,
|
pub(super) instr_counter: std::collections::HashMap<&'static str, usize>,
|
||||||
/// Execution start time for optional stats
|
/// Execution start time for optional stats
|
||||||
exec_start: Option<Instant>,
|
pub(super) exec_start: Option<Instant>,
|
||||||
// Phase 9.78a: Add unified Box handling components
|
// Phase 9.78a: Add unified Box handling components
|
||||||
// TODO: Re-enable when interpreter refactoring is complete
|
// TODO: Re-enable when interpreter refactoring is complete
|
||||||
// /// Box registry for creating all Box types
|
// /// Box registry for creating all Box types
|
||||||
|
|||||||
@ -729,6 +729,7 @@ pub struct ResultBox {
|
|||||||
base: BoxBase,
|
base: BoxBase,
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[allow(deprecated)]
|
||||||
impl ResultBox {
|
impl ResultBox {
|
||||||
pub fn new_success(value: Box<dyn NyashBox>) -> Self {
|
pub fn new_success(value: Box<dyn NyashBox>) -> Self {
|
||||||
Self {
|
Self {
|
||||||
@ -772,6 +773,7 @@ impl ResultBox {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[allow(deprecated)]
|
||||||
impl BoxCore for ResultBox {
|
impl BoxCore for ResultBox {
|
||||||
fn box_id(&self) -> u64 {
|
fn box_id(&self) -> u64 {
|
||||||
self.base.id
|
self.base.id
|
||||||
@ -794,6 +796,7 @@ impl BoxCore for ResultBox {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[allow(deprecated)]
|
||||||
impl NyashBox for ResultBox {
|
impl NyashBox for ResultBox {
|
||||||
fn to_string_box(&self) -> StringBox {
|
fn to_string_box(&self) -> StringBox {
|
||||||
if self.is_success {
|
if self.is_success {
|
||||||
@ -863,6 +866,7 @@ impl NyashBox for ResultBox {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[allow(deprecated)]
|
||||||
impl Display for ResultBox {
|
impl Display for ResultBox {
|
||||||
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
|
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
|
||||||
self.fmt_box(f)
|
self.fmt_box(f)
|
||||||
|
|||||||
@ -82,11 +82,14 @@ impl<'a> LoopBuilder<'a> {
|
|||||||
// 7. ループボディの構築
|
// 7. ループボディの構築
|
||||||
self.set_current_block(body_id)?;
|
self.set_current_block(body_id)?;
|
||||||
self.emit_safepoint()?;
|
self.emit_safepoint()?;
|
||||||
|
|
||||||
// ボディをビルド
|
// ボディをビルド
|
||||||
for stmt in body {
|
for stmt in body {
|
||||||
self.build_statement(stmt)?;
|
self.build_statement(stmt)?;
|
||||||
}
|
}
|
||||||
|
// latchブロックのスナップショットを保存(phi入力解決用)
|
||||||
|
let latch_snapshot = self.get_current_variable_map();
|
||||||
|
self.block_var_maps.insert(body_id, latch_snapshot);
|
||||||
|
|
||||||
// 8. Latchブロック(ボディの最後)からHeaderへ戻る
|
// 8. Latchブロック(ボディの最後)からHeaderへ戻る
|
||||||
let latch_id = self.current_block()?;
|
let latch_id = self.current_block()?;
|
||||||
@ -114,6 +117,8 @@ impl<'a> LoopBuilder<'a> {
|
|||||||
) -> Result<(), String> {
|
) -> Result<(), String> {
|
||||||
// 現在の変数マップから、ループで使用される可能性のある変数を取得
|
// 現在の変数マップから、ループで使用される可能性のある変数を取得
|
||||||
let current_vars = self.get_current_variable_map();
|
let current_vars = self.get_current_variable_map();
|
||||||
|
// preheader時点のスナップショット(後でphi入力の解析に使う)
|
||||||
|
self.block_var_maps.insert(preheader_id, current_vars.clone());
|
||||||
|
|
||||||
// 各変数に対して不完全なPhi nodeを作成
|
// 各変数に対して不完全なPhi nodeを作成
|
||||||
let mut incomplete_phis = Vec::new();
|
let mut incomplete_phis = Vec::new();
|
||||||
@ -271,9 +276,12 @@ impl<'a> LoopBuilder<'a> {
|
|||||||
self.parent_builder.variable_map.insert(name, value);
|
self.parent_builder.variable_map.insert(name, value);
|
||||||
}
|
}
|
||||||
|
|
||||||
fn get_variable_at_block(&self, name: &str, _block_id: BasicBlockId) -> Option<ValueId> {
|
fn get_variable_at_block(&self, name: &str, block_id: BasicBlockId) -> Option<ValueId> {
|
||||||
// 簡易実装:現在の変数マップから取得
|
// まずブロックごとのスナップショットを優先
|
||||||
// TODO: 本来はブロックごとの変数マップを管理すべき
|
if let Some(map) = self.block_var_maps.get(&block_id) {
|
||||||
|
if let Some(v) = map.get(name) { return Some(*v); }
|
||||||
|
}
|
||||||
|
// フォールバック:現在の変数マップ(単純ケース用)
|
||||||
self.parent_builder.variable_map.get(name).copied()
|
self.parent_builder.variable_map.get(name).copied()
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -285,4 +293,4 @@ impl<'a> LoopBuilder<'a> {
|
|||||||
fn build_statement(&mut self, stmt: ASTNode) -> Result<ValueId, String> {
|
fn build_statement(&mut self, stmt: ASTNode) -> Result<ValueId, String> {
|
||||||
self.parent_builder.build_expression(stmt)
|
self.parent_builder.build_expression(stmt)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@ -589,6 +589,9 @@ impl std::fmt::Display for VerificationError {
|
|||||||
VerificationError::InvalidBarrierPointer { ptr, block, instruction_index, reason } => {
|
VerificationError::InvalidBarrierPointer { ptr, block, instruction_index, reason } => {
|
||||||
write!(f, "Invalid Barrier pointer {} in block {} at {}: {}", ptr, block, instruction_index, reason)
|
write!(f, "Invalid Barrier pointer {} in block {} at {}: {}", ptr, block, instruction_index, reason)
|
||||||
},
|
},
|
||||||
|
VerificationError::SuspiciousBarrierContext { block, instruction_index, note } => {
|
||||||
|
write!(f, "Suspicious Barrier context in block {} at {}: {}", block, instruction_index, note)
|
||||||
|
},
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
14
tools/core_ci.sh
Normal file
14
tools/core_ci.sh
Normal file
@ -0,0 +1,14 @@
|
|||||||
|
#!/usr/bin/env bash
|
||||||
|
set -euo pipefail
|
||||||
|
|
||||||
|
ROOT_DIR="$(cd "$(dirname "$0")/.." && pwd)"
|
||||||
|
cd "$ROOT_DIR"
|
||||||
|
|
||||||
|
echo "[core-ci] Build (release)"
|
||||||
|
cargo build --release -j32
|
||||||
|
|
||||||
|
echo "[core-ci] Golden snapshots"
|
||||||
|
./tools/ci_check_golden.sh
|
||||||
|
|
||||||
|
echo "[core-ci] Done (core build + golden checks)"
|
||||||
|
|
||||||
Reference in New Issue
Block a user