Files
hakorune/docs/予定/native-plan/issues/mir_reduction_detailed_analysis.md
Moe Charm 3df87fb1ce 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>
2025-08-17 13:49:35 +09:00

11 KiB

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
neg %a0 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 %valcall @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 Typecall @cast, %val, Type
Throw @throw throw %exccall @throw, %exc
Catch @catch catch Type -> %bbcall @catch, Type, %bb

グループ4: 完全削除 (3命令)

削除命令 削除理由 代替方法
Copy 最適化パス専用 最適化段階でのみ使用
Nop 不要 削除(プレースホルダー不要)
RefNew 冗長 RefGetで代用可能

グループ5: 統合・置換 (3命令)

削除命令 統合先 実装例
BarrierRead AtomicFence barrier_read %ptratomic_fence acquire
BarrierWrite AtomicFence barrier_write %ptratomic_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実装

// src/mir/instruction.rs
pub enum MirInstruction {
    // 新規追加
    BoxFieldLoad {
        dst: ValueId,
        box_val: ValueId,
        field: String,
    },
    BoxFieldStore {
        box_val: ValueId,
        field: String,
        value: ValueId,
    },
    // ...
}

WeakCheck実装

WeakCheck {
    dst: ValueId,
    weak_ref: ValueId,
}

Send/Recv実装

Send {
    data: ValueId,
    target: ValueId,
},
Recv {
    dst: ValueId,
    source: ValueId,
},

Phase 2: intrinsic関数システム実装

intrinsic レジストリ

// 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関数実装例

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変換

// 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変換

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実装

// 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実装

// 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実装

// 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)

  • 旧命令完全削除
  • テスト更新
  • ドキュメント整備

🧪 テスト・検証計画

段階的テスト

# 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

性能回帰テスト

# 削減前後性能比較
./scripts/benchmark_mir_reduction.sh

🎯 リスク対策

高リスク箇所

  1. 配列操作intrinsic化: パフォーマンス影響大
  2. BoxField統合: Box型システムとの整合性
  3. Effect分類変更: 最適化ロジック全面見直し

対策

  • プロトタイプ実装: 高リスク箇所の事前検証
  • 性能測定: 各段階での性能チェック
  • ロールバック: 問題発生時の迅速復旧

分析完了: 2025年8月17日
実装開始: 2025年8月18日
完了予定: 2025年9月21日