feat: Phase 10 reorganization + GC switchable runtime + VM improvements

## 📚 Documentation Updates
- Phase 10 reorganized with comprehensive README
  - Cranelift JIT as main implementation
  - NEW: Phase 10.4 GC Switchable Runtime (world's first\!)
  - Phase 10.5 Self-hosting (parallel)
  - Application migration tests
- Phase 11 created for LLVM AOT research (deferred)
  - Moved phase10_aot_scaffolding.md → Phase 11
  - Moved phase_10_x_llvm_backend_skeleton.md → Phase 11
- Master roadmap updated with GC runtime feature
- Ideas: GC switchable language concept documented

## 🚀 VM Implementation Progress (by ChatGPT5)
- src/backend/vm.rs: Enhanced VM execution
- src/backend/vm_instructions.rs: Instruction improvements
- src/runtime/type_meta.rs: NEW - Type metadata system
- src/boxes/buffer/mod.rs: Buffer optimizations
- src/runtime/mod.rs & plugin_ffi_common.rs: Runtime enhancements

## 🌟 Revolutionary Feature: GC Switchable Runtime
- Development mode: GC on (convenience)
- Production mode: GC off (performance)
- Technical feasibility confirmed by Codex GPT-5
- Implementation plan: After Cranelift JIT

## 📋 Phase 10 Structure
Phase 10.0: Cranelift JIT foundation
Phase 10.1-10.3: JIT implementation & optimization
Phase 10.4: GC Switchable Runtime ← NEW\!
Phase 10.5: Self-hosting (String/Array/Map in Nyash)
Phase 10.9: Application migration tests

🤖 ChatGPT5 says: Ready for Phase 10\! どきどきにゃ!
This commit is contained in:
Moe Charm
2025-08-27 01:03:55 +09:00
parent e5515ea5e9
commit 61800a37a7
14 changed files with 1052 additions and 21 deletions

View File

@ -111,6 +111,7 @@ nyash bid gen --target llvm bid.yaml # AOT用declare生成LLVM実装時
- MIR→VMを維持しつつ、ホットパスをCraneliftでJIT化
- 目標: VM比2倍以上の高速化
- LLVM AOTは設計資産は維持しつつ、Phase 11以降に検討
- **🌟 NEW: GC切り替え可能ランタイム世界初の柔軟なメモリ管理**
**Start Gate着手前の必須完了**:
- ✅ MIRダイエット26命令整合完了
@ -122,6 +123,8 @@ nyash bid gen --target llvm bid.yaml # AOT用declare生成LLVM実装時
1. **Phase 10.1**: Proof of Concept2週間
2. **Phase 10.2**: 基本実装4週間
3. **Phase 10.3**: 非同期の扱い(最小)
4. **Phase 10.4**: GC切り替え可能ランタイム2-3ヶ月
5. **Phase 10.5**: セルフホスティング(並行実装)
---

View File

@ -0,0 +1,61 @@
# Phase 10: JIT実装とセルフホスティング
## 🎯 Phase 10の全体像
Phase 10は、Nyashの実行性能を大幅に向上させるJIT実装と、言語の成熟度を示すセルフホスティングを実現します。
## 📊 実装優先順位
### 1⃣ **メイン実装: Cranelift JIT**
→ [phase_10_cranelift_jit_backend.md](phase_10_cranelift_jit_backend.md)
- VMとのハイブリッド実行ホットパス検出→JIT化
- 実装期間: 2-3ヶ月
- 目標: ホットパスで2倍以上の高速化
### 🌟 **革新的機能: GC切り替え可能ランタイム**
→ [phase_10_4_gc_switchable_runtime.md](phase_10_4_gc_switchable_runtime.md)
- 世界初実行時にGCモード切り替え可能
- 開発時はGCオンで快適、本番はGCオフで高速
- 実装期間: 2-3ヶ月Cranelift JIT後
- 技術的にCodex GPT-5が実現可能性を確認済み
### 2⃣ **並行プロジェクト: セルフホスティング**
→ [phase_10_5_core_std_nyash_impl.md](phase_10_5_core_std_nyash_impl.md)
- String/Array/MapをNyash自身で実装
- Rust依存の段階的削減
- 実装期間: 1-2ヶ月
### 3⃣ **実戦テスト: アプリケーション移植**
→ [phase_10_app_migration.md](phase_10_app_migration.md)
- Tinyproxy: ゼロコピー判定機能の検証
- Chip-8エミュレータ: fini伝播とweak参照の実戦テスト
- kiloエディタ: メモリ効率の「うっかり全体コピー」検出
### 🚫 **延期プロジェクト**
→ [Phase 11: LLVM AOT Backend](../phase-11/) - 将来の研究開発として分離
## 🛤️ 実装ロードマップ
```
Phase 9.79b (現在)
Phase 10.0: Cranelift JIT基盤構築
├→ Phase 10.1-10.3: JIT実装・最適化
├→ Phase 10.4: GC切り替え可能ランタイム ← NEW!
└→ Phase 10.5: セルフホスティング(並行)
Phase 10.9: アプリケーション移植で実戦検証
Phase 11: LLVM AOT研究将来
```
## 📈 期待される成果
1. **実行性能**: インタープリタ比100倍、VM比2-3倍の高速化
2. **言語成熟度**: 基本コンテナのセルフホスティング達成
3. **実用性検証**: 実アプリケーションの移植による実戦テスト
## 🔗 関連ドキュメント
- [00_MASTER_ROADMAP.md](../00_MASTER_ROADMAP.md) - 全体計画
- [Phase 9.79b](../phase-9/) - 統一Box設計前提
- [MIR仕様](../../../../reference/mir/) - 中間表現

View File

@ -0,0 +1,173 @@
# Phase 10.4: GC Switchable Runtime - 世界初の柔軟なメモリ管理
Status: Planned
Owner: core-runtime
Target: After Cranelift JIT (Phase 10.0)
Last Updated: 2025-08-26
Dependencies: Phase 10.0 (Cranelift JIT), Phase 9.79b (Unified Box)
## 🎯 概要
Nyashを**世界初のGC切り替え可能プログラミング言語**にする革新的機能。開発時はGCで快適に、本番ではGCなしで最高性能を実現。
## 📊 技術的背景
### 現状のメモリ管理
- Everything is Box哲学すべてのデータがBoxオブジェクト
- 明示的メモリ管理スコープベースfini
- Arc<Mutex>によるスレッドセーフ設計
### 提案する2つのモード
1. **Explicit Mode現在のデフォルト**
- スコープを抜けたら即座にfini()呼び出し
- 予測可能な性能(リアルタイムアプリ向け)
- メモリ使用量が最小
2. **Reference Counting Mode新規**
- 参照カウントが0になったらfini()呼び出し
- 循環参照はweak参照で解決
- 開発効率重視(一般アプリ向け)
## 🏗️ アーキテクチャ設計
### MIR層所有権イベントの抽象化
```rust
// GCモードに依存しない所有権表現
enum MirOwnership {
Move(temp_id), // 所有権移動
Copy(temp_id), // 複製
Drop(temp_id), // 破棄
StorageLive(id), // 生存開始
StorageDead(id), // 生存終了
Escape(target), // エスケープ解析
}
```
### ランタイム層:モード別実装
```rust
// 統一APIでモード切り替え
trait MemoryManager {
fn retain_ref(&self, ptr: *const BoxHeader);
fn release_ref(&self, ptr: *const BoxHeader);
fn destroy(&self, ptr: *const BoxHeader);
}
struct ExplicitManager; // 即座に破棄
struct RefCountManager; // 参照カウント管理
```
### JIT層関数マルチバージョン化
```
関数テーブル:
┌─────────────┬──────────────┬──────────────┐
│ Function │ Explicit Ver │ RefCount Ver │
├─────────────┼──────────────┼──────────────┤
│ array_push │ 0x1000_0000 │ 0x2000_0000 │
│ map_get │ 0x1000_1000 │ 0x2000_1000 │
└─────────────┴──────────────┴──────────────┘
トランポリン → 現在のモードに応じてジャンプ
```
## 📋 実装計画
### Phase 10.4.1: 基盤構築2週間
- [ ] BoxHeaderに参照カウントフィールド追加
- [ ] MemoryManagerトレイト定義
- [ ] インタープリターでの基本実装
### Phase 10.4.2: MIR対応1ヶ月
- [ ] 所有権イベントMove/Copy/Drop等の導入
- [ ] retain_ref/release_ref命令の追加
- [ ] エスケープ解析の基礎実装
### Phase 10.4.3: 最適化3週間
- [ ] 近接ペア消去retain直後のrelease削除
- [ ] ループ不変式の移動
- [ ] φノードでの差分管理
### Phase 10.4.4: JIT統合1ヶ月
- [ ] 関数マルチバージョン生成
- [ ] トランポリン機構実装
- [ ] fast path/slow path分離
### Phase 10.4.5: 実戦投入2週間
- [ ] モード切り替えCLI実装
- [ ] メモリリーク検出ツール
- [ ] ベンチマーク・性能評価
## 🎯 使用例
### 開発フロー
```bash
# 1. 開発中GCオンで快適に開発
nyash --gc-mode=ref-counting --detect-leaks dev.nyash
# 2. テスト:メモリリークがないことを確認
nyash --gc-mode=ref-counting --memory-report test.nyash
# => No memory leaks detected!
# 3. 本番GCオフで最高性能
nyash --gc-mode=explicit --optimize prod.nyash
```
### コード例
```nyash
// 同じコードが両モードで動作
box DataProcessor {
init { buffer, cache }
process(data) {
me.buffer = data.transform() // GCありなら参照カウント管理
me.cache.put(data.id, data) // GCなしなら即座に古い値を破棄
return me.buffer
}
fini() {
print("Cleanup!") // タイミングはモード次第
}
}
```
## ⚠️ 技術的課題と解決策
### 1. Arc<Mutex>の重さ
**課題**: 現在すべてのBoxがArc<Mutex>で重い
**解決**: 必要な場所のみ同期、基本型は非同期に
### 2. 実行時オーバーヘッド
**課題**: モードチェックのコスト
**解決**: JITでの関数マルチバージョン化間接ジャンプ1回のみ
### 3. 循環参照
**課題**: RefCountingモードでの循環参照
**解決**: 既存のWeakBox活用明示的切断
### 4. セマンティクスの違い
**課題**: デストラクタ呼び出しタイミングの差
**解決**: ドキュメント化+移行ガイド作成
## 📊 期待される効果
1. **開発効率**: 30%向上(メモリ管理の負担軽減)
2. **実行性能**: GCオフ時は現状維持、GCオン時は5-10%低下
3. **メモリ効率**: モード次第で最適化可能
4. **教育価値**: メモリ管理の学習に最適なツール
## 🔗 関連ドキュメント
- [Phase 10.0: Cranelift JIT](phase_10_cranelift_jit_backend.md)
- [Phase 9.79b: Unified Box Design](../phase-9/phase_9_79b_1_unified_registry_ids_and_builder_slotting.md)
- [GC Switchable Language Idea](../../../ideas/other/2025-08-26-gc-switchable-language.md)
## ✅ 受け入れ基準
- [ ] インタープリター/VM/JITすべてで両モード動作
- [ ] モード切り替えが実行時に可能(再コンパイル不要)
- [ ] 既存コードが無修正で動作(後方互換性)
- [ ] パフォーマンス劣化が許容範囲GCオン時10%以内)
- [ ] メモリリーク検出ツールの提供
## 🚀 将来の拡張
- Mark & Sweep GCモードの追加
- 世代別GC
- リージョンベースメモリ管理
- プロファイルベース自動モード選択

View File

@ -60,3 +60,93 @@ AST → MIR → Optimizer → VM Dispatcher
---
備考: LLVM AOTはPhase 11以降の研究路線に移行設計ドキュメントは維持
## 🔬 Sub-Phases (10_a .. 10_h)
各サブフェーズは「小さく立ち上げ→検証→次へ」。既存のVM/Thunk/PICを活用し、JITは同じ経路に自然合流させる。
### 10_a: JITブートストラップ基盤プロファイラ
- 目的: Cranelift JITの骨組みとホット関数検出の導線を用意。
- 具体:
- `JitManager`(関数プロファイル、しきい値、キャッシュ)
- CLIF環境初期化`Module`, `Context`, `ISA`
- VM統合: 関数入口でホット度チェック→JITコンパイル/呼び出し
- 診断: `NYASH_JIT_STATS=1`JIT件数/時間/キャッシュヒット)
- 受入: ダミー関数をJIT登録してVMから呼出可能、ログが出る
### 10_b: Lower(Core-1) Const/Move/BinOp/Cmp/Branch/Ret
- 目的: ループや条件分岐を含む純粋関数をJIT実行可能に。
- 具体:
- MIR値/型→CLIF型i64/f64/i1/void
- Const/Copy/算術/比較/ジャンプ/分岐/return のLower
- フレームレイアウトVMValue最小表現
- 受入: 算術/比較/分岐のみの関数がJITでVMより速い小ベンチ
### 10_c: ABI/呼出し 関数呼び出しとフォールバック
- 目的: JIT化関数から他関数を呼ぶ/VMへ戻る道を用意。
- 具体:
- 同一モジュール関数呼び出しJIT→JITJIT→VM
- 引数/戻り値の受け渡し(整数/浮動/void
- 例外/TypeErrorはVMへバイアウトtrap→VM
- 受入: 再帰/多段呼び出しが安定動作
### 10_d: コレクション基礎 Array/Map ホット操作(外部呼び出し)
- 目的: 実用的ホットパスlength/get/set/push/popをJIT側から呼べるように。
- 具体:
- ホスト関数テーブル外部シンボルで既存Rust実装を呼ぶ
- 境界チェック/エラーはRust側に委譲、JITは薄い橋渡し
- 受入: Array操作がVM経由より高速目安1.52.0×
### 10_e: BoxCall高速化 Thunk/PICの直結
- 目的: Phase 9.79bの `TypeMeta{slot->thunk}` と Poly-PIC をJITにインライン。
- 具体:
- `slot -> thunk -> target` 解決をJITで再現ユニバーサル0..3含む)
- `(type_id, version)` チェックPoly-PIC 24件→ヒット直呼び、ミスVM
- バージョンミスマッチで安全にフォールバック
- 受入: BoxCallホットサイトで2×以上の高速化正しい無効化挙動
### 10_f: TypeOp/Ref/Weak/Barrier最小
- 目的: 実アプリで必要な最小限のタイプ/参照操作を埋める。
- 具体:
- `as_bool()` 等の基本型変換
- 参照/弱参照/バリアの最小パス重い経路はVMへ
- 受入: 代表的コードパスでJIT有効のままE2E成功
### 10_g: 診断/ベンチ/回帰
- 目的: 可視化と安定化。
- 具体:
- `--vm-stats` にJIT統計統合compile/ms, sites, cache率
- ベンチ更新JIT有/無比較)とスナップショット
- 受入: CIで回帰検知可能ドキュメント更新
### 10_h: 硬化・パフォーマンス調整
- 目的: ホットスポットの最適化とノイズ除去。
- 具体:
- ガード配置最適化(分岐予測/ICヒット優先
- 不要コピー削減、ホスト呼出回数の削減
- 受入: 代表ベンチで安定して目標達成2×以上
## 📦 成果物(各サブフェーズ)
- 10_a: `jit/manager.rs` スケルトン、VM連携、統計ログ
- 10_b: `jit/lower/core.rs`Const/BinOp/Cmp/Branch/Ret単体テスト
- 10_c: `jit/abi.rs`call/ret/fallback再帰テスト
- 10_d: `jit/extern/collections.rs`Array/Mapブリッジマイクロベンチ
- 10_e: `jit/inline_cache.rs`PIC/VT連携無効化テスト
- 10_f: `jit/lower/typeop_ref.rs`(最小)
- 10_g: ベンチ/統計/README更新
- 10_h: 最適化コミットと測定レポート
## 🧩 既存資産との連携(重要)
- Thunk: Phase 9.79b.3の `TypeMeta{thunks}` をJIT直呼びターゲットとして使用
- Poly-PIC: VMの構造をJITに投影同じキー `(label, version)` を使用)
- Versioning: `cache_versions` のイベントに同期してIC無効化
## 🎯 マイルストーン再定義
- M1: 10_a + 10_b 合格Core関数のJIT実行
- M2: 10_c + 10_d 合格(関数呼出/Arrayホット操作
- M3: 10_e 合格BoxCallホットパス2×
- M4: 10_g + 10_h 合格(ベンチ/統計/硬化)
## ⚠️ リスクと緩和
- ABI複雑化: まず整数/浮動/voidに限定し、BoxRefはホスト関数へブリッジ
- 最適化過剰: 常にVMフォールバックを保持、ガード失敗で安全に戻す
- デバッグ困難: CLIFダンプ/CFG表示/`NYASH_JIT_STATS`で観測

View File

@ -0,0 +1,56 @@
# Phase 11: LLVM AOT Backend将来研究
## 🎯 概要
Phase 11は、LLVM を使用した Ahead-of-TimeAOTコンパイル機能の研究・実装フェーズです。
Phase 10のCranelift JITで実用的な性能を達成した後、さらなる最適化を追求します。
## 📊 位置づけ
```
Phase 10: Cranelift JIT実用的な高速化← 現在の主経路
Phase 11: LLVM AOT最高性能への挑戦← 将来の研究開発
```
## 📁 ドキュメント
### 🔬 研究・設計ドキュメント
- [phase10_aot_scaffolding.md](phase10_aot_scaffolding.md) - LLVM Direct AOT実装計画
- MIR→LLVM IR直接変換
- Everything is Box最適化エスケープ解析
- LTO/PGO統合
- 目標: 13,500倍高速化対インタープリタ
- [phase_10_x_llvm_backend_skeleton.md](phase_10_x_llvm_backend_skeleton.md) - LLVM Backend最小実装
- 具体的な実装ステップ
- ExternCall対応
- オブジェクトファイル生成
## ⏰ タイムライン
- **Status**: Deferred延期
- **前提条件**: Phase 10Cranelift JITの完了
- **想定期間**: 4-6ヶ月
- **開始時期**: 未定Phase 10の成果を見て判断
## 🎯 期待される成果
1. **最高性能**: インタープリタ比13,500倍の実行速度
2. **メモリ効率**: Box割当80%削減
3. **起動時間**: 1ms以下
4. **配布形式**: スタンドアロン実行ファイル
## ⚠️ 注意事項
このフェーズは研究的な性質が強く、以下の理由で延期されています:
1. **複雑性**: LLVM統合は開発・保守コストが高い
2. **実用性**: Cranelift JITで十分な性能が得られる可能性
3. **優先度**: まずは安定した実装を優先
## 🔗 関連フェーズ
- [Phase 10](../phase-10/) - Cranelift JIT前提
- [Phase 9](../phase-9/) - 統一Box設計基盤
- [00_MASTER_ROADMAP.md](../00_MASTER_ROADMAP.md) - 全体計画