Files
hakorune/docs/development/current/main/design/control-tree.md
nyash-codex 97675b4035 docs: Phase 114 DONE
Phase 114完了に伴うドキュメント更新:
- 30-Backlog.md: Phase 114の次候補から完了済みに移行
- design/control-tree.md: Phase 110-112の進捗反映
- design/README.md, joinir-design-map.md, phases/README.md: マイナー更新

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2025-12-18 02:19:41 +09:00

4.3 KiB
Raw Blame History

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 相当の安定表現に固定する。
    • 目的は「構造分類/契約の固定」であり、式同値(完全な等価判定)は非対象。
  • StepTree は当面 観測/分類の SSOTdev-only として運用する。
    • 将来 StepTree→Normalizedenv+継続)を “本番導線” にする場合は、cond の lowering 用に AstExprId 等を保持する 別SSOT(例: StepTreeRefを追加し、cond_sig は署名/ログ用途として維持する。

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 との関係)

  • LoopSkeletonloop_canonicalizer: loop 1個の骨格を正規化して、JoinIR に渡せる形へ整える。
  • StepTreecontrol_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