Files
hakorune/docs/guides/scopebox.md

2.2 KiB
Raw Blame History

ScopeBoxコンパイル時メタ設計ガイド

目的

  • スコープ境界・defer・capabilities を“箱Box”のメタとして表現しつつ、最終的な実行物ではゼロコストにする。
  • LoopFormループのみキャリア整形と責務分離し、If/Match は合流点正規化join変数単一PHI群に限定する。

基本方針

  • ScopeBox は“消える箱”。AST/マクロ段階で Block に属性を付与し、MIR ではヒントとして解釈、IR では完全に剥がす。
  • ループを伴わないスコープを LoopForm に持ち込まない0回ループ化はしない

属性とヒントMVP

  • ASTマクロ内部表現
    • Block.attrs.scope: { id, name, caps?: {io,net,env}, defer?: [Call…], diag?: {...} }
    • 備考: 現段階では属性はマクロ内で保持するだけ。MIR 降下時にヒントへ写すのが目標。
  • MIRヒントのみ構造不変
    • hint.scope_enter(id) / hint.scope_leave(id)
    • hint.defer(list) ・・・ 静的展開cleanup合流に用いる
    • hint.join_result(var) ・・・ If/Match の合流結果を明示
    • hint.loop_carrier(vars...) ・・・ ループヘッダで同一PHI群に導く
    • hint.no_empty_phi検証
  • IRRelease
    • すべての hint は生成前に剥離。追加命令は一切残らない。

パイプライン

  1. Parse → MacroIf/Match 正規化、Scope 属性付与)
  2. LoopFormwhile/for/foreach のみ、キャリア整形)
  3. Resolve → MIR Lowerヒント埋め、defer静的展開
  4. 検証PHI先頭空PHI無し→ ヒント剥離 → Backend

受け入れ基準Release

  • IR に scope/hint 名が一切出現しない。
  • LoopForm ケースはヘッダ先頭に PHI がまとまり、空PHI無し。
  • If/Match 式は join 変数 1 個で収束空PHI無し

今後の予定(短期)

  • マクロ: @scope/@defer 記法のスキャフォールド → AST 属性付与(挙動は現状どおり、構造変更無し)。
  • MIR: hint.* の型と注入ポイント定義(降下部のスケルトン、既定は no-op
  • スモーク: IR に scope/hint 名が残らないこと、PHI 健全性が保たれることを確認。