6.9 KiB
6.9 KiB
MIR14命令セット仕様
Version: Phase 15.0 Last Updated: 2025-09-27
📚 概要
MIR14(Middle-level Intermediate Representation 14)は、Nyash言語のコア中間表現です。たった14命令で、Interpreter/VM/LLVM/JITすべての実行形態をサポートします。
設計哲学
Everything is Box
↓
Box化により命令を最小化
↓
14命令で完全実装 ✨
🎯 MIR14命令一覧
基本演算(5命令)
1. Const - 定数値生成
Const { dst: ValueId, value: ConstValue }
- 用途: 即値(整数/文字列/null)の生成
- 例:
const r1 = 42
2. UnaryOp - 単項演算
UnaryOp { dst: ValueId, op: UnaryOperator, operand: ValueId }
- 演算子:
not,-(負数) - 例:
r2 = not r1
3. BinOp - 二項演算
BinOp { dst: ValueId, op: BinaryOperator, left: ValueId, right: ValueId }
- 演算子:
+,-,*,/,%,&,|,^,<<,>> - 例:
r3 = r1 + r2
4. Compare - 比較演算
Compare { dst: ValueId, op: CompareOp, left: ValueId, right: ValueId }
- 演算子:
==,!=,<,<=,>,>= - 例:
r4 = r1 < r2
5. TypeOp - 型操作
TypeOp { dst: ValueId, op: TypeOperator, operand: ValueId, type_info: Option<TypeInfo> }
- 操作:
typeof,cast,is_a - 例:
r5 = typeof r1
メモリ操作(2命令)
6. Load - メモリ読み込み
Load { dst: ValueId, source: ValueId, field: Option<String> }
- 用途: 変数読み込み、フィールドアクセス
- 例:
r6 = load r1.name
7. Store - メモリ書き込み
Store { target: ValueId, field: Option<String>, value: ValueId }
- 用途: 変数代入、フィールド更新
- 例:
store r1.name = r2
制御フロー(4命令)
8. Branch - 条件分岐
Branch { condition: ValueId, true_target: BlockId, false_target: BlockId }
- 用途: if文、条件式
- 例:
branch r1 -> B2, B3
9. Jump - 無条件ジャンプ
Jump { target: BlockId }
- 用途: ループ継続、合流
- 例:
jump B1
10. Return - 関数リターン
Return { value: Option<ValueId> }
- 用途: 関数終了、値返却
- 例:
return r1
11. Phi - SSA合流ノード
Phi { dst: ValueId, incoming: Vec<(BlockId, ValueId)> }
- 用途: 制御フロー合流点での値統合
- 例:
r7 = phi [B1: r1, B2: r2] - Phase 15: PHI-on標準化(LoopForm実装)
Box操作(2命令)
12. NewBox - Box生成
NewBox { dst: ValueId, box_name: String, args: Vec<ValueId> }
- 用途: Box インスタンス生成
- 例:
r8 = newbox StringBox("hello") - Note: 生成後に自動的に
birth()を呼び出し
13. BoxCall - Boxメソッド呼び出し
BoxCall {
dst: Option<ValueId>,
receiver: ValueId,
method: String,
args: Vec<ValueId>,
callee: Option<Callee> // Phase 15追加
}
- 用途: メソッド呼び出し、演算子Box
- 例:
r9 = boxcall r8.length() - Phase 15新機能: Callee型による型安全化
外部連携(1命令)
14. ExternCall - 外部関数呼び出し
ExternCall {
dst: Option<ValueId>,
function: String,
args: Vec<ValueId>
}
- 用途: C ABI関数、ランタイム関数
- 例:
externcall print(r1) - 最小5関数: print, error, panic, exit, now
🌟 Phase 15新機能
1. LoopForm - 制御構造のBox化
LoopForm {
header: BlockId, // ループヘッダー
body: BlockId, // ループ本体
exit: BlockId, // ループ出口
condition: ValueId, // ループ条件
phis: Vec<Phi>, // PHIノード自動生成
}
特徴:
- 制御構造もBox化(Everything is Box完成!)
- PHI自動生成
- break/continue自動処理
例:
loop(i < 10) {
print(i)
i = i + 1
}
MIR生成:
LoopForm {
header: B1,
body: B2,
exit: B3,
phis: [phi_i: [B0: 0, B2: i+1]]
}
2. Callee型 - 型安全な関数呼び出し
enum Callee {
Global(String), // グローバル関数
Method {
box_name: String,
method: String,
receiver: ValueId
},
Value(ValueId), // 第一級関数
Extern(String), // C ABI統合
}
特徴:
- コンパイル時型解決
- シャドウイング問題解決
- VM/LLVM両対応
例:
print("hello") // Callee::Extern("print")
obj.method() // Callee::Method { box_name: "Obj", ... }
3. 演算子Box統一
// 演算もBoxCallに統一
BinOp { op: Add, left: r1, right: r2 }
↓
BoxCall {
receiver: AddOperator,
method: "apply",
args: [r1, r2],
callee: Callee::Method { ... }
}
特徴:
- observe/adopt段階的移行
- デバッグ可視化(Void混入即座特定)
- Everything is Boxの完全実現
📊 命令数の進化
Phase 1: 27命令(汎用的)
↓ Box哲学による削減
Phase 2: 13命令(Core-13)
↓ 算術演算の追加
Phase 3: 14命令(MIR14)
↓ PHI-on標準化
Phase 15: 14命令 + LoopForm + Callee型
🎯 Everything is Boxの完全実現
データBox
StringBox, IntegerBox, ArrayBox, MapBox...
演算子Box(世界初!)
AddOperator, CompareOperator, UnaryOperator...
制御Box(世界初!)
LoopForm: 制御構造もBox化
結論: すべてがBoxである → 14命令で完全実装可能 ✨
🚀 実装状況
Rust VM (開発・デバッグ・検証用)
- 実装: 712行
- MIR14完全対応 ✅
- Callee型実装済み ✅
- gdb/lldbデバッグ可能 ✅
LLVM (本番・最適化・配布用)
- 実装: Python/llvmlite
- MIR14完全対応 ✅
- PHI最適化 ✅
- ネイティブEXE生成 ✅
PyVM (JSON v0ブリッジ専用)
- 実装: 1074行
- セルフホスティング・using処理専用
- MIR14対応 ✅
📚 関連ドキュメント
- INSTRUCTION_SET.md: 命令詳細
- PHI Policy: PHI設計方針
- LoopForm Design: LoopForm詳細
- Callee Revolution: Callee型設計
🎉 結論
MIR14は、Everything is Box哲学の完全実装により、たった14命令で全実行形態をサポートする革新的IR です。
世界初の成果:
- ✅ データ/演算/制御すべてBox化
- ✅ 14命令で完全実装
- ✅ VM/LLVM両対応
- ✅ 型安全な関数呼び出し
これが、Nyash言語の実行基盤です。 ✨