Files
hakorune/docs/development/current/main/design/control-tree.md

87 lines
4.0 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.

# ControlTree / StepTree構造SSOT
Status: **SSOTdesign / vocabulary**
Scope: **AST の“構造”だけ**を表現し、JoinIR/MIR の値・PHI・ブロックを一切持たない。
目的:
- ループ/if の **ネスト構造**を SSOT として持ち、pattern/policy の増殖先を「構造」側へ寄せる。
- LoopSkeletonloop_canonicalizer の骨格)を壊さずに、“次の一般化”の受け皿を追加する。
## 基本方針(禁止事項)
StepTree は「制御構造の形」だけを表す。
禁止(混ぜない):
- `ValueId` / `BlockId` / `PHI` / `JoinInst` / `MirInstruction` など、値やCFGの概念
- backend 依存の最適化・型情報
- “動くための lowering” ロジック(生成・変換)
許可(持ってよいもの):
- AST の最小要約(条件の形 / 文の種類 / span など)
- Capability / Feature例: has_loop, has_if, has_return などの分類)
## 用語
### ControlTree
StepTree後述を含む、構造SSOTの総称。将来 “BlockTree / BoundaryTree” 等を追加しても、値は持たない。
### StepTree
AST を「構造ード」に落とした木または木Block列で、次のード種別を持つ:
- `Block`: 文の列(順序を保持)
- `If`: `cond` と then/else の `Block`
- `Loop`: `cond` と body の `Block`
- `Stmt`: 構造化していない文Local/Assign/Return/Break/Continue/Expr などを tag 化)
## StepTreeContract構造契約SSOT
StepTreeContract は「この構造が何を含み、何を要求するか」を最小の契約として宣言する。
lowering/PHI/CFG の判断にはまだ使わないdev-onlyだが、再解析の増殖を防ぐための SSOT になる。
最小フィールド案P1:
- `exits`: `return` / `break` / `continue` の存在(構造だけ)
- `writes`: 変数への書き込み(最小は `Assignment target=Variable(name)``Local` 宣言の集合)
- `required_caps`: capability 宣言(例: `NestedLoop`, `TryCatch`, `Throw`, `Lambda` など)
- `cond_sig`: if/loop 条件式の要約(下記)
### cond_sig の方針SSOT
- cond_sig は **ASTNode 参照を保持しない**巨大化・ライフタイム・clone コストの問題を避ける)。
- cond_sig は **summary要約SSOT** とし、`AstSummary` 相当の安定表現に固定する。
- 目的は「構造分類/契約の固定」であり、式同値(完全な等価判定)は非対象。
## StepTreeSignature構造署名
StepTreeSignature は StepTreeContract + node kinds の “安定な基底文字列” を hash した識別子。
用途:
- dev-only ログの検索キー
- “同型ループ/同型if” の増殖検知(再解析の増殖防止)
注意:
- `Span` 等の位置情報は signature に含めない(入力差でブレるため)。
## Capability段階投入のSSOT
StepTree は capability を“宣言”し、未対応は **Fail-Fastdev-only / strict** で止める。
想定する段階(例):
1. **if-only**ネストifまで: Phase 110 P1
2. loop-in-if / if-in-loop: Phase 111+(予定)
3. nested loop: capability guard のまま別Phaseで解禁
## 位置づけLoopSkeleton との関係)
- **LoopSkeleton**`loop_canonicalizer`: loop 1個の骨格を正規化して、JoinIR に渡せる形へ整える。
- **StepTree**control_tree: 関数/ブロック全体の“構造”をSSOT化し、ネスト対応の入口を提供する。
両者は競合しない:
- LoopSkeleton は “loop単体の正規化” が責務
- StepTree は “構造の観測と分類” が責務値やCFGを持たない
## デバッグ出力dev-only
- 既定では出さない(既定挙動不変)。
- `NYASH_JOINIR_DEV=1` のときのみ StepTree をダンプするprefix は `[trace:dev] control_tree/step_tree`)。
- StepTree は routing の入力にしない(当面は parity/観測のみ。routing SSOT は feature extractor + analyzer