Files
hakorune/docs/private/ideas/improvements/2025-08-25-unified-box-mir-vm.md

2.4 KiB
Raw Blame History

MIR/VMでの統一Box処理の簡素化

Status: Pending Created: 2025-08-25 Priority: High Related-Code: src/backend/vm_instructions.rs::execute_boxcall()

現状の問題

VMのBoxCall実装で、InstanceBoxユーザー定義Boxだけ特別扱いされている

// 現在の実装
if let Some(inst) = arc_box.as_any().downcast_ref::<InstanceBox>() {
    // ユーザー定義Boxは関数呼び出しに変換
    let func_name = format!("{}.{}/{}", inst.class_name, method, args.len());
    // ...
} else {
    // ビルトイン/プラグインBoxは直接メソッド呼び出し
    self.call_box_method(cloned_box, method, nyash_args)?
}

理想的な統一実装

すべてのBoxが統一的にデリゲーションできるなら、実装も統一できるはず

案1: すべてのBoxでメソッドディスパッチ統一

// すべてのBoxで同じインターフェース
pub trait UnifiedBox: NyashBox {
    fn dispatch_method(&self, method: &str, args: Vec<Box<dyn NyashBox>>) -> Result<Box<dyn NyashBox>, String>;
}

// VMでの統一処理
let result = match &recv {
    VMValue::BoxRef(arc_box) => {
        arc_box.dispatch_method(method, nyash_args)?
    }
    _ => {
        let box_value = recv.to_nyash_box();
        box_value.dispatch_method(method, nyash_args)?
    }
};

案2: メソッドレジストリの統合

struct UnifiedMethodRegistry {
    // Box型名 → メソッド名 → 実装
    methods: HashMap<String, HashMap<String, MethodImpl>>,
}

enum MethodImpl {
    Native(fn(&dyn NyashBox, Vec<Box<dyn NyashBox>>) -> Result<Box<dyn NyashBox>, String>),
    MirFunction(String), // MIR関数名
    Plugin(PluginMethodId),
}

メリット

  1. コードの簡素化

    • Box型による分岐が不要
    • 統一的なメソッドディスパッチ
  2. 保守性の向上

    • 新しいBox型追加が容易
    • ビルトイン/プラグイン/ユーザー定義の区別が不要
  3. パフォーマンス

    • 統一的な最適化が可能
    • メソッドキャッシュの効率化

実装タイミング

  • Phase 10での大規模リファクタリング時
  • 新しいBox型追加時
  • パフォーマンス最適化時

関連する改善案

  • InstanceBoxの廃止すべてのBoxを統一表現
  • MIRでのBox型情報の統一
  • プラグインシステムの簡素化