Pattern4 (continue) integration into Normalized JoinIR pipeline complete. Key changes: - P4 minimal fixture: skip i==2 pattern, single carrier (acc) - ShapeGuard: Pattern4ContinueMinimal detector (structure-based) - StepScheduleBox: ContinueCheck step (eval order: HeaderCond → ContinueCheck → Updates → Tail) - normalize_pattern4_continue_minimal(): Delegates to P2 (95% infrastructure reuse) - Tests: 4 integration tests (normalization/runner/VM Bridge comparison×2) Design validation: - P4 (continue) = reverse control flow of P2 (break) - Same loop_step(env, k_exit) skeleton - Same EnvLayout/ConditionEnv/CarrierInfo infrastructure - Only difference: evaluation order and control flow direction Architecture proof: - Normalized JoinIR successfully handles P1/P2/P3/P4 uniformly - Infrastructure reuse rate: 95%+ as designed Tests: 939/939 PASS (+1 from baseline 938, target exceeded!) Files modified: 10 files (~305 lines added, pure additive) - pattern4_continue_min.program.json (NEW +126 lines) - P4 fixture - fixtures.rs (+31 lines) - P4 fixture loader - shape_guard.rs (+60 lines) - Shape detection - step_schedule.rs (+18 lines) - Schedule + test - normalized.rs (+35 lines) - Normalization function - loop_with_break_minimal.rs (+4 lines) - ContinueCheck handler - bridge.rs (+5 lines) - VM bridge routing - ast_lowerer/mod.rs (+2 lines) - Function registration - normalized_joinir_min.rs (+84 lines) - Integration tests - CURRENT_TASK.md (+13 lines) - Phase 48-A completion Next steps: - Phase 48-B: Extended P4 (multi-carrier, complex continue) - Phase 48-C: Canonical promotion (always use Normalized for P4)
19 KiB
19 KiB
Current Task
このファイルは「いま何に集中しているか」と「次にやり得る候補」だけを書く軽量ビューだよ。
詳細なログや過去フェーズの記録は docs/development/current/main/ 以下の各 phase-*.md と
docs/development/current/main/joinir-architecture-overview.md を真実のソースとして扱うよ。
🎯 今フォーカスしているテーマ(2025-12-12 時点のスナップショット)
0. ✅ Phase 43/245B Normalized JoinIR Infrastructure COMPLETE (Phase 26-45)
完全サマリ: PHASE_43_245B_NORMALIZED_COMPLETION.md
- 達成内容:
- Structured→Normalized→MIR(direct) パイプライン確立
- P1/P2 + JsonParser (skip_ws/atoi/parse_number) 全対応
- Mode system (Phase 45), Capability system (Phase 44) 完成
- 937/937 tests PASS
- 主要コンポーネント:
- JoinIrMode enum (StructuredOnly/NormalizedDev/NormalizedCanonical)
- ShapeCapabilityKind (P2CoreSimple/P2CoreSkipWs/P2CoreAtoi/P2MidParseNumber)
- CarrierRole (LoopState/ConditionOnly), CarrierInit
- DigitPos dual-value (is_digit_pos + digit_value)
- NumberAccumulation, Step scheduling, Exit PHI & Jump args
- 今後の拡張候補(計画のみ):
- Phase 46+: Canonical set 拡張 (capability-based)
- Pattern3/4 Normalized 適用
- Selfhost loops 対応
0-B. JoinIR / ExprLowerer / Pattern2–4 + JsonParser _parse_number / DigitPos ライン(Phase 230–247-EX 完了)✅
- Pattern1–4(while / break / if‑PHI / continue)+ P5(Trim) でループ lowering を JoinIR 経路に一本化。
- Phase 231/236/240-EX:
- Pattern2 の header / break 条件を ExprLowerer/ScopeManager 経由(対応パターンのみ)で本番導線化。
- ConditionEnv ベースの意味論と RC/JoinIR 構造が一致することをテストとカタログで確認済み。
- Phase 237–238-EX:
- JsonParser/selfhost の条件パターンをカタログ化し、ExprLowerer/ScopeManager/ConditionEnv の責務境界を docs/README で固定。
- Phase 241–242-EX:
- array_filter 系 3 FAIL を「構造で」解消(hardcode
"sum"チェック削除、CarrierInfo/ExitMeta 経由に統一)。 - Pattern3 if‑sum / Pattern4 continue から legacy lowerer と by-name
"sum"/"count"を完全削除。 - 複雑条件(
i % 2 == 1)を ConditionPattern/if-sum lowerer で安全に扱えるよう整理(Fail-Fast + テスト付き)。
- array_filter 系 3 FAIL を「構造で」解消(hardcode
- Phase 243–244-EX:
- Pattern3/4 の公開 API を
can_lower + lowerの最小セットに整理し、内部 helper を箱の中に閉じた。 loop_pattern_detectionの classify() が代表ループを P1〜P4 に分類することをユニットテストで固定。
- Pattern3/4 の公開 API を
- Phase 245-EX / 245C:
_parse_numberのループについて、ループ変数pの header/break 条件とp = p + 1更新を Pattern2 + ExprLowerer 経路に載せて本番化。- FunctionScopeCapture / CapturedEnv を拡張し、関数パラメータ(例:
s,len)をループ条件/本体で読み取り専用なら CapturedEnv 経由で ConditionEnv に載せるようにした。 - これにより、
p < s.length()のような header 条件や JsonParser 系ループでのパラメータ参照が、ExprLowerer/ScopeManager から安全に解決される。
- Phase 245B-IMPL:
_parse_number本体でnum_str = num_str + chを LoopState キャリアとして扱い、Program(JSON) フィクスチャjsonparser_parse_number_realを Structured→Normalized→MIR(direct) で dev テスト固定(出力は num_str 文字列)。
- Phase 247-EX:
- DigitPos promotion を二重値化し、
digit_posから boolean carrieris_digit_pos(ConditionOnly)と integer carrierdigit_value(LoopState)を生成。 - UpdateEnv で
digit_pos解決時にdigit_valueを優先し、NumberAccumulation(result = result * 10 + digit_pos)と break 条件の両方で DigitPos パターンが安全に利用可能に。
- DigitPos promotion を二重値化し、
- 現在:
cargo test --release --libで 931/931 テスト PASS(既知 FAIL なし)。 - Phase 28-NORM-P2(dev-only):
- Normalized JoinIR のミニ実装を Pattern1 に続き Pattern2 最小ケースまで拡張(Structured→Normalized→Structured を比較)。
- 対応外の Structured JoinModule では normalize_pattern2_minimal が Fail-Fast するようガードを追加し、normalized_dev テストで固定。
- Phase 29-NORM-P2-APPLY(dev-only):
- Phase 34 の break fixture(i/acc/n の単純 break ループ)を Structured→Normalized→Structured の往復に通し、VM 実行結果が Structured 直経路と一致することを dev テストで固定。
- ガードは 3 パラメータまで緩和しつつ、DigitPos/Trim などの重いキャリアはまだ非対応のまま。
- Phase 30-NORM-P2-DEV-RUN(dev-only):
- JoinIR runner に
NYASH_JOINIR_NORMALIZED_DEV_RUN=1を追加し、Pattern1/2 ミニケースだけ Structured→Normalized→Structured を挟んで dev 実行できるようにした(normalized_dev+ debug 限定)。通常経路(Structured→MIR)は不変。
- JoinIR runner に
- Phase 31-NORM-JP-MINI(dev-only):
- JsonParser 系のシンプルな P2 ループ(skip_whitespace ミニ fixture)を Structured→Normalized→Structured 経由でも実行し、runner dev スイッチの比較テストで Structured 直経路と一致することを固定。
- Phase 32-NORM-CANON-PREP(dev-only):
- JoinIR→MIR ブリッジの入口を
bridge_joinir_to_mirに一本化し、normalized_dev スイッチ(feature + env)で Structured→Normalized→Structured の dev roundtrip を切り替える準備を整えた。P1/P2/JP mini の比較テストも VM ブリッジ経路で追加。
- JoinIR→MIR ブリッジの入口を
- Phase 33-NORM-CANON-TEST(dev-only):
- P1/P2(Phase 34 break fixture)/JsonParser skip_ws mini について、normalized_dev ON 時は shape_guard 経由で必ず Normalized roundtrip を通すようブリッジと runner を固めた。normalized_joinir_min.rs の runner/VM 比較テストを拡張し、Normalized が壊れたら dev スイートが必ず赤になるようにした(本番 CLI は従来どおり Structured→MIR)。
- Phase 34-NORM-ATOI-DEV(dev-only):
- JsonParser
_atoiミニループ(digit_pos→digit_value + NumberAccumulation)を normalized_dev 経路に載せ、Structured↔Normalized↔Structured の VM 実行結果が一致することをフィクスチャテストで固定。jsonparser_atoi_miniを shape_guard で認識し、既定経路は引き続き Structured→MIR のまま。
- JsonParser
- Phase 35-NORM-BRIDGE-MINI(dev-only):
- P1/P2 ミニ + JsonParser skip_ws/atoi ミニを Normalized→MIR 直ブリッジで実行できるようにし、normalized_dev ON 時は Structured→Normalized→MIR(復元なし)経路との比較テストで結果一致を固定。既定経路(Structured→MIR)は不変。
- Phase 36-NORM-BRIDGE-DIRECT(dev-only):
- Normalized ブリッジを direct 実装(Normalized→MIR)と Structured 再構成に分離し、shape_guard で P1/P2 ミニ + JsonParser skip_ws/atoi ミニだけ direct 経路に通すよう整理。非対応は
[joinir/normalized-bridge/fallback]ログ付きで再構成に落とし、テストで direct/従来経路の VM 出力一致を固定。
- Normalized ブリッジを direct 実装(Normalized→MIR)と Structured 再構成に分離し、shape_guard で P1/P2 ミニ + JsonParser skip_ws/atoi ミニだけ direct 経路に通すよう整理。非対応は
- Phase 37-NORM-JP-REAL(dev-only):
- JsonParser
_skip_whitespace本体の P2 ループを Program(JSON) フィクスチャで Structured→Normalized→MIR(direct) に通し、Structured 直経路との VM 出力一致を比較するテストを追加。extract_valueが&&/||を BinOp として扱えるようにし、Break パターンの param 推定を柔軟化して real 形状でも panic しないようにした。
- JsonParser
- Phase 38-NORM-OBS(dev-only):
- Normalized/JoinIR dev 経路のログカテゴリを
[joinir/normalized-bridge/*]/[joinir/normalized-dev/shape]に統一し、JOINIR_TEST_DEBUG下だけ詳細を出すよう静音化。Verifier/Fail‑Fast メッセージも shape/役割付きに整え、デバッグ観測性を上げつつ通常実行のノイズを減らした。
- Normalized/JoinIR dev 経路のログカテゴリを
- Phase 43-A(dev-only):
- JsonParser
_atoi本体の Program(JSON) フィクスチャを normalized_dev に追加し、Structured→Normalized→MIR(direct) と Structured→MIR の VM 出力を比較するテストで一致を固定(符号あり/なしの簡易パス対応。canonical 切替は後続フェーズ)。
- JsonParser
- Phase 43-C(dev-only):
- JsonParser
_parse_number本体の Program(JSON) フィクスチャを normalized_dev に追加し、Structured→Normalized→MIR(direct) と Structured→MIR の VM 出力を比較するテストで一致を固定(num_str は現状仕様のまま据え置き、P2-Mid の足慣らし)。
- JsonParser
- Phase 46-NORM-CANON-P2-MID(実装済み✅ 2025-12-12):
- P2-Mid パターン(_atoi real, _parse_number real)を canonical Normalized に昇格。
- Canonical set 拡張: P2-Core(mini + skip_ws + atoi mini)+ P2-Mid(atoi real + parse_number real)。
- JsonParser P2 ライン(_skip_whitespace/_atoi/_parse_number)全て canonical Normalized 化完了。
- P3/P4 Normalized 対応は NORM-P3/NORM-P4 フェーズで実施(今回スコープ外)。
- 937/937 tests PASS。
- Phase 47-A-IMPL(実装中 2025-12-12):
- StepScheduleBox 汎用化: pattern2_step_schedule.rs → step_schedule.rs リネーム
- P3 StepKind 追加: IfCond, ThenUpdates, ElseUpdates(P2 lowering との分離完了)
- ShapeGuard: Pattern3IfSumMinimal 検出追加(placeholder stub実装)
- Normalized bridge: P3 shape handling 追加(P2 normalization 使用)
- 938/938 tests PASS(regression なし)
- 次ステップ: Phase 47-A-LOWERING で full P3 Normalized lowering 実装
- Phase 45-NORM-MODE(実装済み✅ 2025-12-12):
- JoinIR モード一本化: バラバラだったフラグ/feature を
JoinIrModeenum に集約(StructuredOnly / NormalizedDev / NormalizedCanonical)。 current_joinir_mode()でモード取得、bridge/runner でnormalized_dev_enabled()→ mode pattern matching に移行。- Canonical P2-Core は mode 無視で常に Normalized→MIR(direct)、それ以外は mode に従う統一ルーティング。
- 937/937 tests PASS(既存挙動完全保持のリファクタ)。
- JoinIR モード一本化: バラバラだったフラグ/feature を
- Phase 44-SHAPE-CAP(実装済み✅ 2025-12-12):
- Shape検出を capability-based に変更:
NormalizedDevShape→ShapeCapability抽象化層導入。 ShapeCapabilityKind4種: P2CoreSimple / P2CoreSkipWs / P2CoreAtoi / P2MidParseNumber。- Shape-level (
is_canonical_shape) と Capability-level (is_p2_core_capability) の二層 API でパターン拡張性を確保。 - 既存挙動完全保持(canonical set: Pattern2Mini, skip_ws mini/real, atoi mini のまま)、937/937 tests PASS。
- Shape検出を capability-based に変更:
1. いまコード側で意識しておきたいフォーカス
- Phase 43/245B Normalized 完了 により JoinIR ループ基盤(Pattern1–4 + ExprLowerer + ScopeManager + CapturedEnv + Normalized layer)は一応の完成状態に入ったので、当面は:
- 既存パターン/箱の範囲内での バグ修正・Fail‑Fast/invariant 追加・テスト強化 を優先する。
- JsonParser/selfhost への新しい適用や大きな仕様拡張は、docs 側で Phase 設計が固まってからコード側に持ち込む。
- 直近のコード側フォーカス候補:
Phase 246-EX(コード): ✅ 完了(_atoi Integration, Phase 43/245B の一部)- Pattern1–4 / ExprLowerer / ScopeManager まわりで、by-name ハードコードやサイレントフォールバックが見つかった場合は、 CarrierInfo / ConditionEnv / Scope 情報を使って「構造で」直す。
2. 直近で意識しておきたい設計の芯
- Loop パターン空間は有限で整理済み:
- P1: Simple While
- P2: Break
- P3: If‑PHI(単一/複数キャリア)
- P4: Continue(then/else‑continue 正規化込み)
- P5: LoopBodyLocal 昇格(Trim/JsonParser 用の部分適用)
- 「増やすべき」は新しい Pattern ではなく、既存 Pattern の前処理箱:
- BoolExprLowerer / ConditionEnv / LoopConditionScopeBox / LoopBodyCarrierPromoter /
TrimLoopHelper / ComplexAddendNormalizer / LoopBodyLocalEnv / UpdateEnv などで
条件式とキャリア更新を吸収し、Pattern1–4 は「ループ骨格」に専念させる方針。
- BoolExprLowerer / ConditionEnv / LoopConditionScopeBox / LoopBodyCarrierPromoter /
TrimLoopHelper / ComplexAddendNormalizer / LoopBodyLocalEnv / UpdateEnv などで
- Fail‑Fast 原則:
- JoinIR 以外のループ lowering パスは存在しない(LoopBuilder は削除済み)。
- 「わからないパターン」は必ず
[joinir/freeze]系の明示エラーにして、サイレントフォールバックはしない。
✅ 最近まとまった大きな塊(超要約)
ここ半年くらいで終わっている主な塊だけをざっくり書くね。
細かいタスク・バグ票・議論は docs/development/current/main/phase-*.md と
docs/development/current/main/joinir-architecture-overview.md に全部残っているので、必要になったときだけそちらを読む想定。
- LoopBuilder 削除ライン(Phase 180 前後)
- LoopBuilder を dev‑only → hard freeze → 物理削除まで完了。
- Loop lowering の SSOT を JoinIR に一本化。
- LoopPattern / Router ライン(Phase 170–179, 244-EX)
- LoopFeatures / LoopPatternKind / PatternRouter / PatternPipelineContext を整備。
- Pattern1–4 の検出・ルーティングを「構造ベース+AST features」で統一(関数名ベタ書き依存を除去)。
- Phase 244-EX で代表ループ(P1〜P4)の classify() 結果をユニットテストで固定。
- Exit / Boundary / ValueId ライン(Phase 172–205)
- ExitMeta / ExitLineReconnector / JoinInlineBoundary(+Builder) / LoopHeaderPhiBuilder を箱化。
- JoinValueSpace(Param/Local 領域)+ PHI 契約 Verifier で ValueId 衝突と PHI 破損を根治。
- P5(Trim/JsonParser) ライン(Phase 171–176, 173–175, 190–193)
- LoopBodyLocal 昇格パイプライン(Trim,
_skip_whitespace,_parse_string簡易版)を構築。 - StringAppend / NumberAccumulation / Complex addend 正規化など、更新式まわりの箱を揃えた。
- LoopBodyLocal 昇格パイプライン(Trim,
- P3/P4 (If‑PHI / Continue) 汎用化ライン(Phase 195–196, 212–215, 220–242-EX)
- multi‑carrier P3 の JoinIR 生成を整理し、if‑sum 最小パターンを AST ベースで一般化(sum+count まで無改造対応)。
- Pattern3/4 if‑sum/continue lowerer を分離箱にして、legacy PoC lowerer と by-name ハードコード(
"sum","count")を削除。 - Pattern4CarrierAnalyzer を純粋な「キャリア解析箱」として仕上げ、continue 正規化・更新式解析をユニットテストで固定。
このあたりが「JoinIR ループ基盤の芯」で、以降の Phase は JsonParser/selfhost の各ループへの適用フェーズ、という位置づけだよ。
- Phase 43/245B Normalized JoinIR(Phase 26–45 完了) ✅
- Structured→Normalized→MIR(direct) パイプライン確立
- Mode system (JoinIrMode) + Capability system (ShapeCapabilityKind)
- Pattern1/2 + JsonParser (_skip_whitespace, _atoi, _parse_number) 全対応
- 詳細: PHASE_43_245B_NORMALIZED_COMPLETION.md
🧭 これからの候補(まだ「やる」とは決めていないメモ)
ここは「やることリスト」ではなく「今後やるとしたらこの辺」というメモだよ。 実際に着手するタイミングで、別途 Phase/タスクを切る想定。
Phase 245B(コード): ✅ 完了(Phase 43/245B の一部)Phase 246-EX(コード): ✅ 完了(Phase 43/245B の一部)- Phase 47-NORM-P3(設計完了+最小dev+direct✅ 2025-12-12): Pattern3 Normalized 設計
- 設計詳細: phase47-norm-p3-design.md
- P3 if-sum を Normalized JoinIR に載せる設計。P2 と同じ ConditionEnv/CarrierInfo/ExitLine インフラを再利用。
- Phase 47-A: Minimal sum_count(dev-only)として、
phase212_if_sum_min.hako相当の最小 if-sum ループを AST ベース lowerer + Structured→Normalized→Structured roundtrip(Runner 経路)+ Normalized→MIR(direct) で検証済み。 - Phase 47-B 以降: array_filter など body-local/MethodCall を含む P3 ループや canonical 昇格は今後の実装フェーズで扱う。
- Phase 48-NORM-P4(設計完了✅+48-A実装完了✅ 2025-12-12): Pattern4 (continue) Normalized 設計+minimal実装
- 設計詳細: phase48-norm-p4-design.md
- ターゲットループ決定: _parse_array skip whitespace(◎ PRIMARY)、_parse_object(○)、_unescape_string/parse_string(△)
- 設計骨格:
continue= 即座のTailCallFn(loop_step, ...)(新命令不要) - P1/P2/P3 と同じ
loop_step(env, k_exit)骨格に載せる - インフラ再利用率: 95%+ (StepKind の ContinueCheck のみ追加)
- Phase 48-A実装(minimal dev-only)完了✅:
- P4 minimal フィクスチャ追加(skip i==2 パターン、単一 carrier
acc) - ShapeGuard: Pattern4ContinueMinimal 検出器実装(構造ベース)
- StepScheduleBox: ContinueCheck step 追加(評価順序: HeaderCond → ContinueCheck → Updates → Tail)
- normalize_pattern4_continue_minimal() 実装(P2 委譲、95%インフラ再利用)
- テスト完備: 4つの integration tests(normalization/runner/VM Bridge 比較×2)
- 939/939 tests PASS(目標938超過達成!)
- P4 minimal フィクスチャ追加(skip i==2 パターン、単一 carrier
- 次ステップ: Phase 48-B (extended multi-carrier) → 48-C (canonical promotion)
- JsonParser 残りループへの JoinIR 展開
_parse_array/_parse_object/_unescape_string/ 本体_parse_stringなど。- 既存の P2/P3/P4+P5 パイプラインをどこまで延ばせるかを docs 側で設計 → コード側はその設計に沿って小さく実装。
- selfhost depth‑2 ラインの再開
.hako側で Program/MIR JSON を読んで JoinIR/MIR/VM/LLVM に流すライン。- JsonParser 側のカバレッジが上がったあとに、小さいループから順に移植する。
- JoinIR Verify / 最適化まわり
- すでに PHI/ValueId 契約は debug ビルドで検証しているので、 必要なら SSA‑DFA や軽い最適化(Loop invariant / Strength reduction)を検討。
📎 このファイルの運用ルール(自分向けメモ)
- 過去フェーズの詳細な ToDo/Done リストは CURRENT_TASK には書かない。
代わりにdocs/development/current/main/phase-*.mdとjoinir-architecture-overview.mdを SSOT として維持する。 - CURRENT_TASK は「あくまで最新のフォーカスと次の候補だけ」に絞る。
目安として このファイル自体は 2〜3画面程度(〜300行以内) に収める。 - 新しい大フェーズを始めたら:
- まず docs 配下に
phase-XXX-*.mdを書く。 - CURRENT_TASK には「そのフェーズの一行要約」と「今のフォーカスかどうか」だけを書く。
- まず docs 配下に