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:
@ -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 Concept(2週間)
|
||||
2. **Phase 10.2**: 基本実装(4週間)
|
||||
3. **Phase 10.3**: 非同期の扱い(最小)
|
||||
4. **Phase 10.4**: GC切り替え可能ランタイム(2-3ヶ月)
|
||||
5. **Phase 10.5**: セルフホスティング(並行実装)
|
||||
|
||||
---
|
||||
|
||||
|
||||
61
docs/development/roadmap/phases/phase-10/README.md
Normal file
61
docs/development/roadmap/phases/phase-10/README.md
Normal 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/) - 中間表現
|
||||
@ -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
|
||||
- リージョンベースメモリ管理
|
||||
- プロファイルベース自動モード選択
|
||||
@ -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→JIT/JIT→VM)
|
||||
- 引数/戻り値の受け渡し(整数/浮動/void)
|
||||
- 例外/TypeErrorはVMへバイアウト(trap→VM)
|
||||
- 受入: 再帰/多段呼び出しが安定動作
|
||||
|
||||
### 10_d: コレクション基礎 – Array/Map ホット操作(外部呼び出し)
|
||||
- 目的: 実用的ホットパス(length/get/set/push/pop)をJIT側から呼べるように。
|
||||
- 具体:
|
||||
- ホスト関数テーブル(外部シンボル)で既存Rust実装を呼ぶ
|
||||
- 境界チェック/エラーはRust側に委譲、JITは薄い橋渡し
|
||||
- 受入: Array操作がVM経由より高速(目安1.5–2.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 2–4件)→ヒット直呼び、ミス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`で観測
|
||||
|
||||
56
docs/development/roadmap/phases/phase-11/README.md
Normal file
56
docs/development/roadmap/phases/phase-11/README.md
Normal file
@ -0,0 +1,56 @@
|
||||
# Phase 11: LLVM AOT Backend(将来研究)
|
||||
|
||||
## 🎯 概要
|
||||
|
||||
Phase 11は、LLVM を使用した Ahead-of-Time(AOT)コンパイル機能の研究・実装フェーズです。
|
||||
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 10(Cranelift 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) - 全体計画
|
||||
Reference in New Issue
Block a user