Files
hakorune/docs/guides/scopebox.md

40 lines
2.2 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# 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 健全性が保たれることを確認。