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:
Moe Charm
2025-08-17 13:49:35 +09:00
parent bb3f2e8032
commit 3df87fb1ce
41 changed files with 4444 additions and 68 deletions

View 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日

View 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他全作業に優先

View 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月完了予定

View 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配布 | ExternCallimport対応 |
| **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