fix(phase-4.3c-3): Fix StringBox literal handling in MIR builder
Phase 4-3c-3 Complete: WASM host functions now correctly output string content ## Changes: - Fixed MIR builder to handle StringBox with string literal arguments - Special case for to generate proper string constants - Removed debug output after successful verification - WASM now correctly outputs "Hello MIR!" instead of "StringBox" ## Test Results: - MIR generation: ✅ Generates correctly - WASM compilation: ✅ String data correctly placed at offset 4096 - WASM execution: ✅ Outputs "Hello MIR\!" as expected ## Technical Details: - Modified build_new_expression() to detect StringBox with literal arguments - Generates Const instruction with actual string content - Host function reads StringBox memory layout correctly This completes the WASM string output functionality for Phase 4. 🤖 Generated with Claude Code Co-Authored-By: Claude <noreply@anthropic.com>
This commit is contained in:
361
docs/予定/native-plan/issues/mir_reduction_detailed_analysis.md
Normal file
361
docs/予定/native-plan/issues/mir_reduction_detailed_analysis.md
Normal file
@ -0,0 +1,361 @@
|
||||
# MIR 35→26命令削減: 詳細分析・移行戦略
|
||||
|
||||
*実装ベース完全マッピング - 2025年8月17日版*
|
||||
|
||||
## 🔍 **現在実装35命令 vs ChatGPT5仕様26命令の完全マッピング**
|
||||
|
||||
### **維持する命令 (既存実装 → 26命令仕様)**
|
||||
|
||||
| 現在実装 | 26命令仕様 | 効果 | 変更 |
|
||||
|----------|------------|------|------|
|
||||
| `Const` | `Const` | pure | ✅ 維持 |
|
||||
| `BinOp` | `BinOp` | pure | ✅ 維持 |
|
||||
| `Compare` | `Compare` | pure | ✅ 維持 |
|
||||
| `Branch` | `Branch` | control | ✅ 維持 |
|
||||
| `Jump` | `Jump` | control | ✅ 維持 |
|
||||
| `Phi` | `Phi` | pure | ✅ 維持 |
|
||||
| `Call` | `Call` | context | ✅ 維持 |
|
||||
| `Return` | `Return` | control | ✅ 維持 |
|
||||
| `NewBox` | `NewBox` | mut | ✅ 維持 |
|
||||
| `BoxCall` | `BoxCall` | context | ✅ 維持 |
|
||||
| `ExternCall` | `ExternCall` | context | ✅ 維持 |
|
||||
| `Safepoint` | `Safepoint` | io | ✅ 維持 |
|
||||
| `RefGet` | `RefGet` | pure | ✅ 維持 |
|
||||
| `RefSet` | `RefSet` | mut | ✅ 維持 |
|
||||
| `WeakNew` | `WeakNew` | pure | ✅ 維持 |
|
||||
| `WeakLoad` | `WeakLoad` | pure | ✅ 維持 |
|
||||
|
||||
**小計**: 16命令維持
|
||||
|
||||
### **削除する命令 (17命令)**
|
||||
|
||||
#### **グループ1: BinOp統合 (1命令)**
|
||||
|
||||
| 削除命令 | 置換方法 | 実装例 |
|
||||
|----------|----------|--------|
|
||||
| `UnaryOp` | `BinOp`統合 | `not %a` → `%a xor true`<br>`neg %a` → `0 sub %a` |
|
||||
|
||||
#### **グループ2: BoxField操作統合 (4命令)**
|
||||
|
||||
| 削除命令 | 置換方法 | 実装例 |
|
||||
|----------|----------|--------|
|
||||
| `Load` | `BoxFieldLoad` | `load %ptr` → `%ptr.value` |
|
||||
| `Store` | `BoxFieldStore` | `store %val -> %ptr` → `%ptr.value = %val` |
|
||||
| `ArrayGet` | `BoxFieldLoad` | `%arr[%idx]` → `%arr.elements[%idx]` |
|
||||
| `ArraySet` | `BoxFieldStore` | `%arr[%idx] = %val` → `%arr.elements[%idx] = %val` |
|
||||
|
||||
#### **グループ3: intrinsic化 (6命令)**
|
||||
|
||||
| 削除命令 | intrinsic名 | 実装例 |
|
||||
|----------|-------------|--------|
|
||||
| `Print` | `@print` | `print %val` → `call @print, %val` |
|
||||
| `Debug` | `@debug` | `debug %val "msg"` → `call @debug, %val, "msg"` |
|
||||
| `TypeCheck` | `@type_check` | `type_check %val "Type"` → `call @type_check, %val, "Type"` |
|
||||
| `Cast` | `@cast` | `cast %val Type` → `call @cast, %val, Type` |
|
||||
| `Throw` | `@throw` | `throw %exc` → `call @throw, %exc` |
|
||||
| `Catch` | `@catch` | `catch Type -> %bb` → `call @catch, Type, %bb` |
|
||||
|
||||
#### **グループ4: 完全削除 (3命令)**
|
||||
|
||||
| 削除命令 | 削除理由 | 代替方法 |
|
||||
|----------|----------|----------|
|
||||
| `Copy` | 最適化パス専用 | 最適化段階でのみ使用 |
|
||||
| `Nop` | 不要 | 削除(プレースホルダー不要) |
|
||||
| `RefNew` | 冗長 | `RefGet`で代用可能 |
|
||||
|
||||
#### **グループ5: 統合・置換 (3命令)**
|
||||
|
||||
| 削除命令 | 統合先 | 実装例 |
|
||||
|----------|--------|--------|
|
||||
| `BarrierRead` | `AtomicFence` | `barrier_read %ptr` → `atomic_fence acquire` |
|
||||
| `BarrierWrite` | `AtomicFence` | `barrier_write %ptr` → `atomic_fence release` |
|
||||
| `FutureNew` | `NewBox + BoxCall` | `future_new %val` → `%f = new_box "Future"(%val)` |
|
||||
| `FutureSet` | `BoxCall` | `future_set %f = %val` → `%f.set(%val)` |
|
||||
| `Await` | `BoxCall` | `await %f` → `%f.await()` |
|
||||
|
||||
### **追加する命令 (10命令)**
|
||||
|
||||
| 新命令 | 効果 | 目的 | 実装必要度 |
|
||||
|--------|------|------|------------|
|
||||
| `BoxFieldLoad` | pure | Everything is Box核心 | 🔥 Critical |
|
||||
| `BoxFieldStore` | mut | Everything is Box核心 | 🔥 Critical |
|
||||
| `WeakCheck` | pure | weak参照完全対応 | ⚡ High |
|
||||
| `Send` | io | Bus操作一次市民化 | ⚡ High |
|
||||
| `Recv` | io | Bus操作一次市民化 | ⚡ High |
|
||||
| `TailCall` | control | JIT最適化基盤 | 📝 Medium |
|
||||
| `Adopt` | mut | 所有権移管明示 | 📝 Medium |
|
||||
| `Release` | mut | 所有権移管明示 | 📝 Medium |
|
||||
| `MemCopy` | mut | 最適化基盤 | 📝 Medium |
|
||||
| `AtomicFence` | io | 並行制御統一 | 📝 Medium |
|
||||
|
||||
## 🛠️ **具体的実装戦略**
|
||||
|
||||
### **Phase 1: 新命令実装**
|
||||
|
||||
#### **BoxFieldLoad/BoxFieldStore実装**
|
||||
```rust
|
||||
// src/mir/instruction.rs
|
||||
pub enum MirInstruction {
|
||||
// 新規追加
|
||||
BoxFieldLoad {
|
||||
dst: ValueId,
|
||||
box_val: ValueId,
|
||||
field: String,
|
||||
},
|
||||
BoxFieldStore {
|
||||
box_val: ValueId,
|
||||
field: String,
|
||||
value: ValueId,
|
||||
},
|
||||
// ...
|
||||
}
|
||||
```
|
||||
|
||||
#### **WeakCheck実装**
|
||||
```rust
|
||||
WeakCheck {
|
||||
dst: ValueId,
|
||||
weak_ref: ValueId,
|
||||
}
|
||||
```
|
||||
|
||||
#### **Send/Recv実装**
|
||||
```rust
|
||||
Send {
|
||||
data: ValueId,
|
||||
target: ValueId,
|
||||
},
|
||||
Recv {
|
||||
dst: ValueId,
|
||||
source: ValueId,
|
||||
},
|
||||
```
|
||||
|
||||
### **Phase 2: intrinsic関数システム実装**
|
||||
|
||||
#### **intrinsic レジストリ**
|
||||
```rust
|
||||
// src/interpreter/intrinsics.rs
|
||||
pub struct IntrinsicRegistry {
|
||||
functions: HashMap<String, IntrinsicFunction>,
|
||||
}
|
||||
|
||||
impl IntrinsicRegistry {
|
||||
pub fn new() -> Self {
|
||||
let mut registry = Self { functions: HashMap::new() };
|
||||
registry.register("@print", intrinsic_print);
|
||||
registry.register("@debug", intrinsic_debug);
|
||||
registry.register("@type_check", intrinsic_type_check);
|
||||
registry.register("@cast", intrinsic_cast);
|
||||
registry.register("@array_get", intrinsic_array_get);
|
||||
registry.register("@array_set", intrinsic_array_set);
|
||||
registry
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
#### **intrinsic関数実装例**
|
||||
```rust
|
||||
fn intrinsic_print(args: &[Value]) -> Result<Value, RuntimeError> {
|
||||
println!("{}", args[0]);
|
||||
Ok(Value::Void)
|
||||
}
|
||||
|
||||
fn intrinsic_array_get(args: &[Value]) -> Result<Value, RuntimeError> {
|
||||
let array = args[0].as_array_box()?;
|
||||
let index = args[1].as_integer()?;
|
||||
array.get_element(index as usize)
|
||||
}
|
||||
|
||||
fn intrinsic_array_set(args: &[Value]) -> Result<Value, RuntimeError> {
|
||||
let array = args[0].as_array_box_mut()?;
|
||||
let index = args[1].as_integer()?;
|
||||
let value = args[2].clone();
|
||||
array.set_element(index as usize, value)
|
||||
}
|
||||
```
|
||||
|
||||
### **Phase 3: AST→MIR生成更新**
|
||||
|
||||
#### **Load/Store → BoxFieldLoad/BoxFieldStore変換**
|
||||
```rust
|
||||
// src/mir/builder.rs
|
||||
impl MirBuilder {
|
||||
fn visit_field_access(&mut self, node: &FieldAccessNode) -> Result<ValueId, BuildError> {
|
||||
let box_val = self.visit_expression(&node.object)?;
|
||||
let dst = self.new_temp_var();
|
||||
|
||||
// 旧: Load命令生成
|
||||
// self.emit(MirInstruction::Load { dst, ptr: box_val });
|
||||
|
||||
// 新: BoxFieldLoad命令生成
|
||||
self.emit(MirInstruction::BoxFieldLoad {
|
||||
dst,
|
||||
box_val,
|
||||
field: node.field.clone(),
|
||||
});
|
||||
|
||||
Ok(dst)
|
||||
}
|
||||
|
||||
fn visit_field_assignment(&mut self, node: &FieldAssignmentNode) -> Result<(), BuildError> {
|
||||
let box_val = self.visit_expression(&node.object)?;
|
||||
let value = self.visit_expression(&node.value)?;
|
||||
|
||||
// 旧: Store命令生成
|
||||
// self.emit(MirInstruction::Store { value, ptr: box_val });
|
||||
|
||||
// 新: BoxFieldStore命令生成
|
||||
self.emit(MirInstruction::BoxFieldStore {
|
||||
box_val,
|
||||
field: node.field.clone(),
|
||||
value,
|
||||
});
|
||||
|
||||
Ok(())
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
#### **配列操作 → BoxField + intrinsic変換**
|
||||
```rust
|
||||
fn visit_array_access(&mut self, node: &ArrayAccessNode) -> Result<ValueId, BuildError> {
|
||||
let array = self.visit_expression(&node.array)?;
|
||||
let index = self.visit_expression(&node.index)?;
|
||||
let dst = self.new_temp_var();
|
||||
|
||||
// intrinsic化
|
||||
self.emit(MirInstruction::Call {
|
||||
dst: Some(dst),
|
||||
func: self.get_intrinsic_id("@array_get"),
|
||||
args: vec![array, index],
|
||||
effects: EffectMask::PURE,
|
||||
});
|
||||
|
||||
Ok(dst)
|
||||
}
|
||||
```
|
||||
|
||||
### **Phase 4: バックエンド対応**
|
||||
|
||||
#### **Interpreter実装**
|
||||
```rust
|
||||
// src/backend/interpreter.rs
|
||||
impl Interpreter {
|
||||
fn execute_box_field_load(&mut self, dst: ValueId, box_val: ValueId, field: &str) -> Result<(), RuntimeError> {
|
||||
let box_obj = self.get_value(box_val)?;
|
||||
let field_value = box_obj.get_field(field)?;
|
||||
self.set_value(dst, field_value);
|
||||
Ok(())
|
||||
}
|
||||
|
||||
fn execute_box_field_store(&mut self, box_val: ValueId, field: &str, value: ValueId) -> Result<(), RuntimeError> {
|
||||
let mut box_obj = self.get_value_mut(box_val)?;
|
||||
let field_value = self.get_value(value)?;
|
||||
box_obj.set_field(field, field_value)?;
|
||||
Ok(())
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
#### **VM実装**
|
||||
```rust
|
||||
// src/backend/vm.rs
|
||||
impl VM {
|
||||
fn exec_box_field_load(&mut self, dst: RegId, box_val: RegId, field_id: FieldId) -> VMResult<()> {
|
||||
let box_ptr = self.registers[box_val as usize];
|
||||
let field_value = unsafe {
|
||||
self.load_field(box_ptr, field_id)
|
||||
};
|
||||
self.registers[dst as usize] = field_value;
|
||||
Ok(())
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
#### **WASM実装**
|
||||
```rust
|
||||
// src/backend/wasm/codegen.rs
|
||||
impl WasmCodegen {
|
||||
fn generate_box_field_load(&mut self, dst: ValueId, box_val: ValueId, field: &str) -> Result<(), CodegenError> {
|
||||
let box_addr = self.get_value_address(box_val)?;
|
||||
let field_offset = self.get_field_offset(field)?;
|
||||
|
||||
// WASM: i32.load offset=field_offset
|
||||
self.emit_wasm(&format!("i32.load offset={}", field_offset));
|
||||
self.set_value_register(dst);
|
||||
Ok(())
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
## 📊 **移行スケジュール詳細**
|
||||
|
||||
### **Week 1: 基盤実装 (8/18-8/24)**
|
||||
- [ ] 新命令構造体定義
|
||||
- [ ] intrinsicレジストリ実装
|
||||
- [ ] パーサー拡張(新旧両対応)
|
||||
|
||||
### **Week 2: フロントエンド移行 (8/25-8/31)**
|
||||
- [ ] AST→MIR変換更新
|
||||
- [ ] 配列操作intrinsic化
|
||||
- [ ] Load/Store→BoxField変換
|
||||
|
||||
### **Week 3: 最適化パス移行 (9/1-9/7)**
|
||||
- [ ] Effect分類実装
|
||||
- [ ] 所有権森検証
|
||||
- [ ] BoxFieldLoad/Store最適化
|
||||
|
||||
### **Week 4: バックエンド移行 (9/8-9/14)**
|
||||
- [ ] Interpreter新命令実装
|
||||
- [ ] VM新命令実装
|
||||
- [ ] WASM新命令実装
|
||||
|
||||
### **Week 5: クリーンアップ (9/15-9/21)**
|
||||
- [ ] 旧命令完全削除
|
||||
- [ ] テスト更新
|
||||
- [ ] ドキュメント整備
|
||||
|
||||
## 🧪 **テスト・検証計画**
|
||||
|
||||
### **段階的テスト**
|
||||
```bash
|
||||
# Week 1終了時
|
||||
./scripts/test_mir_parsing_26.sh
|
||||
|
||||
# Week 2終了時
|
||||
./scripts/test_frontend_migration.sh
|
||||
|
||||
# Week 3終了時
|
||||
./scripts/test_optimization_passes.sh
|
||||
|
||||
# Week 4終了時
|
||||
./scripts/test_all_backends.sh
|
||||
|
||||
# Week 5終了時
|
||||
./scripts/test_golden_mir_final.sh
|
||||
```
|
||||
|
||||
### **性能回帰テスト**
|
||||
```bash
|
||||
# 削減前後性能比較
|
||||
./scripts/benchmark_mir_reduction.sh
|
||||
```
|
||||
|
||||
## 🎯 **リスク対策**
|
||||
|
||||
### **高リスク箇所**
|
||||
1. **配列操作intrinsic化**: パフォーマンス影響大
|
||||
2. **BoxField統合**: Box型システムとの整合性
|
||||
3. **Effect分類変更**: 最適化ロジック全面見直し
|
||||
|
||||
### **対策**
|
||||
- **プロトタイプ実装**: 高リスク箇所の事前検証
|
||||
- **性能測定**: 各段階での性能チェック
|
||||
- **ロールバック**: 問題発生時の迅速復旧
|
||||
|
||||
---
|
||||
|
||||
**分析完了**: 2025年8月17日
|
||||
**実装開始**: 2025年8月18日
|
||||
**完了予定**: 2025年9月21日
|
||||
253
docs/予定/native-plan/issues/phase_8_5_mir_35_to_26_reduction.md
Normal file
253
docs/予定/native-plan/issues/phase_8_5_mir_35_to_26_reduction.md
Normal file
@ -0,0 +1,253 @@
|
||||
# Phase 8.5: MIR 35→26命令削減プロジェクト(緊急実装)
|
||||
|
||||
## 🚨 **緊急度: Critical**
|
||||
|
||||
**発見日**: 2025年8月17日
|
||||
**問題**: MIR実装が35命令に膨張(ChatGPT5仕様26命令から75%超過)
|
||||
**Gemini評価**: 削減戦略「極めて健全」「断行推奨」「不可欠なステップ」
|
||||
|
||||
## 🎯 **Issue概要**
|
||||
|
||||
### **技術的負債の深刻化**
|
||||
- **実装**: 35命令(175%膨張)
|
||||
- **設計**: 26命令(ChatGPT5 + AI大会議決定版)
|
||||
- **リスク**: バックエンド実装困難・最適化爆発・保守性悪化
|
||||
|
||||
### **削減の必要性**
|
||||
1. **バックエンド負荷**: 各バックエンドで35命令対応が重すぎ
|
||||
2. **最適化複雑化**: 命令数に比例して最適化ルール爆発
|
||||
3. **テスト困難**: 組み合わせ爆発でテストケース管理不能
|
||||
4. **長期保守**: 新機能追加時の影響範囲予測困難
|
||||
|
||||
## 📋 **削減対象命令分析**
|
||||
|
||||
### **削除対象: 17命令**
|
||||
|
||||
#### **1. BinOp統合 (1命令)**
|
||||
- `UnaryOp` → `BinOp`統合(not %a → %a xor true)
|
||||
|
||||
#### **2. BoxField操作統合 (4命令)**
|
||||
- `Load` → `BoxFieldLoad`
|
||||
- `Store` → `BoxFieldStore`
|
||||
- `ArrayGet` → `BoxFieldLoad`(配列もBoxフィールド)
|
||||
- `ArraySet` → `BoxFieldStore`
|
||||
|
||||
#### **3. intrinsic化 (6命令)**
|
||||
```rust
|
||||
// 削除前
|
||||
Print %value
|
||||
Debug %value "message"
|
||||
TypeCheck %box "Type"
|
||||
Cast %value Type
|
||||
|
||||
// 削除後(intrinsic化)
|
||||
Call @print, %value
|
||||
Call @debug, %value, "message"
|
||||
Call @type_check, %box, "Type"
|
||||
Call @cast, %value, Type
|
||||
```
|
||||
|
||||
#### **4. 完全削除 (4命令)**
|
||||
- `Copy` → 最適化パス専用(MIRから除外)
|
||||
- `Nop` → 不要命令削除
|
||||
- `Throw/Catch` → Call経由例外処理
|
||||
|
||||
#### **5. 統合・置換 (2命令)**
|
||||
- `RefNew` → 削除(RefGetで代用)
|
||||
- `BarrierRead/BarrierWrite` → `AtomicFence`統合
|
||||
- `FutureNew/FutureSet/Await` → `NewBox + BoxCall`実装
|
||||
|
||||
### **新規追加: 10命令**
|
||||
|
||||
#### **Box操作明示化**
|
||||
- `BoxFieldLoad/BoxFieldStore` → Everything is Box核心
|
||||
- `Adopt/Release` → 所有権移管の明示
|
||||
|
||||
#### **弱参照完全対応**
|
||||
- `WeakCheck` → 生存確認の明示
|
||||
- `Send/Recv` → Bus操作一次市民化
|
||||
|
||||
#### **最適化基盤**
|
||||
- `TailCall, MemCopy, AtomicFence` → JIT/AOT準備
|
||||
|
||||
## 🗓️ **5段階実装計画**
|
||||
|
||||
### **Phase 1: 共存実装 (1週間)**
|
||||
**担当**: Copilot + Claude協調
|
||||
**期間**: 2025年8月18日-24日
|
||||
|
||||
#### **実装範囲**
|
||||
- [ ] 新旧命令両対応MIRパーサー
|
||||
- [ ] `BoxFieldLoad/BoxFieldStore`新命令追加
|
||||
- [ ] `WeakCheck/Send/Recv`新命令追加
|
||||
- [ ] `TailCall/Adopt/Release/MemCopy/AtomicFence`新命令追加
|
||||
- [ ] 既存命令保持での互換性確保
|
||||
|
||||
#### **技術的詳細**
|
||||
```rust
|
||||
// src/mir/instruction.rs 拡張
|
||||
pub enum MirInstruction {
|
||||
// 既存命令(保持)
|
||||
Load { .. },
|
||||
Store { .. },
|
||||
|
||||
// 新命令(追加)
|
||||
BoxFieldLoad { dst: ValueId, box_val: ValueId, field: String },
|
||||
BoxFieldStore { box_val: ValueId, field: String, value: ValueId },
|
||||
|
||||
// ... 他新命令
|
||||
}
|
||||
```
|
||||
|
||||
### **Phase 2: フロントエンド移行 (1週間)**
|
||||
**期間**: 2025年8月25日-31日
|
||||
|
||||
#### **実装範囲**
|
||||
- [ ] AST→MIR生成を新形式のみに変更
|
||||
- [ ] `Load/Store`生成停止、`BoxFieldLoad/BoxFieldStore`生成開始
|
||||
- [ ] intrinsic化対象を`Call @intrinsic_name`形式で生成
|
||||
- [ ] 配列操作の`BoxField`表現実装
|
||||
|
||||
#### **検証項目**
|
||||
- [ ] 全Nyashプログラムが新MIRで実行可能
|
||||
- [ ] Golden MIRテスト準備完了
|
||||
|
||||
### **Phase 3: 最適化パス移行 (1週間)**
|
||||
**期間**: 2025年9月1日-7日
|
||||
|
||||
#### **実装範囲**
|
||||
- [ ] 全最適化パスを新命令対応に修正
|
||||
- [ ] Effect分類の正確な実装(pure/mut/io/control)
|
||||
- [ ] 所有権森検証ルール実装
|
||||
- [ ] `BoxFieldLoad/BoxFieldStore`最適化パス
|
||||
|
||||
#### **Effect System実装**
|
||||
```rust
|
||||
// Pure命令の再順序化
|
||||
fn optimize_pure_reordering(mir: &mut MirModule) {
|
||||
// BoxFieldLoad, WeakLoad等の安全な再順序化
|
||||
}
|
||||
|
||||
// Mut命令の依存解析
|
||||
fn analyze_mut_dependencies(mir: &MirModule) -> DependencyGraph {
|
||||
// BoxFieldStore間の依存関係解析
|
||||
}
|
||||
```
|
||||
|
||||
### **Phase 4: バックエンド移行 (1週間)**
|
||||
**期間**: 2025年9月8日-14日
|
||||
|
||||
#### **実装範囲**
|
||||
- [ ] Interpreter新命令対応
|
||||
- [ ] VM新命令対応(レジスタベース最適化)
|
||||
- [ ] WASM新命令対応(memory操作最適化)
|
||||
- [ ] intrinsic関数実装(@print, @debug, @type_check等)
|
||||
|
||||
#### **intrinsic実装例**
|
||||
```rust
|
||||
// Interpreterでのintrinsic実装
|
||||
fn execute_intrinsic_call(&mut self, name: &str, args: &[Value]) -> Result<Value> {
|
||||
match name {
|
||||
"@print" => {
|
||||
println!("{}", args[0]);
|
||||
Ok(Value::Void)
|
||||
},
|
||||
"@array_get" => {
|
||||
let array = &args[0];
|
||||
let index = args[1].as_integer();
|
||||
Ok(array.get_element(index))
|
||||
},
|
||||
// ... 他intrinsic
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
### **Phase 5: 旧命令削除・クリーンアップ (1週間)**
|
||||
**期間**: 2025年9月15日-21日
|
||||
|
||||
#### **実装範囲**
|
||||
- [ ] 削除対象17命令の完全除去
|
||||
- [ ] 関連コードの完全削除(パーサー・最適化・バックエンド)
|
||||
- [ ] テストスイート更新
|
||||
- [ ] ドキュメント更新・整備
|
||||
|
||||
#### **クリーンアップ項目**
|
||||
- [ ] `UnaryOp, Load, Store, Print, Debug`等の完全削除
|
||||
- [ ] 関連するテストケース更新
|
||||
- [ ] エラーメッセージ更新
|
||||
- [ ] APIドキュメント更新
|
||||
|
||||
## 🧪 **検証・品質保証**
|
||||
|
||||
### **Golden MIR テスト**
|
||||
```bash
|
||||
# 全バックエンドMIR一致確認
|
||||
./scripts/test_golden_mir_26.sh
|
||||
```
|
||||
|
||||
### **所有権森検証**
|
||||
```rust
|
||||
// 自動検証システム
|
||||
fn verify_ownership_forest_constraints(mir: &MirModule) -> Result<(), VerifyError> {
|
||||
// strong in-degree ≤ 1
|
||||
// DAG構造(強循環禁止)
|
||||
// WeakLoad/WeakCheck決定的挙動
|
||||
}
|
||||
```
|
||||
|
||||
### **回帰テスト**
|
||||
- [ ] 全実用アプリケーション動作確認
|
||||
- [ ] 性能劣化チェック(ベンチマーク実行)
|
||||
- [ ] メモリ使用量確認
|
||||
|
||||
## 📊 **成功基準**
|
||||
|
||||
### **必須基準(Phase 5完了時)**
|
||||
- [ ] **26命令完全実装**: ChatGPT5仕様100%準拠
|
||||
- [ ] **機能完全性**: 既存Nyashプログラム100%動作
|
||||
- [ ] **性能維持**: 削減前と同等以上の性能
|
||||
- [ ] **Golden MIRテスト**: 全バックエンドMIR一致
|
||||
- [ ] **所有権森検証**: 強参照森・weak参照安全性保証
|
||||
|
||||
### **理想基準(追加価値)**
|
||||
- [ ] **最適化効果**: pure再順序化・CSE/LICM動作確認
|
||||
- [ ] **メモリ効率**: Adopt/Releaseによる効率的メモリ管理
|
||||
- [ ] **コード品質**: 複雑性大幅削減・保守性向上
|
||||
|
||||
## 🚨 **リスク管理**
|
||||
|
||||
### **高リスク要因**
|
||||
1. **大規模リファクタリング**: 全コンポーネント影響
|
||||
2. **互換性破綻**: 既存プログラム動作不良
|
||||
3. **性能劣化**: 最適化ロジック変更による影響
|
||||
4. **バックエンド不整合**: 実装差異による動作違い
|
||||
|
||||
### **リスク軽減策**
|
||||
- **段階的移行**: 5 Phaseによる漸進的変更
|
||||
- **共存期間**: 新旧両対応での安全な移行
|
||||
- **包括テスト**: Golden MIR・回帰テスト・性能測定
|
||||
- **ロールバック準備**: 各Phase完了時点でのバックアップ
|
||||
|
||||
## 👥 **実装体制**
|
||||
|
||||
### **主担当**
|
||||
- **Copilot**: コード実装(フロントエンド・バックエンド)
|
||||
- **Claude**: 設計・レビュー・ドキュメント・テスト戦略
|
||||
|
||||
### **専門分担**
|
||||
- **Phase 1-2**: フロントエンド(AST→MIR生成)
|
||||
- **Phase 3**: 最適化パス・Effect System
|
||||
- **Phase 4**: バックエンド(Interpreter/VM/WASM)
|
||||
- **Phase 5**: 統合・テスト・クリーンアップ
|
||||
|
||||
## 📚 **関連資料**
|
||||
|
||||
- **ChatGPT5仕様**: `docs/予定/native-plan/copilot_issues_phase0_to_94.txt`
|
||||
- **26命令詳細**: `docs/説明書/mir-26-specification.md`
|
||||
- **Gemini分析**: 「極めて健全」「断行推奨」評価レポート
|
||||
|
||||
---
|
||||
|
||||
**Issue作成**: 2025年8月17日
|
||||
**想定完了**: 2025年9月21日(5週間)
|
||||
**優先度**: Critical(他全作業に優先)
|
||||
262
docs/説明書/mir-26-specification.md
Normal file
262
docs/説明書/mir-26-specification.md
Normal file
@ -0,0 +1,262 @@
|
||||
# 🤖 Nyash MIR 26命令仕様書 (ChatGPT5設計版)
|
||||
|
||||
*Everything is Box哲学・完璧なIR化実現 - 2025年8月17日版*
|
||||
|
||||
## 🎯 **概要**
|
||||
|
||||
Nyash MIR 26命令は、ChatGPT5 + AI大会議により設計された、「化け物に伸びる余白」と「実装の現実」の最適バランスを実現する中間表現です。
|
||||
|
||||
### **🌟 設計思想**
|
||||
- **RISC原則**: 直交性・シンプル性重視
|
||||
- **階層化設計**: Tier-0/1/2による段階的実装
|
||||
- **Everything is Box**: Box中心のセマンティクス
|
||||
- **Effect System**: 最適化安全性の確保
|
||||
- **所有権森**: メモリ安全性の言語レベル保証
|
||||
|
||||
## 🏗️ **26命令完全仕様**
|
||||
|
||||
### **Tier-0: 普遍的コア (8命令)**
|
||||
コンパイラ・仮想マシンの基盤となる必須命令
|
||||
|
||||
| 命令 | 形式 | 効果 | 説明 |
|
||||
|------|------|------|------|
|
||||
| **Const** | `%dst = const value` | pure | 定数値生成 |
|
||||
| **BinOp** | `%dst = %lhs op %rhs` | pure | 二項演算(+,-,*,/,==,!=,<,>,and,or等) |
|
||||
| **Compare** | `%dst = %lhs cmp %rhs` | pure | 比較演算(専用最適化用) |
|
||||
| **Branch** | `br %cond -> %then, %else` | control | 条件分岐 |
|
||||
| **Jump** | `jmp %target` | control | 無条件ジャンプ |
|
||||
| **Phi** | `%dst = phi [%val1:%bb1, %val2:%bb2]` | pure | SSA φ関数 |
|
||||
| **Call** | `%dst = call %func(%args...)` | context | 関数呼び出し |
|
||||
| **Return** | `ret %value?` | control | 関数戻り |
|
||||
|
||||
### **Tier-1: Nyashセマンティクス (13命令)**
|
||||
Everything is Box哲学の核心実装
|
||||
|
||||
| 命令 | 形式 | 効果 | 説明 |
|
||||
|------|------|------|------|
|
||||
| **NewBox** | `%dst = new_box "Type"(%args...)` | mut | 強所有Box生成(所有森ノード) |
|
||||
| **BoxFieldLoad** | `%dst = %box.field` | pure | Boxフィールド読み取り |
|
||||
| **BoxFieldStore** | `%box.field = %value` | mut | Boxフィールド書き込み |
|
||||
| **BoxCall** | `%dst = %box.method(%args...)` | context | Boxメソッド呼び出し |
|
||||
| **ExternCall** | `%dst = extern %iface.method(%args...)` | context | 外部ライブラリ呼び出し |
|
||||
| **Safepoint** | `safepoint` | io | 分割fini・割込み許可ポイント |
|
||||
| **RefGet** | `%dst = ref_get %ref` | pure | 参照から値取得 |
|
||||
| **RefSet** | `ref_set %ref = %value` | mut | 参照先差し替え(所有規則検証付き) |
|
||||
| **WeakNew** | `%dst = weak_new %box` | pure | weak参照生成 |
|
||||
| **WeakLoad** | `%dst = weak_load %weak` | pure | weak参照から値取得(失効時null) |
|
||||
| **WeakCheck** | `%dst = weak_check %weak` | pure | weak参照生存確認 |
|
||||
| **Send** | `send %data -> %target` | io | Bus送信 |
|
||||
| **Recv** | `%dst = recv %source` | io | Bus受信 |
|
||||
|
||||
### **Tier-2: 実装補助・最適化友好 (5命令)**
|
||||
JIT/AOT最適化の基盤
|
||||
|
||||
| 命令 | 形式 | 効果 | 説明 |
|
||||
|------|------|------|------|
|
||||
| **TailCall** | `tail_call %func(%args...)` | control | 末尾呼び出し最適化 |
|
||||
| **Adopt** | `adopt %parent <- %child` | mut | 所有権移管(親が子を取り込み) |
|
||||
| **Release** | `release %ref` | mut | 強所有解除(weak化/null化) |
|
||||
| **MemCopy** | `memcopy %dst <- %src, %size` | mut | 小規模メモリ移動最適化 |
|
||||
| **AtomicFence** | `atomic_fence %ordering` | io | 並行時順序保証 |
|
||||
|
||||
## 🎭 **Effect System - 最適化基盤**
|
||||
|
||||
### **効果分類と最適化ルール**
|
||||
|
||||
#### **Pure効果 (8命令)**
|
||||
```
|
||||
Const, BinOp, Compare, Phi, BoxFieldLoad, RefGet, WeakNew, WeakLoad, WeakCheck
|
||||
```
|
||||
- ✅ **再順序化可能**: 副作用なし
|
||||
- ✅ **共通部分式除去**: 同一計算結果再利用
|
||||
- ✅ **不変コード移動**: ループ外移動可能
|
||||
|
||||
#### **Mut効果 (5命令)**
|
||||
```
|
||||
NewBox, BoxFieldStore, RefSet, Adopt, Release, MemCopy
|
||||
```
|
||||
- ⚠️ **同一リソース順序保持**: 同じBox/同じFieldで依存関係維持
|
||||
- ✅ **異なるリソース並列化**: 別Box操作は並列実行可能
|
||||
|
||||
#### **Io効果 (4命令)**
|
||||
```
|
||||
Safepoint, Send, Recv, AtomicFence
|
||||
```
|
||||
- 🔒 **順序保持必須**: プログラム順序で実行
|
||||
- ❌ **再順序化禁止**: 副作用の整合性確保
|
||||
|
||||
#### **Control効果 (4命令)**
|
||||
```
|
||||
Branch, Jump, Return, TailCall
|
||||
```
|
||||
- 🌊 **制御フロー変更**: 基本ブロック境界制御
|
||||
- 📊 **静的解析対象**: CFG構築・到達可能性解析
|
||||
|
||||
#### **Context依存効果 (3命令)**
|
||||
```
|
||||
Call, BoxCall, ExternCall
|
||||
```
|
||||
- 🔄 **呼び出し先依存**: 関数・メソッドの効果を継承
|
||||
- 📝 **BID/型情報**: ExternCallはBID仕様から効果決定
|
||||
|
||||
## 🔧 **所有権森システム**
|
||||
|
||||
### **強参照森 (Ownership Forest)**
|
||||
```rust
|
||||
// 基本原則: strong in-degree ≤ 1
|
||||
%parent = NewBox "Parent"()
|
||||
%child = NewBox "Child"()
|
||||
Adopt %parent <- %child // 子を親の強所有に移管
|
||||
```
|
||||
|
||||
#### **検証ルール**
|
||||
- ✅ **DAG構造保証**: 強参照による循環禁止
|
||||
- ✅ **単一所有**: 各Boxは最大1つの強参照のみ
|
||||
- ✅ **所有移管**: Adopt/Releaseによる安全な移転
|
||||
|
||||
### **weak参照システム**
|
||||
```rust
|
||||
%weak = WeakNew %box // weak参照生成
|
||||
%alive = WeakCheck %weak // 生存確認 (bool)
|
||||
%value = WeakLoad %weak // 値取得 (失効時null)
|
||||
```
|
||||
|
||||
#### **決定的挙動**
|
||||
- 🎯 **失効時null**: WeakLoadは例外なしでnull返却
|
||||
- 🎯 **失効時false**: WeakCheckは例外なしでfalse返却
|
||||
- 🔒 **所有権なし**: weakは削除を阻止しない
|
||||
|
||||
## 🚀 **削減戦略 - 35命令からの移行**
|
||||
|
||||
### **削除対象命令 (17命令)**
|
||||
|
||||
#### **BinOpに統合**
|
||||
- `UnaryOp` → `BinOp`(not %a → %a xor true)
|
||||
|
||||
#### **BoxField操作に統合**
|
||||
- `Load/Store` → `BoxFieldLoad/BoxFieldStore`
|
||||
- `ArrayGet/ArraySet` → `BoxFieldLoad/BoxFieldStore`(配列もBoxのフィールド)
|
||||
|
||||
#### **intrinsic化**
|
||||
```rust
|
||||
// 削除前
|
||||
Print %value
|
||||
Debug %value "message"
|
||||
|
||||
// 削除後(intrinsic化)
|
||||
Call @print, %value
|
||||
Call @debug, %value, "message"
|
||||
```
|
||||
|
||||
#### **完全削除**
|
||||
- `Copy, Nop` → 最適化パス専用(MIRから除外)
|
||||
- `TypeCheck, Cast` → 型システム・最適化で処理
|
||||
- `Throw/Catch` → Call経由例外ハンドリング
|
||||
|
||||
#### **統合・置換**
|
||||
- `RefNew` → 削除(RefGetで代用)
|
||||
- `BarrierRead/BarrierWrite` → `AtomicFence`統合
|
||||
- `FutureNew/FutureSet/Await` → `NewBox + BoxCall`実装
|
||||
|
||||
### **新規追加命令 (10命令)**
|
||||
|
||||
#### **Box操作の明示化**
|
||||
- `BoxFieldLoad/BoxFieldStore` → Everything is Box核心
|
||||
- `Adopt/Release` → 所有権移管の明示
|
||||
|
||||
#### **弱参照完全対応**
|
||||
- `WeakCheck` → 生存確認の明示
|
||||
- `Send/Recv` → Bus操作の一次市民化
|
||||
|
||||
#### **最適化基盤**
|
||||
- `TailCall, MemCopy, AtomicFence` → JIT/AOT準備
|
||||
|
||||
## 📊 **段階的移行戦略**
|
||||
|
||||
### **Phase 1: 共存実装 (1週間)**
|
||||
- 新旧命令両対応のMIRパーサー実装
|
||||
- `BoxFieldLoad/BoxFieldStore`等の新命令追加
|
||||
- 既存命令は保持したまま新形式も受け入れ
|
||||
|
||||
### **Phase 2: フロントエンド移行 (1週間)**
|
||||
- AST→MIR生成を新形式のみに変更
|
||||
- `Load/Store`の代わりに`BoxFieldLoad/BoxFieldStore`生成
|
||||
- intrinsic化対象は`Call @intrinsic_name`形式で生成
|
||||
|
||||
### **Phase 3: 最適化パス移行 (1週間)**
|
||||
- 全最適化パスを新命令対応に修正
|
||||
- Effect分類の正確な実装
|
||||
- 所有権森検証ルール実装
|
||||
|
||||
### **Phase 4: バックエンド移行 (1週間)**
|
||||
- Interpreter/VM/WASMの新命令対応
|
||||
- intrinsic関数の実装(@print, @debug等)
|
||||
- 削除予定命令の段階的無効化
|
||||
|
||||
### **Phase 5: 旧命令削除 (1週間)**
|
||||
- 削除対象17命令の完全除去
|
||||
- テストスイート更新
|
||||
- ドキュメント整備
|
||||
|
||||
## 🧪 **検証・テスト戦略**
|
||||
|
||||
### **Golden MIR テスト**
|
||||
```bash
|
||||
# 全バックエンドでMIR出力一致確認
|
||||
./target/release/nyash --dump-mir-26 program.nyash > golden.mir
|
||||
./target/release/nyash --backend vm --dump-mir-26 program.nyash > vm.mir
|
||||
./target/release/nyash --backend wasm --dump-mir-26 program.nyash > wasm.mir
|
||||
diff golden.mir vm.mir && diff vm.mir wasm.mir
|
||||
```
|
||||
|
||||
### **所有権森検証**
|
||||
```rust
|
||||
// 検証項目
|
||||
fn verify_ownership_forest(mir: &MirModule) -> Result<(), VerifyError> {
|
||||
// 1. strong in-degree ≤ 1
|
||||
verify_strong_indegree_constraint()?;
|
||||
// 2. 強循環禁止(DAG構造)
|
||||
verify_no_strong_cycles()?;
|
||||
// 3. WeakLoad/WeakCheck決定的挙動
|
||||
verify_weak_determinism()?;
|
||||
}
|
||||
```
|
||||
|
||||
### **Effect System検証**
|
||||
```rust
|
||||
// 最適化安全性確認
|
||||
fn verify_effect_system(mir: &MirModule) -> Result<(), VerifyError> {
|
||||
// Pure命令の再順序化安全性
|
||||
verify_pure_reordering_safety()?;
|
||||
// Mut命令の依存関係保持
|
||||
verify_mut_dependency_preservation()?;
|
||||
// Io命令の順序保証
|
||||
verify_io_order_preservation()?;
|
||||
}
|
||||
```
|
||||
|
||||
## 🎯 **成功基準**
|
||||
|
||||
### **必須基準**
|
||||
- [ ] **26命令完全実装**: 全命令が仕様通り動作
|
||||
- [ ] **Effect System動作**: 4種効果の正確な分類・最適化
|
||||
- [ ] **所有権森検証**: 強参照森・weak参照の安全性保証
|
||||
- [ ] **Golden MIRテスト**: 全バックエンドでMIR一致
|
||||
- [ ] **性能維持**: 削減後も性能劣化なし
|
||||
|
||||
### **理想基準**
|
||||
- [ ] **最適化効果実証**: pure再順序化・CSE/LICM動作確認
|
||||
- [ ] **所有権森活用**: Adopt/Releaseによる効率的メモリ管理
|
||||
- [ ] **JIT準備完了**: TailCall/MemCopyの最適化基盤確立
|
||||
|
||||
## 📚 **関連ドキュメント**
|
||||
|
||||
- **ChatGPT5仕様**: `docs/予定/native-plan/copilot_issues_phase0_to_94.txt`
|
||||
- **実装移行計画**: `docs/予定/native-plan/issues/phase_8_5_mir_35_to_26_reduction.md`
|
||||
- **Effect System詳細**: `docs/nyir/effect-system-specification.md`
|
||||
|
||||
---
|
||||
|
||||
**策定**: ChatGPT5 + AI大会議
|
||||
**Gemini評価**: 「極めて健全」「断行推奨」
|
||||
**実装目標**: 2025年9月完了予定
|
||||
235
docs/説明書/mir-unified-reference.md
Normal file
235
docs/説明書/mir-unified-reference.md
Normal file
@ -0,0 +1,235 @@
|
||||
# 🤖 Nyash MIR (Mid-level Intermediate Representation) - 統合リファレンス
|
||||
|
||||
*26命令削減実装中・ChatGPT5仕様準拠 - 2025年8月17日版*
|
||||
|
||||
## 🚨 **重要: MIR命令削減プロジェクト進行中**
|
||||
|
||||
**現状**: 35命令実装(175%膨張)→ **目標**: 26命令(ChatGPT5仕様)
|
||||
**Gemini評価**: 削減戦略「極めて健全」「断行推奨」
|
||||
|
||||
## 🎯 **MIR概要**
|
||||
|
||||
Nyash MIRは、Everything is Box哲学を基盤とした中間表現です。現在35命令が実装され、インタープリター・VM・WASM・AOTの全バックエンドで統一された実行を実現します。
|
||||
|
||||
### **🌟 主要特徴**
|
||||
- **Everything is Box**: 全データがBoxオブジェクトとして統一表現
|
||||
- **Effect System**: pure/mut/io/control効果による最適化基盤
|
||||
- **所有権管理**: 強参照森(ownership forest)+ weak参照システム
|
||||
- **非同期対応**: Future/Bus操作の言語レベル統合
|
||||
- **FFI/ABI統合**: ExternCall命令による外部API統一呼び出し
|
||||
|
||||
## 🏗️ **命令分類 - 35命令全体系**
|
||||
|
||||
### **Tier-0: コア演算 (8命令)**
|
||||
基本的な計算・制御フロー命令
|
||||
|
||||
| 命令 | 形式 | 効果 | 説明 |
|
||||
|------|------|------|------|
|
||||
| `Const` | `%dst = const value` | pure | 定数値生成 |
|
||||
| `BinOp` | `%dst = %lhs op %rhs` | pure | 二項演算(+,-,*,/等) |
|
||||
| `UnaryOp` | `%dst = op %operand` | pure | 単項演算(not, neg等) |
|
||||
| `Compare` | `%dst = %lhs cmp %rhs` | pure | 比較演算(==, !=, <等) |
|
||||
| `Branch` | `br %cond -> %then, %else` | control | 条件分岐 |
|
||||
| `Jump` | `jmp %target` | control | 無条件ジャンプ |
|
||||
| `Return` | `ret %value?` | control | 関数戻り |
|
||||
| `Phi` | `%dst = phi [%val1:%bb1, %val2:%bb2]` | pure | SSA φ関数 |
|
||||
|
||||
### **Tier-1: メモリ・関数操作 (8命令)**
|
||||
メモリアクセス・関数呼び出し・型操作
|
||||
|
||||
| 命令 | 形式 | 効果 | 説明 |
|
||||
|------|------|------|------|
|
||||
| `Load` | `%dst = load %ptr` | pure | メモリ読み取り |
|
||||
| `Store` | `store %value -> %ptr` | mut | メモリ書き込み |
|
||||
| `Call` | `%dst = call %func(%args...)` | context | 関数呼び出し |
|
||||
| `BoxCall` | `%dst = %box.method(%args...)` | context | Boxメソッド呼び出し |
|
||||
| `NewBox` | `%dst = new_box "Type"(%args...)` | mut | Box生成 |
|
||||
| `TypeCheck` | `%dst = type_check %box "Type"` | pure | 型チェック |
|
||||
| `Cast` | `%dst = cast %value as Type` | pure | 型変換 |
|
||||
| `Copy` | `%dst = copy %src` | pure | 値コピー |
|
||||
|
||||
### **Tier-2: 配列・デバッグ・制御 (7命令)**
|
||||
配列操作・デバッグ・例外処理
|
||||
|
||||
| 命令 | 形式 | 効果 | 説明 |
|
||||
|------|------|------|------|
|
||||
| `ArrayGet` | `%dst = %array[%index]` | pure | 配列要素取得 |
|
||||
| `ArraySet` | `%array[%index] = %value` | mut | 配列要素設定 |
|
||||
| `Debug` | `debug %value "message"` | io | デバッグ出力 |
|
||||
| `Print` | `print %value` | io | コンソール出力 |
|
||||
| `Nop` | `nop` | pure | 無操作 |
|
||||
| `Throw` | `throw %exception` | control | 例外発生 |
|
||||
| `Catch` | `catch %type -> %handler` | control | 例外捕捉 |
|
||||
|
||||
### **Tier-3: 参照・非同期・外部API (12命令)**
|
||||
所有権管理・非同期処理・外部連携
|
||||
|
||||
| 命令 | 形式 | 効果 | 説明 |
|
||||
|------|------|------|------|
|
||||
| `Safepoint` | `safepoint` | io | セーフポイント |
|
||||
| `RefNew` | `%dst = ref_new %box` | pure | 参照生成 |
|
||||
| `RefGet` | `%dst = ref_get %ref.field` | pure | 参照経由読み取り |
|
||||
| `RefSet` | `ref_set %ref.field = %value` | mut | 参照経由書き込み |
|
||||
| `WeakNew` | `%dst = weak_new %box` | pure | weak参照生成 |
|
||||
| `WeakLoad` | `%dst = weak_load %weak_ref` | pure | weak参照読み取り |
|
||||
| `BarrierRead` | `barrier_read %ptr` | io | メモリバリア読み |
|
||||
| `BarrierWrite` | `barrier_write %ptr` | io | メモリバリア書き |
|
||||
| `FutureNew` | `%dst = future_new %value` | mut | Future生成 |
|
||||
| `FutureSet` | `future_set %future = %value` | mut | Future値設定 |
|
||||
| `Await` | `%dst = await %future` | io | Future待機 |
|
||||
| `ExternCall` | `%dst = extern_call iface.method(%args...)` | context | 外部API呼び出し |
|
||||
|
||||
## 🎭 **Effect System - 4種類の効果**
|
||||
|
||||
### **効果分類と最適化ルール**
|
||||
|
||||
```rust
|
||||
pub enum Effect {
|
||||
Pure, // 再順序化可能、共通部分式除去可能
|
||||
Mut, // 同一リソースで順序保持必要
|
||||
Io, // 全順序保持必要(副作用あり)
|
||||
Control, // 制御フロー変更
|
||||
}
|
||||
```
|
||||
|
||||
### **効果別命令分類**
|
||||
|
||||
#### **Pure命令 (15命令)**
|
||||
```
|
||||
Const, BinOp, UnaryOp, Compare, Phi, Load, TypeCheck, Cast, Copy,
|
||||
ArrayGet, Nop, RefNew, RefGet, WeakNew, WeakLoad
|
||||
```
|
||||
|
||||
#### **Mut命令 (7命令)**
|
||||
```
|
||||
Store, NewBox, ArraySet, RefSet, FutureNew, FutureSet
|
||||
```
|
||||
|
||||
#### **Io命令 (6命令)**
|
||||
```
|
||||
Debug, Print, Safepoint, BarrierRead, BarrierWrite, Await
|
||||
```
|
||||
|
||||
#### **Control命令 (4命令)**
|
||||
```
|
||||
Branch, Jump, Return, Throw, Catch
|
||||
```
|
||||
|
||||
#### **Context依存命令 (3命令)**
|
||||
```
|
||||
Call, BoxCall, ExternCall
|
||||
```
|
||||
*効果は呼び出し先に依存*
|
||||
|
||||
## 🔧 **重要なMIR実装詳細**
|
||||
|
||||
### **ExternCall命令 - FFI/ABI統合**
|
||||
|
||||
```rust
|
||||
ExternCall {
|
||||
dst: Option<ValueId>,
|
||||
iface_name: String, // "env.console", "nyash.math"等
|
||||
method_name: String, // "log", "sqrt"等
|
||||
args: Vec<ValueId>,
|
||||
effects: EffectMask, // BID仕様から決定
|
||||
}
|
||||
```
|
||||
|
||||
**用途**: ブラウザーAPI・ネイティブライブラリ・プラグインの統一呼び出し
|
||||
|
||||
### **所有権管理システム**
|
||||
|
||||
#### **強参照森(Ownership Forest)**
|
||||
- 各Boxは最大1つの強参照を持つ(in-degree ≤ 1)
|
||||
- 強参照による循環は禁止(DAG構造保証)
|
||||
- `NewBox`, `RefSet`で所有権移転
|
||||
|
||||
#### **weak参照システム**
|
||||
- 所有権を持たない軽量参照
|
||||
- `WeakNew`で生成、`WeakLoad`で安全アクセス
|
||||
- 参照先削除時は自動的にnull化
|
||||
|
||||
### **非同期処理 - Future操作**
|
||||
|
||||
```mir
|
||||
%future = FutureNew %initial_value // Future生成
|
||||
FutureSet %future = %result // 結果設定
|
||||
%value = Await %future // 結果取得(ブロッキング)
|
||||
```
|
||||
|
||||
## 🚀 **バックエンド別対応状況**
|
||||
|
||||
### **実装済みバックエンド**
|
||||
|
||||
| バックエンド | 対応命令数 | 主要用途 | 特徴 |
|
||||
|-------------|-----------|----------|------|
|
||||
| **Interpreter** | 35/35 | デバッグ・開発 | 全命令完全対応 |
|
||||
| **VM** | 35/35 | 高速実行 | レジスタベース |
|
||||
| **WASM** | 30/35 | Web配布 | ExternCall→import対応 |
|
||||
| **AOT準備** | 計画中 | ネイティブ | LLVM IR生成予定 |
|
||||
|
||||
### **バックエンド固有の最適化**
|
||||
|
||||
#### **VM バックエンド**
|
||||
- レジスタベース実行
|
||||
- 局所最適化(ローカルBus elision)
|
||||
- 直接スレッド化
|
||||
|
||||
#### **WASM バックエンド**
|
||||
- メモリ線形化(文字列は (ptr,len))
|
||||
- ExternCall → import宣言自動生成
|
||||
- ホスト側JavaScript連携
|
||||
|
||||
## 📊 **MIR最適化パス**
|
||||
|
||||
### **Pure命令最適化**
|
||||
- **共通部分式除去 (CSE)**: 同一pure計算の除去
|
||||
- **不変コード移動 (LICM)**: ループ外移動
|
||||
- **定数畳み込み**: コンパイル時計算
|
||||
|
||||
### **Effect-aware最適化**
|
||||
- **Mut順序保持**: 同一リソースアクセス順序維持
|
||||
- **Io順序保持**: 全Io命令の順序保証
|
||||
- **Bus elision**: ローカル通信の直接アクセス化
|
||||
|
||||
## 🧪 **テスト・検証**
|
||||
|
||||
### **MIR検証項目**
|
||||
- [ ] **所有権森検証**: strong in-degree ≤ 1
|
||||
- [ ] **強循環禁止**: 強参照のDAG構造保証
|
||||
- [ ] **weak参照安全性**: 失効時null化
|
||||
- [ ] **効果注釈正確性**: 各命令の効果分類
|
||||
- [ ] **型安全性**: Box型システム整合性
|
||||
|
||||
### **バックエンド互換性テスト**
|
||||
```bash
|
||||
# 全バックエンドMIR一致テスト
|
||||
./target/release/nyash --dump-mir program.nyash > interpreter.mir
|
||||
./target/release/nyash --backend vm --dump-mir program.nyash > vm.mir
|
||||
./target/release/nyash --backend wasm --dump-mir program.nyash > wasm.mir
|
||||
diff interpreter.mir vm.mir && diff vm.mir wasm.mir
|
||||
```
|
||||
|
||||
## 🔮 **将来計画**
|
||||
|
||||
### **Phase 10: AOT/JIT対応**
|
||||
- LLVM IR生成バックエンド
|
||||
- ExternCall → ネイティブ関数呼び出し
|
||||
- 高度な最適化パス統合
|
||||
|
||||
### **Phase 11: MIR v2設計**
|
||||
- 命令数最適化(35 → 25命令目標)
|
||||
- BID統合(Box Interface Definition)
|
||||
- リソース所有権拡張(own<T>, borrow<T>)
|
||||
|
||||
## 📚 **関連ドキュメント**
|
||||
|
||||
- **FFI/ABI仕様**: `docs/説明書/reference/box-design/ffi-abi-specification.md`
|
||||
- **実装詳細**: `src/mir/instruction.rs`
|
||||
- **Phase計画**: `docs/予定/native-plan/copilot_issues.txt`
|
||||
|
||||
---
|
||||
|
||||
**最終更新**: 2025年8月17日
|
||||
**実装ベース**: 35命令完全対応
|
||||
**次期計画**: BID統合プラグインシステム(Phase 9.75f-BID)
|
||||
Reference in New Issue
Block a user