✨ 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>
16 KiB
16 KiB
MIR Call命令統一 完全移行戦略
Executive Summary
ChatGPT5 Pro A++設計によるMIR Call系命令の完全統一化プロジェクト。6種類の異なるCall命令を1つのMirCallに統一し、4つの実行器すべてで統一処理を実現。Phase 15セルフホスティングの重要な柱として、5,200行(26%)のコード削減を達成する。
現在の状況分析
✅ 完了済み項目(Phase 1-2)
- MIR統一定義:
src/mir/definitions/call_unified.rs(297行)完成 - Callee enum拡張: Constructor/Closureバリアント追加済み
- 統一メソッド実装:
emit_unified_call()と便利メソッド3種実装済み - 環境変数制御:
NYASH_MIR_UNIFIED_CALL=1で切り替え可能 - Math関数で実使用: builder_calls.rs:340-347で統一Call使用中
🔍 現在の実装状況
1. Call系命令の処理箇所(4つの実行器)
| 実行器 | ファイル | 行数 | 実装状況 |
|---|---|---|---|
| MIR生成 | src/mir/builder/*.rs |
3,656行 | ✅ 統一Call部分実装済み |
| VM Interpreter | src/backend/mir_interpreter.rs |
712行 | ✅ Callee型対応済み |
| Python LLVM | src/llvm_py/instructions/ |
804行 | ❌ 6種類別々実装 |
| mini-vm (Nyash) | apps/selfhost/vm/ |
2,200行 | 🔄 新規実装(最初から統一対応) |
2. 6種類のCall系命令の分布
// 現在の6種類
MirInstruction::Call { .. } // 汎用関数呼び出し
MirInstruction::BoxCall { .. } // Boxメソッド呼び出し
MirInstruction::PluginInvoke { .. } // プラグイン呼び出し
MirInstruction::ExternCall { .. } // C ABI外部呼び出し
MirInstruction::NewBox { .. } // Box コンストラクタ
MirInstruction::NewClosure { .. } // クロージャ生成
// 統一後の1種類
MirInstruction::MirCall(MirCall) // すべて統一
移行戦略詳細
Phase 3: MIR Builder完全統一(1週間)
3.1 高頻度使用箇所の統一(2日)
対象箇所:
build_indirect_call_expression(exprs_call.rs:6) - 旧Call生成箇所emit_box_or_plugin_call(utils.rs:75) - BoxCall/PluginInvoke生成- print等の基本関数(builder_calls.rs) - 現在callee: None
実装内容:
// Before: 旧Call生成
self.emit_instruction(MirInstruction::Call {
dst: Some(dst),
func: func_val,
callee: None, // ← 旧式
args,
effects: EffectMask::IO,
});
// After: 統一Call生成
self.emit_unified_call(
Some(dst),
CallTarget::Value(func_val),
args
)?;
期待成果:
- MIR生成器の統一率: 45% → 80%
- コード削減: 400行
3.2 残存emit_*_call系メソッド統一(2日)
統一対象:
emit_box_or_plugin_call→emit_method_callemit_external_call→emit_extern_callemit_new_box→emit_constructor_call
実装戦略:
- 各メソッドを統一Call使用に書き換え
- 既存呼び出し箇所を段階的に移行
NYASH_MIR_UNIFIED_CALL=1で切り替えテスト
3.3 環境変数制御からデフォルト化(3日)
段階的デフォルト化:
- テストスイート全体で統一Call有効化
- スモークテスト + CI通過確認
- 環境変数をデフォルトONに変更
- 旧実装コードの削除
Phase 4: Python LLVM統一(1.5週間)
4.1 統一MirCall処理の実装(4日)
新ファイル作成:
# src/llvm_py/instructions/mir_call.py
def lower_mir_call(builder, module, mir_call, dst_vid, vmap, resolver):
"""統一MirCall処理 - 6種類の命令を1箇所で処理"""
match mir_call.callee:
case Global(name):
# 旧call.pyロジック流用
case Method(box_name, method, receiver):
# 旧boxcall.pyロジック流用
case Extern(name):
# 旧externcall.pyロジック流用
case Constructor(box_type):
# 旧newbox.pyロジック流用
case Closure(params, captures):
# 新規実装
case Value(vid):
# 動的呼び出し実装
4.2 instruction_lower.py統合(2日)
dispatch統一:
# Before: 6つの分岐
elif op == "call":
lower_call(...)
elif op == "boxcall":
lower_boxcall(...)
elif op == "externcall":
lower_externcall(...)
# ... 他3種類
# After: 1つの統一分岐
elif op == "mir_call":
lower_mir_call(owner, builder, inst["mir_call"], inst.get("dst"), func)
4.3 既存ファイル削除とリファクタ(4日)
削除対象:
instructions/call.py(172行)instructions/boxcall.py(425行)instructions/externcall.py(207行)- 合計: 804行削除
期待成果:
- Python LLVM実装: 804行 → 300行(63%削減)
- 処理統一による最適化機会増加
Phase 5: VM Interpreter最適化(1週間)
5.1 統一execute_mir_call実装(3日)
現在のVMはCallee型対応済みだが、さらなる統一と最適化を実施:
// 統一実行器
fn execute_mir_call(&mut self, mir_call: &MirCall) -> Result<VMValue, VMError> {
match &mir_call.callee {
Callee::Global(name) => self.execute_global_function(name, &mir_call.args),
Callee::Method { receiver: Some(recv), method, .. } => {
let recv_val = self.reg_load(*recv)?;
self.execute_method_call(&recv_val, method, &mir_call.args)
},
Callee::Constructor { box_type } => {
self.execute_constructor_call(box_type, &mir_call.args)
},
Callee::Extern(name) => self.execute_extern_call(name, &mir_call.args),
// ... 他のパターン
}
}
5.2 既存分岐削除(2日)
削除対象:
execute_callee_callとexecute_legacy_callの分岐- 6種類のCall命令別処理ロジック
5.3 エラーハンドリング改善(2日)
統一された呼び出し処理により、エラー処理も統一化。
Phase 6: mini-vm統一対応(5日)
mini-vmは新規実装のため、最初から統一MirCall対応で実装:
// apps/selfhost/vm/call_executor.nyash
static box CallExecutor {
execute(mir_call: MirCallBox) {
local callee_type = mir_call.getCalleeType()
match callee_type {
"Global" => me.executeGlobal(mir_call)
"Method" => me.executeMethod(mir_call)
"Constructor" => me.executeConstructor(mir_call)
"Extern" => me.executeExtern(mir_call)
_ => panic("Unknown callee type: " + callee_type)
}
}
}
コード削減見込み
削減内訳
| フェーズ | 対象領域 | 現在行数 | 削減行数 | 削減率 |
|---|---|---|---|---|
| Phase 3 | MIR Builder | 3,656行 | 800行 | 22% |
| Phase 4 | Python LLVM | 804行 | 504行 | 63% |
| Phase 5 | VM Interpreter | 712行 | 200行 | 28% |
| Phase 6 | mini-vm | 2,200行 | 400行* | 18% |
| 共通 | 統一定義活用 | - | +200行 | - |
総計: 5,372行 → 4,472行 = 900行削減(17%減)
* mini-vmは最初から統一実装のため、削減ではなく最適実装
Phase 15目標への寄与
- Phase 15目標: 80k行 → 20k行(75%削減)
- MirCall統一寄与: 900行削減 = 全体の4.5%
- 複合効果: 統一による他システムへの波及効果で追加2-3%
スケジュール
✅ 完了済み(2025-09-24)
- ✅ Phase 3.1: build_indirect_call_expression統一移行(完了)
- ✅ Phase 3.2: print等基本関数のCallee型適用(完了)
🔧 進行中(今週)
- 🔄 Phase 3.3: emit_box_or_plugin_call統一化(1-2日)
📅 実装優先順位(戦略的判断済み)
第1優先: Python LLVM(来週) - 最大削減効果
- Phase 4.1: Python LLVM dispatch統一(2-3日)
src/llvm_py/llvm_builder.pyの6種類分岐→1つに統一- 環境変数で段階移行
- Phase 4.2: Python LLVM統一処理実装(3-4日)
- 804行→300行(63%削減)
- 統一dispatch_unified_call()実装
第2優先: PyVM/VM(再来週) - 実行器中核
- Phase 5: VM Interpreter統一execute実装(4-5日)
src/backend/mir_interpreter.rs(Rust VM)pyvm/vm.py(Python VM)- 712行→512行(28%削減)
第3優先: mini-vm(その後) - 新規実装
- Phase 6: mini-vm統一Call実装(5日)
- 最初から統一実装なので削減ではなく最適実装
- セルフホスティング検証
長期(完成後)
- 📅 Phase 7: 旧命令完全削除(3日)
- 📅 Phase 8: 最適化とクリーンアップ(1週間)
リスク管理
🚨 主要リスク
-
パフォーマンス影響
- 対策: ベンチマーク測定、最適化パス追加
- 閾値: 5%以上の性能低下で要改善
-
既存コードの破壊的変更
- 対策: 段階的移行、環境変数による切り替え
- ロールバック: 旧実装を環境変数で復活可能
-
テストの複雑性
- 対策: 統一後に統合テスト追加
- CI継続: 各フェーズでCI通過を確認
🎯 成功指標
Phase別チェックポイント
| Phase | 成功指標 |
|---|---|
| Phase 3 | MIR生成器でemit_unified_call使用率80%以上 |
| Phase 4 | Python LLVM実装の命令数6→1への削減完了 |
| Phase 5 | VM実行器のCall統一処理性能5%以内 |
| Phase 6 | mini-vm統一実装完了、セルフホスティング可能 |
パフォーマンス目標
- コンパイル時間: 現状維持(±5%以内)
- 実行時間: 現状維持または向上(統一最適化効果)
- メモリ使用量: 10%以上削減(重複コード除去効果)
実装サンプルコード
1. MIR Builder統一
// src/mir/builder/builder_calls.rs
impl MirBuilder {
/// 段階的移行メソッド - 旧emit_box_or_plugin_callを置き換え
pub fn emit_method_call_unified(
&mut self,
dst: Option<ValueId>,
receiver: ValueId,
method: String,
args: Vec<ValueId>,
) -> Result<Option<ValueId>, String> {
// 環境変数チェック
if std::env::var("NYASH_MIR_UNIFIED_CALL").unwrap_or("0") == "1" {
// 統一Call使用
self.emit_unified_call(
dst,
CallTarget::Method {
receiver,
method,
box_name: "InferredBox".to_string(), // 型推論で解決
},
args
)
} else {
// 従来のBoxCall使用
self.emit_box_or_plugin_call(dst, receiver, &method, None, args, EffectMask::IO)
}
}
}
2. Python LLVM統一
# src/llvm_py/instructions/mir_call.py
def lower_mir_call(owner, builder, mir_call_dict, dst_vid, func):
"""統一MirCall処理 - ChatGPT5 Pro A++設計の実装"""
callee = mir_call_dict["callee"]
args = mir_call_dict["args"]
match callee["type"]:
case "Global":
# 旧call.pyロジックを統合
return _lower_global_call(
builder, owner.module, callee["name"],
args, dst_vid, owner.vmap, owner.resolver
)
case "Method":
# 旧boxcall.pyロジックを統合
return _lower_method_call(
builder, owner.module, callee["receiver"],
callee["method"], args, dst_vid, owner.vmap
)
case "Constructor":
# NewBox相当の実装
return _lower_constructor_call(
builder, owner.module, callee["box_type"],
args, dst_vid, owner.vmap
)
case _:
raise NotImplementedError(f"Callee type {callee['type']} not supported")
3. VM Interpreter最適化
// src/backend/mir_interpreter.rs
impl MirInterpreter {
fn execute_mir_call_unified(&mut self, mir_call: &MirCall) -> Result<VMValue, VMError> {
// エフェクト検証
if mir_call.flags.no_return {
// no_return系の処理(panic, exit等)
return self.execute_no_return_call(&mir_call.callee, &mir_call.args);
}
// 型安全な呼び出し
let result = match &mir_call.callee {
Callee::Global(name) => {
self.execute_builtin_function(name, &mir_call.args)?
}
Callee::Method { receiver: Some(recv), method, box_name } => {
let recv_val = self.reg_load(*recv)?;
self.execute_typed_method(&recv_val, box_name, method, &mir_call.args)?
}
Callee::Constructor { box_type } => {
self.execute_box_constructor(box_type, &mir_call.args)?
}
Callee::Extern(name) => {
self.execute_c_abi_call(name, &mir_call.args)?
}
_ => return Err(VMError::InvalidInstruction("Unsupported callee type".into())),
};
// 結果格納
if let Some(dst) = mir_call.dst {
self.regs.insert(dst, result.clone());
}
Ok(result)
}
}
新しいTodoリスト案
基づいて実装するべきタスク(優先順位付き):
🔥 Urgent(1週間以内)
-
build_indirect_call_expression統一移行
exprs_call.rs:6をemit_unified_call使用に変更- テスト: 関数呼び出し動作確認
-
print等基本関数のCallee型適用
builder_calls.rsでcallee: None箇所を修正- Global("print")等の明示的Callee指定
-
emit_box_or_plugin_call統一化
utils.rs:75の処理をemit_method_callに集約- BoxCall/PluginInvokeの生成統一
⚡ High(2-3週間以内)
-
Python LLVM dispatch統一
instruction_lower.pyで6分岐→1分岐に統合mir_call.py新規作成
-
Python LLVM統一処理実装
- call/boxcall/externcallロジックをmix
- 804行→300行の大幅削減
-
VM Interpreter統一execute実装
execute_callee_callとexecute_legacy_call統合- エラーハンドリング改善
📅 Medium(1ヶ月以内)
-
mini-vm統一Call実装
apps/selfhost/vm/call_executor.nyash作成- Nyashでの統一処理実装
-
環境変数デフォルト化
NYASH_MIR_UNIFIED_CALL=1をデフォルトに- CI/テスト全体での統一Call使用
-
旧実装コード削除
- Python LLVM旧ファイル3種削除
- MIR Builder旧メソッド削除
🧹 Low(継続的)
-
パフォーマンス測定とベンチマーク
- 統一Call前後の性能比較
- 最適化機会の特定
-
統合テスト追加
- 4実行器での統一動作テスト
- エラーケース検証
-
ドキュメント更新
- MIR仕様書の統一Call反映
- 開発者ガイド更新
期待される成果
📊 定量的成果
- コード削減: 900行(17%)
- 命令種類: 6種類 → 1種類(83%削減)
- メンテナンス負荷: 4箇所 × 6種類 = 24パターン → 4箇所 × 1種類 = 4パターン(83%削減)
🚀 定性的成果
- 開発体験向上: 新Call実装時の工数大幅削減
- バグ削減: 統一処理によるエッジケース減少
- 最適化機会: 統一されたCall処理による最適化効果
- AI協働開発: ChatGPT5 Pro設計の実証完了
🎯 Phase 15への戦略的寄与
MirCall統一は単なるコード削減を超えて:
- セルフホスティング加速: mini-vmの統一実装による開発効率化
- AI設計実証: ChatGPT5 Pro A++設計の実用性証明
- 拡張性確保: 新しいCall種類の追加が極めて容易に
- 保守性向上: 4実行器×1統一処理による保守負荷激減
この包括的移行により、Phase 15の80k→20k行革命において重要な役割を果たし、Nyashセルフホスティングの技術的基盤を確立する。