2025-09-24 01:05:44 +09:00
|
|
|
|
# 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系命令の分布
|
|
|
|
|
|
|
|
|
|
|
|
```rust
|
|
|
|
|
|
// 現在の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
|
|
|
|
|
|
|
|
|
|
|
|
**実装内容**:
|
|
|
|
|
|
```rust
|
|
|
|
|
|
// 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_call`
|
|
|
|
|
|
- `emit_external_call` → `emit_extern_call`
|
|
|
|
|
|
- `emit_new_box` → `emit_constructor_call`
|
|
|
|
|
|
|
|
|
|
|
|
**実装戦略**:
|
|
|
|
|
|
1. 各メソッドを統一Call使用に書き換え
|
|
|
|
|
|
2. 既存呼び出し箇所を段階的に移行
|
|
|
|
|
|
3. `NYASH_MIR_UNIFIED_CALL=1`で切り替えテスト
|
|
|
|
|
|
|
|
|
|
|
|
#### 3.3 環境変数制御からデフォルト化(3日)
|
|
|
|
|
|
|
|
|
|
|
|
**段階的デフォルト化**:
|
|
|
|
|
|
1. テストスイート全体で統一Call有効化
|
|
|
|
|
|
2. スモークテスト + CI通過確認
|
|
|
|
|
|
3. 環境変数をデフォルトONに変更
|
|
|
|
|
|
4. 旧実装コードの削除
|
|
|
|
|
|
|
|
|
|
|
|
### Phase 4: Python LLVM統一(1.5週間)
|
|
|
|
|
|
|
|
|
|
|
|
#### 4.1 統一MirCall処理の実装(4日)
|
|
|
|
|
|
|
|
|
|
|
|
**新ファイル作成**:
|
|
|
|
|
|
```python
|
|
|
|
|
|
# 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統一**:
|
|
|
|
|
|
```python
|
|
|
|
|
|
# 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型対応済みだが、さらなる統一と最適化を実施:
|
|
|
|
|
|
|
|
|
|
|
|
```rust
|
|
|
|
|
|
// 統一実行器
|
|
|
|
|
|
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対応で実装:
|
|
|
|
|
|
|
|
|
|
|
|
```nyash
|
2025-11-06 15:41:52 +09:00
|
|
|
|
// apps/selfhost/vm/call_executor.hako
|
2025-09-24 01:05:44 +09:00
|
|
|
|
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週間)
|
|
|
|
|
|
|
|
|
|
|
|
## リスク管理
|
|
|
|
|
|
|
|
|
|
|
|
### 🚨 主要リスク
|
|
|
|
|
|
|
|
|
|
|
|
1. **パフォーマンス影響**
|
|
|
|
|
|
- **対策**: ベンチマーク測定、最適化パス追加
|
|
|
|
|
|
- **閾値**: 5%以上の性能低下で要改善
|
|
|
|
|
|
|
|
|
|
|
|
2. **既存コードの破壊的変更**
|
|
|
|
|
|
- **対策**: 段階的移行、環境変数による切り替え
|
|
|
|
|
|
- **ロールバック**: 旧実装を環境変数で復活可能
|
|
|
|
|
|
|
|
|
|
|
|
3. **テストの複雑性**
|
|
|
|
|
|
- **対策**: 統一後に統合テスト追加
|
|
|
|
|
|
- **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統一
|
|
|
|
|
|
|
|
|
|
|
|
```rust
|
|
|
|
|
|
// 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統一
|
|
|
|
|
|
|
|
|
|
|
|
```python
|
|
|
|
|
|
# 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最適化
|
|
|
|
|
|
|
|
|
|
|
|
```rust
|
|
|
|
|
|
// 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週間以内)
|
|
|
|
|
|
|
|
|
|
|
|
1. **build_indirect_call_expression統一移行**
|
|
|
|
|
|
- `exprs_call.rs:6`を`emit_unified_call`使用に変更
|
|
|
|
|
|
- テスト: 関数呼び出し動作確認
|
|
|
|
|
|
|
|
|
|
|
|
2. **print等基本関数のCallee型適用**
|
|
|
|
|
|
- `builder_calls.rs`でcallee: None箇所を修正
|
|
|
|
|
|
- Global("print")等の明示的Callee指定
|
|
|
|
|
|
|
|
|
|
|
|
3. **emit_box_or_plugin_call統一化**
|
|
|
|
|
|
- `utils.rs:75`の処理を`emit_method_call`に集約
|
|
|
|
|
|
- BoxCall/PluginInvokeの生成統一
|
|
|
|
|
|
|
|
|
|
|
|
### ⚡ High(2-3週間以内)
|
|
|
|
|
|
|
|
|
|
|
|
4. **Python LLVM dispatch統一**
|
|
|
|
|
|
- `instruction_lower.py`で6分岐→1分岐に統合
|
|
|
|
|
|
- `mir_call.py`新規作成
|
|
|
|
|
|
|
|
|
|
|
|
5. **Python LLVM統一処理実装**
|
|
|
|
|
|
- call/boxcall/externcallロジックをmix
|
|
|
|
|
|
- 804行→300行の大幅削減
|
|
|
|
|
|
|
|
|
|
|
|
6. **VM Interpreter統一execute実装**
|
|
|
|
|
|
- `execute_callee_call`と`execute_legacy_call`統合
|
|
|
|
|
|
- エラーハンドリング改善
|
|
|
|
|
|
|
|
|
|
|
|
### 📅 Medium(1ヶ月以内)
|
|
|
|
|
|
|
|
|
|
|
|
7. **mini-vm統一Call実装**
|
2025-11-06 15:41:52 +09:00
|
|
|
|
- `apps/selfhost/vm/call_executor.hako`作成
|
2025-09-24 01:05:44 +09:00
|
|
|
|
- Nyashでの統一処理実装
|
|
|
|
|
|
|
|
|
|
|
|
8. **環境変数デフォルト化**
|
|
|
|
|
|
- `NYASH_MIR_UNIFIED_CALL=1`をデフォルトに
|
|
|
|
|
|
- CI/テスト全体での統一Call使用
|
|
|
|
|
|
|
|
|
|
|
|
9. **旧実装コード削除**
|
|
|
|
|
|
- Python LLVM旧ファイル3種削除
|
|
|
|
|
|
- MIR Builder旧メソッド削除
|
|
|
|
|
|
|
|
|
|
|
|
### 🧹 Low(継続的)
|
|
|
|
|
|
|
|
|
|
|
|
10. **パフォーマンス測定とベンチマーク**
|
|
|
|
|
|
- 統一Call前後の性能比較
|
|
|
|
|
|
- 最適化機会の特定
|
|
|
|
|
|
|
|
|
|
|
|
11. **統合テスト追加**
|
|
|
|
|
|
- 4実行器での統一動作テスト
|
|
|
|
|
|
- エラーケース検証
|
|
|
|
|
|
|
|
|
|
|
|
12. **ドキュメント更新**
|
|
|
|
|
|
- MIR仕様書の統一Call反映
|
|
|
|
|
|
- 開発者ガイド更新
|
|
|
|
|
|
|
|
|
|
|
|
## 期待される成果
|
|
|
|
|
|
|
|
|
|
|
|
### 📊 定量的成果
|
|
|
|
|
|
|
|
|
|
|
|
- **コード削減**: 900行(17%)
|
|
|
|
|
|
- **命令種類**: 6種類 → 1種類(83%削減)
|
|
|
|
|
|
- **メンテナンス負荷**: 4箇所 × 6種類 = 24パターン → 4箇所 × 1種類 = 4パターン(83%削減)
|
|
|
|
|
|
|
|
|
|
|
|
### 🚀 定性的成果
|
|
|
|
|
|
|
|
|
|
|
|
- **開発体験向上**: 新Call実装時の工数大幅削減
|
|
|
|
|
|
- **バグ削減**: 統一処理によるエッジケース減少
|
|
|
|
|
|
- **最適化機会**: 統一されたCall処理による最適化効果
|
|
|
|
|
|
- **AI協働開発**: ChatGPT5 Pro設計の実証完了
|
|
|
|
|
|
|
|
|
|
|
|
### 🎯 Phase 15への戦略的寄与
|
|
|
|
|
|
|
|
|
|
|
|
MirCall統一は単なるコード削減を超えて:
|
|
|
|
|
|
|
|
|
|
|
|
1. **セルフホスティング加速**: mini-vmの統一実装による開発効率化
|
|
|
|
|
|
2. **AI設計実証**: ChatGPT5 Pro A++設計の実用性証明
|
|
|
|
|
|
3. **拡張性確保**: 新しいCall種類の追加が極めて容易に
|
|
|
|
|
|
4. **保守性向上**: 4実行器×1統一処理による保守負荷激減
|
|
|
|
|
|
|
|
|
|
|
|
この包括的移行により、Phase 15の80k→20k行革命において重要な役割を果たし、Nyashセルフホスティングの技術的基盤を確立する。
|