3.9 KiB
3.9 KiB
MIRラウンドトリップ最適化 - 永続チューニング装置
作成日: 2025-08-27 Status: 構想段階 Priority: High Related: ChatGPT5との共同構想
🎯 核心コンセプト
nyash → MIR → VM → Cranelift → nyash(再出力)
このループを回すことで、最適化の恩恵を全ルートに一括で波及させる「永続チューニング装置」を実現。
🏗️ ラウンドトリップの芯(揺るがない3点)
1. 唯一の真実=MIR
- すべての最適化はMIR上に集約
- VM/Cranelift/WASM/LLVMはMIRの投影でしかない
- ルート固有の最適化は「MIRヒント(属性)」として逆流
2. MIRは常に正規形(canonical)へ
MIR → Canonicalizer → MIR*
- 順序・冗長・等価命令を正規化
- どのルートを通っても再度正規形に戻す
- 振動(最適化の行ったり来たり)を防ぐ
3. 再出力nyashは「意味等価の整形」
- MIR → nyash_printerで人が読めるnyashに戻す
- 目的は可読な再配布・差分レビューと最適化の可視化
- コメント/マクロは期待しない
💎 必須コンポーネント(超ミニマム)
MIR Canonicalizer
- SSA再構築
- 冗長Phi削除
pureのCSEmutの順序制約保持ioは並べ替え禁止
MIR Verifier
- 強1本・強循環禁止
weak失効チェック@gcableにfini禁止- 効果整合性
nyash_printer
- public/privateフィールド再構成
- 関数、with/readガード、Sync復元
- ソースマップ(MIR↔nyash)保存
🚀 最適化の入口(MIR上だけ)
ローカル最適化
- peephole, const-fold, copy-prop
- dead-branch, LICM(pure)
所有/弱参照最適化
- adopt/release短絡
- weak_loadのnull先行分岐
Bus最適化
- elision(pure/read & 単一受信なら直呼び)
同期最適化
read→共有ロックwrite/io→排他ロック
プロファイル誘導
VM収集データ → MIR属性に反映
- op_count
- hot_bb
- bytes_copied
- send_count
🛡️ 無限最適化にしない「固定点」の作法
三段階で必ず終了
正規化 → 最適化 → 正規化
単調コスト
以下を悪化させたら採用しない/ロールバック:
instr_count(pure域)↓bytes_copied↓send_count↓alloc_freeバランス≥0
等価性ガード
- I/Oログ完全一致
- fini順序一致(@must_drop対象)
ハッシュ鍵
- MIR*の構造ハッシュを成果物キャッシュキーに
- 同形なら二度目以降はスキップ
📊 実行フロー(今日から回せる)
nyash --emit-mir src.ny > a.mir
mir --canonicalize a.mir > a*.mir
mir --optimize a*.mir > b.mir
vm --bc b.mir > b.bc
vm --run b.bc # 基準実行+プロファイル採取
jit --cranelift b.mir > code # JIT or AOT
mir --pretty b.mir > b.ny # 最適化後nyash出力
✅ CIに入れる「黄金テスト」
- 同値:
interp == vm == cranelift(結果&I/Oログ) - GC等価:
--gc=on/offでログ差分0 - 資源確定:
open==fini(@must_drop) - ゼロコピー:
dup()以外でbytes_copied == 0 - サイズ:
send_count / alloc_countが基準値以下
🎯 まず入れるべきパス(効果大きい順)
- Bus-elision(安全条件つき)
- CSE/Copy-prop/Dead-branch(
pure域) - WeakLoad先読み(null fast-path)
- Mutex/Rwロック折り畳み(単一呼出シーケンス統合)
※これだけでVM/Cranelift/WASMの全部が速くなる
📝 直近ToDo
- mir canonicalizer(Phi縮退/純粋域の順序固定)
- bus-elision(安全条件実装)
- profile schema定義
- cache key実装
- nyash_printer v0
「どのルートを通っても、最後は同じMIRへ戻る」- 一箇所直せば全部に効く世界