Files
hakorune/CURRENT_TASK.md
nyash-codex 573c9e90b6 docs(phase80/81): Phase 80/81 完了状態をドキュメントに反映
Phase 80/81 Implementation Summary:
- Phase 80 (c61f4bc7): JoinIR 本線統一(代表 if/loop)
  - should_try_joinir_mainline() 等の SSOT ヘルパー実装
  - NYASH_JOINIR_CORE=1 で JoinIR→MIR が既定に
- Phase 81 (a9e10d2a): selfhost Strict + Fail-Fast
  - selfhost_build.sh に --core/--strict オプション追加
  - 環境変数自動伝播(NYASH_JOINIR_CORE/STRICT)
- Phase 82 (93f51e40): JOINIR_TARGETS SSOT 化
  - is_loop_lowered_function() テーブル参照統一

Documentation Updates:
- docs/private/roadmap2/phases/phase-80-joinir-mainline/README.md
  - Section 80-2: 実装完了マーク追加
  - Section 80-5: commit hash 付きメモ更新
- docs/private/roadmap2/phases/phase-81-joinir-strict/README.md
  - Section 81-4: Done/TODO チェックボックス更新
  - Section 81-4-A: selfhost_build.sh 統合実装詳細追加
- CURRENT_TASK.md
  - Phase 80/81 完了マーク追加(今後の優先タスク順)
  - Phase 82 次の焦点として明記

Next Focus:
- Phase 82-if-phi-retire: if_phi.rs 削除準備開始
2025-12-02 14:07:19 +09:00

18 KiB
Raw Blame History

Current Task — JoinIR / PHI 削減スナップショット2025-11-29 時点)

このファイルは「今どこまで終わっていて、次に何をやるか」を 1000 行以内でざっくり把握するためのスナップショットだよ。
過去の詳細ログは docs/private/roadmap2/CURRENT_TASK_2025-11-29_full.md や各 Phase の README/TASKS を見てね。


0. 現在地ざっくり

  • JoinIR ラインは Phase 68 で一旦 Chapter Close

    • Phase 27-67 で JoinIR の「第1章構造 + PHI + 型ヒント SSOT」が完了。
    • 4つの柱Structure / Scope / JoinIR / Type Hintsが確立。
    • Trio 削除ラインPhase 70 完了を経て、wasm/Web デモラインと最適化ラインに分岐。
    • 詳細: phase-30-final-joinir-world/README.md
  • 最終ゴール

    • 制御構造と PHI の意味論は JoinIRLoopScopeShape/IfPhiContext 等の薄い箱) に一本化する。
    • 実行の SSOT は VM / LLVM ラインとし、JoinIR→MIR→VM/LLVM は「構造 SSOT → 実行 SSOT」への変換として扱う。
    • 既存の PHI 箱if_phi.rs / PhiBuilderBox / conservative.rs / Trio 等は、JoinIR 側のカバレッジが十分になったところから順に削っていく。
  • Stage-3 parser デフォルトON化Phase 30.1 完了): config::env::parser_stage3_enabled() で NYASH_FEATURES=stage3 をSSOT化し、legacy env は明示OFF専用の互換に縮退。

  • JoinIR Strict 着手Phase 81: NYASH_JOINIR_STRICT=1 で代表パスのフォールバックを禁止JoinIR失敗は即エラー。dev/trace は観測のみ継続。

  • これからPhase 69+

    • wasm/Web デモライン: JoinIR ベースの軽量デモ実装。
    • 最適化ライン: JoinIR の最適化パスと LLVM/ny-llvmc 統合。
    • Trio 削除ライン: 完了Phase 70、LoopScopeShape SSOT
    • JoinIR Strict ラインPhase 81: 代表 If/Loop/VM ブリッジについては NYASH_JOINIR_STRICT=1 で常に JoinIR 経路のみを通すようにし、レガシー if_phi / LoopBuilder / 旧 MIR Builder は「未対応関数専用」に縮退。

1. JoinIR 第1章完了までの道のりPhase 3367 簡潔版)

Phase 33-62: 構造 + PHI + スコープの基盤構築 完了

  • Phase 33-34: IfSelect/IfMerge lowering 実装、AST→JoinIR Frontend 設計・実装If/Loop/Break/Continue
  • Phase 35-36: PHI 箱削減 HIGH/MEDIUM537行削減: if_body_local_merge / phi_invariants / LoopSnapshotMergeBox 縮退)
  • Phase 37-40: If 側 PHI Level 1/2設計array_ext.filter 移行、collect_assigned_vars 削除)
  • Phase 41-46: If 側 PHI Level 3NestedIfMerge、read_quoted_from、IfMerge 拡張)
  • Phase 49-56: JoinIR Frontend 本線統合print_tokens / filter
  • Phase 57-62: If 側 PHI 本体削減conservative.rs 縮退、If Handler 箱化、PHI Core Cleanup

詳細: 各 Phase の README を参照(docs/private/roadmap2/phases/phase-*/README.md


Phase 63-67: 型ヒントライン完全実装 完了2025-11-30

Phase 63-3: JoinIR 型ヒント最小配線

  • JoinInst::SelectMergePairtype_hint: Option<MirType> 追加
  • 13ファイル更新、全 JoinIR テスト PASS

Phase 63-4: infer_type_from_phi 縮退設計

  • 型ヒント優先+従来ロジックフォールバック仕様を docs 化
  • 削除条件 5/5 を定義P1: IfSelectTest, P2: read_quoted/IfMerge, P3: Method/Box

Phase 63-5: infer_type_from_phi 縮退実装

  • infer_type_from_phi_with_hint() 実装(+44行
  • lifecycle.rs で呼び出し経路統一
  • 削除条件達成率: 3/560%

Phase 63-6: P1 ケース型ヒント完全実装

  • MirInstruction::Phitype_hint 追加21ファイル修正
  • JoinIR→MIR Bridge で型ヒント伝播実装
  • P1 ケースIfSelectTest.*)で JoinIR 型ヒントのみで型決定
  • 削除条件達成率: 4/580%

Phase 64: P2 型ヒント拡大

  • P2 ケースread_quoted_from, IfMerge型ヒント実装
  • is_type_hint_target() 箱化TypeHintPolicy 萌芽)
  • 削除条件達成率: 4.5/590%

Phase 65: P3-A/B 型ヒント実装

  • P3-A: type_inference.rs 新設、JoinInst::MethodCall に型ヒントStringBox メソッド)
  • P3-B: JoinInst::NewBox に型ヒントBox コンストラクタ)
  • 代表ケースベースで削除条件 5/5 達成

Phase 66: P3-C ジェネリック型推論箱化

  • generic_type_resolver.rs 新設180行
  • TypeHintPolicy::is_p3c_target() 追加
  • ArrayBox.get / MapBox.get 等のジェネリック型推論基盤確立

Phase 67: P3-C 実利用への一歩

  • phase67_generic_type_resolver.rs テスト追加3テスト全 PASS
  • lifecycle.rs に P3-C 経路フック追加GenericTypeResolver 優先使用)
  • A/B テストで旧経路との一致確認11 tests PASS

技術的成果:

  • JoinIR が構造 + PHI + 型ヒントの SSOT として確立
  • infer_type_from_phi は P3-C フォールバック専用に縮退
  • 4つの柱Structure / Scope / JoinIR / Type Hints完成

Phase 69: MIR 決定性 & Trio 経路の整理 一部完了2025-11-30

  • 目的: LoopSnapshotMergeBox / LoopForm 周辺の Inspector/Trio 依存を整理しつつ、MIR の predecessor 順を決定的にしてフラッキーテストを解消する。
  • 実績:
    • 69-1: LoopSnapshotMergeBox と Trio 経路の現状を確認し、merge_exit_with_classification が LocalScopeInspectorBox を引き回しているだけであり、情報自体は LoopScopeShape/ExitAnalysis 側に揃っていることを整理。
    • 69-2: merge_exit_with_classification から Inspector 引数を削除し、LoopScopeShape/ExitAnalysis 経由で必要な情報を取る形に縮退(約 42 行削減)。既存の 3 テストはすべて PASS。
    • 69-3: BasicBlock.predecessorsHashSetBTreeSet に変更するなど、MIR の predecessor イテレーションを決定的にし、これまで非決定性でフラッキーだった 2 つのループ系テストを安定化。loopform 14/14 / merge_exit 3/3 を含む関連テストはすべて PASS。
  • 未了:
    • 69-5: conservative.rs の docs/ 移設も今後の小フェーズとして残しておく。
  • 追加完了 (Phase 70):
    • 69-4: Trio 3 箱LoopVarClassBox / LoopExitLivenessBox / LocalScopeInspectorBoxを削除し、LoopScopeShape を SSOT とする構成に移行。2025-12-01 時点でコードベース再スキャン済みで、Trio 本体ファイルおよび Trio Box 直接参照は src/mir/ から完全に除去されていることを確認名称としての「Trio」は docs の歴史メモ内にのみ残存)。

2. 次の一手Phase 69+

直近の候補タスク

  • P3-C 拡大 / If PHI 本体削除Phase 70+ 候補)

    • GenericTypeResolver 経由で全 P3-C ケースをカバー
    • infer_type_from_phi 本体削除と if_phi.rs 大掃除
  • Phase 71: SelfHosting 再ブートストラップ(初回観測完了! 2025-12-02

    • docs/private/roadmap2/phases/phase-71-selfhost-reboot/README.md で代表パス 1 本Stage3 + JoinIR 前提)と ENV 方針を整理済み。
    • 代表パス(確定): NYASH_FEATURES=stage3 NYASH_USE_NY_COMPILER=1 NYASH_NY_COMPILER_EMIT_ONLY=1 NYASH_SELFHOST_KEEP_RAW=1 ./tools/selfhost/selfhost_build.sh --in apps/tests/stage1_run_min.hako --run
    • Phase 71初回実行成果 (2025-12-02):
      • Phase 70完了直後にPhase 71代表パス実行成功
      • RAW観測レイヤ活用成功 (logs/selfhost/stageb_20251202_101623_2665649.log 707K)
      • 根本原因特定: SSA undef (4件) + dev verify (1件) が Program JSON emit失敗を引き起こしている
      • JoinIR/プラグイン初期化は 問題なし (JoinIR経路正常動作、プラグイン成功確認)
    • SSA undef詳細 (初回観測時):
      1. ParserCommonUtilsBox.trim/1 - ValueId(272)未定義
      2. ParserBox.trim/1 - ValueId(272)未定義
      3. Main._parse_number/1 - ValueId(12)未定義
      4. ParserBox.parse_block2/2 - ValueId(440)未定義
        → Phase 71-SSA での .hako 側整理により、現在はいずれも解消済みSSA undef 13件→0件
    • dev verify警告 (初回観測時): StageBDriverBox NewBox直後にbirth()未呼び出し
      → StageBDriverBox が static box であることを考慮し、lifecycle.rs 側の特例で警告は解消済み。
    • 完了判定基準: 観測窓としてのPhase 71は完了。代表 selfhost パスで JSON v0 emit→VM 実行(出力 abc)まで通ることを確認済みで、
      SSA 修正は今後 StageB 他ケースと s3/parity 系にフォーカスする。
    • 詳細レポート: docs/development/current/main/phase71-findings-20251202.md と Phase 71-SSA 追加レポート
    • quick プロファイルでは JoinIR/VM 系は緑維持を目標としつつ、selfhost_minimal / stageb_min_emit は「SSA ラインの観測窓」として赤許容。StageB/SSA 起因の赤は Phase 71-SSA 側でハンドルする。
  • Phase 72: JoinIR dev フラグ棚卸し

    • config::env::joinir_core_enabled() / joinir_dev_enabled() を追加し、Core/DevOnly/Deprecated の区分を整理。
    • NYASH_JOINIR_EXPERIMENTHAKO_JOINIR_IF_SELECT を含む JoinIR 関連フラグの読み書きを、
      src/config/env/joinir_dev.rs / src/tests/helpers/joinir_env.rs 経由の SSOT に統一(本体コードからの std::env 直読みを排除)。
    • docs/private/roadmap2/phases/phase-72-joinir-dev-flags/README.md に一覧表と実装状況メモを追加済み。
  • Phase 73: ENV 整理・不要フラグ削除JoinIRStage3 周辺)

    • docs/private/roadmap2/phases/phase-73-env-cleanup/README.md に Stage3 / JoinIR / その他 ENV の棚卸しと Dead/Alias/Keep の分類方針を追加
    • 実コードからは parser_stage3_enabled() / joinir_core_enabled() / joinir_dev_enabled() 経由で判定し、legacy/env 名は Alias-only 扱いとして段階的に削除候補へ寄せていく
    • Stage3 旧 ENV は tools/selfhost/hako_check + JoinIR/LoopForm/PHI テスト + Stage1/SSA 代表テストBatchCからは排除済みで、残りは dev/perf 用や一部 SSA/StageB 系テストと docs の歴史メモに限定されているPhase 7311 で現状を棚卸し済み)
  • Phase 73-7: Stage3 旧 ENV の縮退

    • tools/selfhost/hako_check から NYASH_PARSER_STAGE3 / HAKO_PARSER_STAGE3 を順次削除し、Stage3 gate を NYASH_FEATURES=stage3 ベースに移行開始
    • Rust tests 側の Stage3 alias は次フェーズでグループごとに NYASH_FEATURES=stage3 へ寄せる予定
  • Phase 73-8: Rust tests BatchA の Stage3 ENV 縮退

    • JoinIR/PHI 周辺の代表テストmir_loopform_* / mir_joinir_* の一部)を対象に、NYASH_PARSER_STAGE3 / HAKO_PARSER_STAGE3NYASH_FEATURES=stage3 に置き換え開始
  • Phase 73-9: Rust tests BatchB の Stage3 ENV 縮退

    • 残りの JoinIR 系テストjoinir_runner_min / mir_joinir_* / joinir_json_min / joinir_vm_bridge_* / joinir/mainline_phase49についても、Stage3 旧 ENV を廃止し NYASH_FEATURES=stage3 ベースに統一
  • wasm/Web デモラインPhase 71 候補)

    • JoinIR ベースの軽量デモ実装
    • ブラウザで動く最小構成
  • 最適化ラインPhase 72+ 候補)

    • JoinIR 最適化パス実装
    • LLVM/ny-llvmc 統合強化

今後の優先タスク順selfhost + hack_check 観点の整理)

  1. Phase 71-SSA/selfhost 再ブートストラップの収束
    • 代表パスselfhost_build + stage1_run_min.hakoが JSON v0 emit→VM 実行まで通ることは確認済みとし、 以降は StageB 他ケースと s3/parity 系を「SSA ラインの観測窓」として整理していく。
    • この段階では JoinIR Strict は代表 if/loop/VM ブリッジに限定し、selfhost_minimal/stageb_min_emit の赤は SSA 側の課題として扱う。
  2. Phase 7273: ENV / JoinIR dev フラグの集約完了
    • joinir_core_enabled() / joinir_dev_enabled() / parser_stage3_enabled() を SSOT として使い切り、tools/selfhost/hako_check/tests から旧 ENV を整理する。
    • ここまでで「selfhost / hack_check / tests が同じ Stage3 + JoinIR/ENV ポリシー上に乗る」状態を目指す。
  3. Phase 80: VM/LLVM 本線の JoinIR 統一 完了2025-12-02 c61f4bc7
    • 代表 if/loop の本線化を実装。joinir_core_enabled() 時は JoinIR→MIR 経路が既定となり、レガシー経路は JoinIR 未対応ケース専用に縮退。
    • SSOT ヘルパー(should_try_joinir_mainline() / should_panic_on_joinir_failure())を実装。
    • Phase 82: JOINIR_TARGETS テーブル SSOT 化93f51e40完了。
  4. Phase 81: selfhost 用 JoinIR Strictfail-fast の確立 完了2025-12-02 a9e10d2a
    • selfhost_build.sh に --core / --strict オプション追加。環境変数 NYASH_JOINIR_CORE / NYASH_JOINIR_STRICT を子プロセスに自動伝播。
    • 代表パスskip_ws / trim / resolve / print_tokens / filter / Stage1/StageB 代表)が JoinIR 経由でのみ通る Strict モード実装完了。
    • hack_check ラインは引き続き「Stage3 + 旧 MIR Builder + VM」の安定ルートとして維持。
  5. Phase 82-if-phi-retire: P3-C 完了if_phi.rs 削除次の焦点
    • P3-C 代表ケースを含む型決定を GenericTypeResolver で食い切り、lifecycle.rs から infer_type_from_phi* 呼び出しを排除する。
    • collect_assigned_vars_via_joinir を JoinIR/AST 側の分析モジュールに移し、phi_core::if_phi への参照をゼロにした上で if_phi.rs を削除する。
    • 必要であれば、後続フェーズで hack_check 側も JoinIR/型ヒントラインに徐々に寄せていくただし現時点では「selfhost を先に Strict 化、hack_check は安定 VM ライン維持」を優先)。

バックログ

  • StageB/selfhost smokes の扱い整理Phase 30.1 フォロー)

    • quick プロファイルで stage1_launcher_* / phase251* 系が Stage3 デフォルト環境で不安定。今後、quick では SKIP にするか、StageB emit 抽出ロジックを安定化するかを決める。
    • MirFunction.blocks: HashMapBTreeMap で非決定的テスト解消
    • Phase 25.1 同様のパターン適用
    • selfhost StageB 子プロセスへのソース渡し経路の簡素化(--source "$SRC_CONTENT" で argv を肥大化させず、HAKO_SRC 環境変数や一時ファイル経由に統一する設計を将来フェーズで検討)。
  • Phase 71-SSA: StageB / selfhost ラインは「SSA デバッグ用の観測窓」として切り出し、
    代表パスselfhost_build + stage1_run_min.hakoが JSON v0 emit まで通るかどうかを別フェーズで追う。
    詳細: docs/private/roadmap2/phases/phase-71-ssa-debug/README.md

  • Phase 81-JoinIR-Strict: JoinIR を「if/loop/PHI の真」として扱い、
    JoinIR 対象関数では if_phi / LoopBuilder / 旧 MIR Builder にフォールバックしない Strict モードを導入する。
    代表 If/Loopmir_joinir_if_select / mir_stage1_staticcompiler_receiver / mir_joinir_stage1_using_resolver_min
    NYASH_JOINIR_CORE=1 NYASH_JOINIR_STRICT=1 で全て green を確認済みStrict で lowering 失敗なし)。
    代表パスskip_ws / trim / resolve / print_tokens / filter / read_quoted / Stage1/StageB 代表)では、
    JoinIR lowering / VM ブリッジ失敗を即エラー扱いとし、レガシー経路は「未対応関数専用」に縮退させる。

  • Phase 82-if-phi-retire予定: P3-C ジェネリック型推論ラインを拡張し、
    lifecycle.rs から infer_type_from_phi* 呼び出しを完全に排除するP3-C まで GenericTypeResolver で食い切る)。
    あわせて collect_assigned_vars_via_joinir を JoinIR/AST 側の分析モジュールに移動し、
    phi_core::if_phi への実コードからの参照をゼロにした上で if_phi.rs 本体を削除する(歴史メモは docs 側にのみ保持)。

  • Phase 74-SSA-static-delegation将来フェーズ候補: Phase 71-SSA で判明した「static box 委譲時に ValueId マッピングが壊れる」
    Rust MIR ビルダー側の根本バグを正式に修正するライン。
    現 HEAD では .hako 層で ParserBox → ParserStringUtilsBox などの委譲を外すことで SSA undef は 13件→0件に根治しており、
    最小 .hako ではバグを再現できないため、MIR Builder の修正は 再現用テストを用意できる将来フェーズに委譲する。
    当面は「box→static box への薄い委譲メソッドを増やさない」というコーディング規約で安全運用し、
    Phase 74 では commit 13ce9e68 以前の形を元にした再現用テストMIR Builder 修正+委譲パターンの復活をまとめて扱う。


3. 旧フェーズ(過去ログへのポインタ)

古いフェーズの詳細な経緯やログは、以下のドキュメントと
docs/private/roadmap2/CURRENT_TASK_2025-11-29_full.md を見てね。

  • Phase 21.7 — Static Box Methodization
    • StaticMethodId / NamingBox で BoxName.method/arity 名前解決の SSOT 化。
    • docs: docs/development/current/main/phase-21.7-naming-ssot-checklist.md など。
  • Phase 25.x / 26.x — LoopForm v2 / LoopSSA v2 / Exit PHI / ExitLiveness
    • LoopForm v2 / LoopSSA v2 の整備と Exit PHI / ExitLiveness まわりの 4 箱構成。
  • Phase 2732 — JoinIR 初期実験〜汎用化
    • LoopToJoinLowerer / LoopScopeShape / JoinIR VM Bridge を minimal ケースから Stage1 / StageB へ広げていくライン。
    • docs: docs/private/roadmap2/phases/phase-27-joinir*, phase-31-looptojoin-lowerer, phase-32-joinir-complete-migration など。

CURRENT_TASK.md 自体は「いまどこを触っているか」と「次に何をやるか」を
1 画面で把握できる軽さを維持する方針だよ。***