Files
hakorune/docs/reference/mir/call-instructions-current.md
Selfhosting Dev 81211c22ad feat: MIR Call命令統一Phase 3.1-3.2完了!統一Call実装進行中
 Phase 3.1-3.2実装完了
- build_indirect_call_expressionでCallTarget::Value使用
- print関数をcall_global print()として統一
- build_function_callでemit_unified_call使用
- ExternCall(env.console.log)→Callee::Global(print)完全移行

🏗️ MIR統一基盤構築
- src/mir/definitions/call_unified.rs: 統一定義(297行)
- emit_unified_call()と便利メソッド3種実装
- NYASH_MIR_UNIFIED_CALL=1で段階移行制御
- VM実行器でCallee対応実装済み

📊 進捗状況(26%削減見込み)
- Phase 1-2:  基盤構築完了
- Phase 3.1-3.2:  基本関数統一完了
- Phase 3.3: 🔄 BoxCall統一中
- Phase 4: 📅 Python LLVM(最優先・63%削減)
- Phase 5: 📅 PyVM/VM統一

📚 ドキュメント更新
- CLAUDE.md: テストスクリプト参考集追加
- CURRENT_TASK.md: Phase 3進捗更新
- python-llvm-priority-rationale.md: 優先順位戦略文書化
- mir-call-unification-master-plan.md: スケジュール最新化

🎯 6種類→1種類: Call/BoxCall/PluginInvoke/ExternCall/NewBox/NewClosure → MirCall統一へ

🤖 Generated with [Claude Code](https://claude.ai/code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-09-24 01:05:44 +09:00

3.4 KiB
Raw Blame History

MIR Call系命令の現状2025-09-23

📊 現在のCall系命令6種類

1. Call関数呼び出し

Call {
    dst: Option<ValueId>,
    func: ValueId,           // 関数オブジェクトValueId
    callee: Option<Callee>,  // ← 今日追加した型安全解決
    args: Vec<ValueId>,
    effects: EffectMask,
}

用途: 関数呼び出し全般今日Callee型追加でシャドウイング対策

2. BoxCallBoxメソッド呼び出し

BoxCall {
    dst: Option<ValueId>,
    box_val: ValueId,        // レシーバー
    method: String,          // メソッド名
    method_id: Option<u16>,  // 統一レジストリID
    args: Vec<ValueId>,
    effects: EffectMask,
}

用途: StringBox.concat()等、すべてのBoxメソッド

3. PluginInvokeプラグイン強制

PluginInvoke {
    dst: Option<ValueId>,
    box_val: ValueId,
    method: String,
    args: Vec<ValueId>,
    effects: EffectMask,
}

用途: プラグインメソッド呼び出しbuiltinフォールバックなし

4. ExternCall環境直結

ExternCall {
    dst: Option<ValueId>,
    iface_name: String,      // "env.console"
    method_name: String,     // "log"
    args: Vec<ValueId>,
    effects: EffectMask,
}

用途: env.console.log等、ホスト環境への直接呼び出し

5. NewBoxBox生成

NewBox {
    dst: ValueId,
    box_type: String,        // "StringBox"等
    args: Vec<ValueId>,      // コンストラクタ引数
}

用途: new StringBox("hello")等

6. NewClosureクロージャ生成

NewClosure {
    dst: ValueId,
    params: Vec<String>,
    body: Vec<MirInstruction>,
    captures: Vec<(String, ValueId)>,
    me: Option<ValueId>,
}

用途: 関数リテラル、クロージャ

🔴 問題点

  1. 重複: CallとBoxCallの役割が重複
  2. 不統一: PluginInvokeとBoxCallが分離
  3. 複雑: 6種類のCall系命令は多すぎる
  4. メンテ困難: 各実行器VM/JIT/LLVMで6種類実装が必要

Callee型今日追加

pub enum Callee {
    Global(String),          // print, error等
    Method {                 // Box.method()
        box_name: String,
        method: String,
        receiver: Option<ValueId>,
    },
    Value(ValueId),         // 第一級関数
    Extern(String),         // 外部関数
}

現状: Callのみ対応、他は未統合

📈 統計(ソースコード分析)

命令 使用箇所数 主な用途
Call 多数 一般関数呼び出し
BoxCall 多数 Boxメソッド全般
PluginInvoke 少数 プラグイン限定
ExternCall 少数 print正規化後
NewBox 多数 Box生成全般
FunctionNew 少数 クロージャ

🎯 今後の方向性

ChatGPT5 Pro提案A++案)

  • すべてをCall + Calleeに統一
  • receiverをCalleeに含める
  • EffectMaskで安全性管理
  • 段階的移行で実装

移行優先順位

  1. ExternCall → Call + Callee::Extern
  2. BoxCall → Call + Callee::Method
  3. PluginInvoke → Call + Callee::Methodeffects=Sandbox
  4. NewBox → そのまま残すor Call + Callee::Constructor検討

📝 更新履歴

  • 2025-09-23: Callee型追加ChatGPT5 Pro設計
  • 2025-09-23: 本ドキュメント作成