Files
hakorune/docs/private/ideas/other/2025-08-26-gc-switchable-language.md

3.9 KiB
Raw Blame History

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. デバッグ情報の保持

  • どのモードで実行されているか
  • 参照カウントの可視化

🎉 期待される効果

  1. 開発効率: GCありで快適開発
  2. 実行性能: GCなしで最高速
  3. 教育価値: メモリ管理の学習に最適
  4. 柔軟性: アプリケーションに応じた選択

📚 参考資料

  • Rust: 所有権システム(コンパイル時)
  • Swift: ARC自動参照カウント
  • Go/Java: 強制GC
  • C/C++: 手動管理

🔮 将来の拡張

  • Mark & Sweep GCモードの追加
  • 世代別GC
  • リージョンベースメモリ管理
  • プロファイルベース自動選択

実装タイミング

  • Cranelift JIT実装後が理想的
  • まずはインタープリターで実験
  • 実用性を確認してから本格実装