3.9 KiB
3.9 KiB
GC切り替え可能言語 - 史上初の柔軟なメモリ管理
Status: Research Created: 2025-08-26 Priority: Medium Related: メモリ管理、参照カウント、開発効率
🌟 コンセプト
Nyashを世界初のGC切り替え可能言語にする革新的アイデア。開発時はGCオンで快適に、本番ではGCオフで高性能に。
🎯 基本アイデア
// 開発時: メモリリークを気にせず開発
nyash --gc-mode=ref-counting app.nyash
// 本番: 最高性能で実行
nyash --gc-mode=explicit app.nyash
📊 メモリ管理モード
1. Explicit Mode(デフォルト)
- 現在のNyashの動作
- スコープ抜けたら即fini()
- 予測可能な性能
- リアルタイムアプリ向け
2. Reference Counting Mode(新規)
- 参照カウントが0になったらfini()
- share_box()で参照カウント++
- 循環参照はweak参照で解決
- 一般アプリ向け
🔧 実装戦略
インタープリター(簡単)
// 実行時のモード切り替えで対応
match memory_mode {
RefCounting => {
// 代入時に参照カウント操作
old_value.dec_ref();
new_value.inc_ref();
}
Explicit => {
// 現在の動作
}
}
MIR(中程度)
// 新しい抽象命令を追加
enum MirInstruction {
Acquire(temp_id), // 値の取得(GCならref++)
Release(temp_id), // 値の解放(GCならref--/fini)
}
// MIRは同じ、実行時に挙動を変える
VM(やや複雑)
- Acquire/Release命令の実装
- モードフラグによる分岐
- 参照カウント0検出時のfini呼び出し
Cranelift JIT(複雑)
// モード別のコード生成
if gc_mode == Explicit {
// Acquire/Release命令をスキップ
// 直接fini呼び出し
} else {
// 参照カウント操作のインライン展開
// 条件付きfini呼び出し
}
🚀 実装フェーズ
Phase 1: 基礎実装(1-2週間)
- BoxBaseに参照カウント追加
- インタープリターでのモード切り替え
- 基本的なテスト
Phase 2: MIR/VM対応(1ヶ月)
- Acquire/Release命令の設計
- MIRビルダーの対応
- VM実行時の最適化
Phase 3: JIT最適化(Cranelift後)
- モード別コード生成
- デッドコード除去
- インライン最適化
💡 革新的な使い方
開発フロー
# 1. 開発中: GCオンで快適開発
nyash --gc-mode=ref-counting --detect-leaks dev.nyash
# 2. テスト: メモリリーク検出
nyash --gc-mode=ref-counting --memory-report test.nyash
# 3. 本番: GCオフで最高性能
nyash --gc-mode=explicit --optimize prod.nyash
ハイブリッドモード
// ファイル単位での制御
// @gc-mode: explicit
box RealtimeAudioProcessor { }
// @gc-mode: ref-counting
box UIController { }
🤔 技術的課題
1. 統一的なMIR表現
- GCモードに依存しないMIR設計
- 実行時の最適化余地を残す
2. JITコード生成の複雑化
- モード別の最適化パス
- コードキャッシュの管理
3. デバッグ情報の保持
- どのモードで実行されているか
- 参照カウントの可視化
🎉 期待される効果
- 開発効率: GCありで快適開発
- 実行性能: GCなしで最高速
- 教育価値: メモリ管理の学習に最適
- 柔軟性: アプリケーションに応じた選択
📚 参考資料
- Rust: 所有権システム(コンパイル時)
- Swift: ARC(自動参照カウント)
- Go/Java: 強制GC
- C/C++: 手動管理
🔮 将来の拡張
- Mark & Sweep GCモードの追加
- 世代別GC
- リージョンベースメモリ管理
- プロファイルベース自動選択
実装タイミング
- Cranelift JIT実装後が理想的
- まずはインタープリターで実験
- 実用性を確認してから本格実装