# Nyash統一セマンティクス実装設計
# 作成日: 2025-09-02
# 目的: Interpreter/VM/JIT全層での予約語・文法解釈の完全統一

## 概要
すべての実行層が同じセマンティクスに従うよう、MIR正規化層を中心とした統一実装を行う。

## 核心的な問題
現在、同じ式が各層で異なる解釈をされている：
- "hello" + 123
  - Interpreter: エラーを出す
  - VM: 型変換してから連結
  - JIT: 数値を文字列化してから連結

## 解決策：MIR統一セマンティクス + 軽量UIRタグ

### 1. 統一セマンティクス定義（grammar/semantics.yml）
```yaml
# すべての層が従う唯一の定義
version: "1.0"
semantics:
  add:
    - pattern: [String, String]
      action: concat
      mir: StringConcat
      vm: OP_STR_CONCAT
      
    - pattern: [String, Any]
      action: coerce_concat
      steps:
        - ToString($2)
        - StringConcat($1, $2)
      
    - pattern: [Integer, Integer]
      action: add_i64
      mir: AddI64
      vm: OP_ADD_I64
      
  toString:
    - pattern: [String]
      action: identity
    - pattern: [Integer]
      action: int_to_string
    - pattern: [Float]
      action: float_to_string
    - pattern: [Bool]
      action: bool_to_string
    - pattern: [Null]
      action: const_null_string
```

### 2. UIRタグシステム（層間通信）
```rust
// generated/uir_tags.rs (build.rsで生成)
#[derive(Copy, Clone, Debug, Eq, PartialEq)]
#[repr(u32)]
pub enum UIRTag {
    // 予約語
    ME = 1,
    FROM = 2,
    LOOP = 3,
    BOX = 4,
    INIT = 5,
    
    // 演算子
    ADD = 100,
    SUB = 101,
    MUL = 102,
    DIV = 103,
    
    // セマンティクスアクション
    STRING_CONCAT = 200,
    TO_STRING = 201,
    ADD_I64 = 202,
    ADD_F64 = 203,
}
```

### 3. MIR正規化層（真実の基盤）
```rust
// src/mir/normalizer.rs
pub struct MIRNormalizer {
    semantics_table: SemanticRuleTable,
}

impl MIRNormalizer {
    pub fn normalize(&self, expr: &Expression) -> MIR {
        match expr {
            Expression::BinaryOp(op, left, right) => {
                let left_type = self.infer_type(left);
                let right_type = self.infer_type(right);
                
                // 統一ルールを適用
                let rule = self.semantics_table.lookup(op, &[left_type, right_type]);
                
                match rule.action {
                    Action::Concat => {
                        MIR::StringConcat(
                            Box::new(self.normalize(left)),
                            Box::new(self.normalize(right))
                        )
                    }
                    Action::CoerceConcat => {
                        // 右辺を文字列に変換してから連結
                        MIR::Sequence(vec![
                            self.normalize(left),
                            MIR::ToString(Box::new(self.normalize(right))),
                            MIR::StringConcat
                        ])
                    }
                    Action::AddI64 => {
                        MIR::AddI64(
                            Box::new(self.normalize(left)),
                            Box::new(self.normalize(right))
                        )
                    }
                }
            }
        }
    }
}
```

### 4. 各層の統一実装

#### Interpreter層
```rust
impl Interpreter {
    fn execute_expression(&mut self, expr: &Expression) -> Result<Value> {
        // すべてMIR経由で実行
        let mir = self.mir_normalizer.normalize(expr);
        self.execute_mir(&mir)
    }
    
    fn execute_mir(&mut self, mir: &MIR) -> Result<Value> {
        match mir {
            MIR::StringConcat(left, right) => {
                let left_val = self.execute_mir(left)?;
                let right_val = self.execute_mir(right)?;
                Ok(Value::String(format!("{}{}", left_val, right_val)))
            }
            MIR::ToString(expr) => {
                let val = self.execute_mir(expr)?;
                Ok(Value::String(self.value_to_string(&val)))
            }
            MIR::AddI64(left, right) => {
                let left_val = self.execute_mir(left)?;
                let right_val = self.execute_mir(right)?;
                Ok(Value::Integer(left_val.as_i64()? + right_val.as_i64()?))
            }
        }
    }
}
```

#### VM層
```rust
impl VM {
    fn compile_mir(&mut self, mir: &MIR) -> Vec<Opcode> {
        // MIRから機械的にバイトコード生成
        match mir {
            MIR::StringConcat(left, right) => {
                let mut code = vec![];
                code.extend(self.compile_mir(left));
                code.extend(self.compile_mir(right));
                code.push(Opcode::StringConcat);
                code
            }
            MIR::ToString(expr) => {
                let mut code = self.compile_mir(expr);
                code.push(Opcode::ToString);
                code
            }
            MIR::AddI64(left, right) => {
                let mut code = vec![];
                code.extend(self.compile_mir(left));
                code.extend(self.compile_mir(right));
                code.push(Opcode::AddI64);
                code
            }
        }
    }
}
```

#### JIT層
```rust
impl JITCompiler {
    fn compile_mir(&mut self, mir: &MIR) {
        // MIRから最適化されたネイティブコード生成
        match mir {
            MIR::StringConcat(left, right) => {
                self.compile_mir(left);
                self.compile_mir(right);
                // 高速な文字列連結関数を呼び出し
                self.emit_call(fast_string_concat);
            }
            MIR::ToString(expr) => {
                self.compile_mir(expr);
                // 型に応じた最適な変換
                self.emit_call(optimized_to_string);
            }
            MIR::AddI64(left, right) => {
                self.compile_mir(left);
                self.compile_mir(right);
                // ネイティブな加算命令
                self.emit_add_i64();
            }
        }
    }
}
```

## 実装手順

### Phase 1: 基盤構築（1週間）
1. grammar/semantics.yml 作成
2. UIRTag定義とbuild.rs生成
3. SemanticRuleTable実装

### Phase 2: MIR正規化層（1週間）
1. MIRNormalizer実装
2. 型推論システム構築
3. セマンティクステーブル連携

### Phase 3: 各層統合（2週間）
1. Interpreterを MIR経由に変更
2. VMのMIRコンパイラ実装
3. JITのMIRコンパイラ実装

### Phase 4: テストと検証（1週間）
1. 統一セマンティクステスト作成
2. 各層での一貫性検証
3. パフォーマンス測定

## 期待される効果

1. **完全な一貫性**: すべての層が同じ動作
2. **保守性向上**: セマンティクス変更が1箇所
3. **拡張性**: 新しい演算子の追加が容易
4. **AI対応**: 単一の仕様から学習可能
5. **デバッグ容易性**: MIRレベルでの統一デバッグ

## 注意事項

- 既存のコードとの互換性を保つため、フィーチャーフラグで段階的移行
- パフォーマンスへの影響を最小限にするため、ビルド時最適化を活用
- テストカバレッジを十分に確保してから本番移行

## 関連ファイル

- grammar/semantics.yml - セマンティクス定義
- src/mir/normalizer.rs - MIR正規化実装
- build.rs - コード生成
- tests/unified_semantics.rs - 統一テスト