# Phase 9.10: NyIR v1 仕様・フォーマット・検証器（公開IRの確立）

目的
- NyashのMIRを公開IR（NyIR v1）として仕様固定し、あらゆるフロントエンド/バックエンドの共通契約とする。
- 仕様・テキスト/バイナリフォーマット・厳格検証器・ツール群を整備し、移植性と一貫性を保証する。

成果物（Deliverables）
- 仕様書: `docs/nyir.md`（命令仕様/効果/未定義なし/検証ルール/等価変換指針）
- フォーマット: `.nyir`（テキスト）, `.nybc`（バイナリ）
- 検証器: `nyir-verify`（CLI/ライブラリ）
- 変換/実行ツール:
  - `nyashel -S`（Nyash→NyIRダンプ）
  - `nyir-run`（NyIRインタプリタ）
  - 参考: `nyir-ll`（NyIR→LLVM IR、Phase 10で拡張）
- Golden NyIR: `golden/*.nyir`（代表サンプルを固定、CIで全バックエンド一致を検証）

仕様の要点（NyIR v1）
- 命令セット: 25命令（Tier-0/1/2）を仕様固定
  - Tier-0: Const, BinOp, Compare, Branch, Jump, Phi, Call, Return
  - Tier-1: NewBox, BoxFieldLoad, BoxFieldStore, BoxCall, Safepoint, RefGet, RefSet, WeakNew, WeakLoad, WeakCheck, Send, Recv
  - Tier-2: TailCall, Adopt, Release, MemCopy, AtomicFence
- 効果（Effects）: pure / mut / io / control（再順序化規則を明文化）
- 所有フォレスト: 強参照の森（strong in-degree ≤ 1）、強循環禁止、weakは非伝播
- Weak: 失効時の挙動を決定（WeakLoad=null / WeakCheck=false）、世代タグ設計を想定
- Bus: ローカルは順序保証、リモートは at-least-once（または選択可能）
- 未定義動作なし: 各命令の事前条件/失敗時挙動を明示
- バージョニング: `nyir{major.minor}`、featureビットで拡張告知

テキスト形式（.nyir）
- 人間可読・差分レビュー向け
- 構造: moduleヘッダ / const pool / functions（blocks, instrs）
- コメント/メタデータ/featureビットを扱える簡潔な構文

バイナリ形式（.nybc）
- セクション化: header / features / const pool / functions / metadata
- エンコード: LEB128等の可変長を採用、識別子はstring table参照
- 将来の後方互換に備えた保守的設計

検証器（Verifier）
- 検査: 所有森/強循環/weak規則/効果整合/到達性/終端性/Phi入力整合
- 失敗時は明確なエラーを返し、ロード拒否
- CLI/ライブラリの二態（コンパイラ/実行系どちらからも利用）

Golden / Differential テスト
- `golden/*.nyir` を固定し、interp/vm/wasm/jit/llvm（順次）で出力一致をCIで検証
- 弱失効/分割fini/境界条件系を重点的に含める

タスク（Copilot TODO）
1) 仕様スケルトン: `docs/nyir.md` ひな形生成（命令/効果/検証/等価変換の目次）
2) `.nyir` パーサ/プリンタ（最小）
3) `.nybc` エンコーダ/デコーダ（最小）
4) `nyir-verify`（所有森/効果/Phi/到達/終端の基本チェック）
5) `nyashel -S` をNyIR出力対応に（既存MIRダンプ経路から移行）
6) Goldenサンプル作成（3〜5本）＋CIワークフロー雛形

受け入れ基準（Acceptance）
- 代表サンプルが `.nyir` で表現・検証・実行可能（`nyir-run`）
- `.nybc` 読み書き往復で等価
- CIでinterp/vm/wasmの結果一致（最小ケース）

依存/関連
- 8.5: 25命令の確定仕様
- 9.7: ExternCall/ABI（NyIRにもmethodノードor外部呼を表現）。v1ではExternCallは拡張セクションで可
- 10.x: NyIR→LLVM IR（別Phase）

リスク
- 仕様固定の硬直化 → 拡張はfeatureビット＋拡張セクションへ
- 実装の重複 → Verifier/フォーマットは共有ライブラリ化

最終更新: 2025-08-14
