Files
hakorune/docs/development/current/main/phase153_hako_check_deadcode.md
nyash-codex d75bbf4f90 docs(phase153): hako_check / dead code 検出モードの復活(指示書作成)
Phase 153 指示書:
- hako_check を JoinIR 専用パイプラインで安定稼働
- dead code 検出モード復活(DeadCodeAnalyzerBox 箱化)
- CLI フラグ `--dead-code` でモード切り替え
- ENV 追加なし(将来必要になったら追加)

6 Tasks:
1. hako_check 現状インベントリ
2. JoinIR 専用パイプライン確認
3. DeadCodeAnalyzerBox 設計(箱化)
4. 実装と CLI 統合
5. テストとスモーク
6. ドキュメント更新

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

Co-Authored-By: Claude <noreply@anthropic.com>
2025-12-04 14:10:51 +09:00

8.2 KiB
Raw Blame History

Phase 153: hako_check / dead code 検出モードの復活JoinIR 版)

0. ゴール

hako_check を JoinIR 専用パイプラインの上で安定稼働させ、以前できていた「未使用関数・デッドコード検出」モードを、今の構造に合わせて復活・整備する。

目的:

  • selfhost / .hako 側のコンパイラコードに対して、hako_check で死んだ関数・到達しない分岐をすぐ見つけられる状態を作る
  • Phase 160+ の .hako JoinIR/MIR 移植に入ったときの安全ネットを確立する

1. Scope / Non-scope

やること

  1. hako_check の現状インベントリ

    • CLI スクリプト (tools/hako_check.sh / tools/hako_check/*.hako) と実行経路を確認
    • 「何をチェックしているか」「以前動いていた dead code モードが今どうなっているか」を整理
  2. JoinIR 専用 hako_check パイプラインの再確認

    • Phase 121124 の設計どおり、AST→JoinIR→MIR→解析が一つの線になっているかを確認・doc 固定
  3. dead code 検出モードの再実装/復活(箱化モジュール化)

    • 「未呼び出しの関数」「reachable ではない cfg ノード」などの検出を、今の JoinIR/MIR 情報から計算
    • 結果を CLI から見やすい形(テキスト)で出力
    • DeadCodeAnalyzerBox として箱化
  4. テストとスモーク

    • 小さい .hako フィクスチャで「明らかに死んでいる関数」が検出できることを確認
    • 既存の hako_check テストが退行していないことを確認

やらないこと

  • JoinIR / MIR の意味論を変えない(解析は「読むだけ」)
  • 新しい Stage3 構文を追加しないPhase 152-A/B で決めた範囲のまま)
  • 環境変数を増やさないCLI フラグ --dead-code のみ。必要になったら後で追加)

2. Task 1: hako_check 現状インベントリ

対象ファイル

  • tools/hako_check.sh
  • tools/hako_check/*.hakoCLI エントリ・本体)
  • docs/development/ 内の hako_check 関連 doc
    • hako_check_design.md
    • phase121_*
    • phase124_hako_check_joinir_finalization.md

やること

  1. hako_check の実行フローを再確認

    • CLI → .hako スクリプト → VM → MirBuilder / JoinIR → 解析、という線を図にする
  2. 以前の dead code モードの存在を調査

    • 関数名に dead / unused / reachability 等が含まれる Box や関数を探す
    • 設計 doc に「dead code モード」がどう書かれていたかを確認
  3. 結果をドキュメントにまとめる

    • docs/development/current/main/phase153_hako_check_inventory.md(新規)に:
      • エントリポイント
      • 現在有効なチェック種類
      • 死んでいる / 途中まで実装されていた dead code 検出の一覧 を書き出す

成果物

  • phase153_hako_check_inventory.md 作成

3. Task 2: JoinIR 専用パイプラインの再確認と固定

目的

Phase 123124 で「hako_check を JoinIR 専用にした」設計が、実際のコードでも守られているか確認

やること

  1. MirBuilder / JoinIR lowering で、hako_check 用の関数がどのルートを通っているかを確認

  2. もしまだ legacy PHI / 旧 LoopBuilder にフォールバックしている箇所があれば:

    • hako_check 経路だけでも確実に JoinIR 経由になるように修正する案を設計(実装は別フェーズでも可)
  3. hako_check_design.md / phase121_integration_roadmap.md に:

    • AST→JoinIR→MIR→hako_check の経路を最終形として追記

成果物

  • パイプライン確認結果の記録(インベントリ doc に追記でも可)

4. Task 3: dead code 検出モードの設計(箱化モジュール化)

目的

hako_check 内で dead code 判定を行う「箱」を 1 個に閉じ込める

方針

  • JoinIR/MIR の CFG/シンボル情報を読んで:
    • 入口(エントリポイント関数)からの到達可能性を DFS/BFS
    • 到達しなかった関数・ブロック・分岐を列挙

箱単位の設計

DeadCodeAnalyzerBox として:

  • 入力: Program JSON v0 / MIR JSON / JoinIR JSON
  • 出力: 「未使用関数名」「未到達ブロックID」のリスト

やること

  1. どのフォーマットを入力にするか決める

    • 解析専用なら MIR JSON v0 / JoinIR JSON のどちらか
    • 既存の hako_check 本体がどちらを見やすいかも考える
  2. Dead code 箱の API を決める(.hako レベルの関数シグネチャ)

  3. 出力フォーマットCLI 表示)のラフ案:

    unused function: Foo.bar/1
    unreachable block: fn=Main.main bb=10 (if false branch)
    

成果物

  • DeadCodeAnalyzerBox の設計API シグネチャ)
  • 入力フォーマット決定

5. Task 4: dead code 検出モードの実装と CLI 統合

実装

  • hako_check 本体 .hako に DeadCodeAnalyzerBox を追加
  • 入口の CLI から、--dead-code フラグで dead code モードを選べるようにする

CLI 挙動

# 従来の基本チェック
hako_check target.hako

# dead code レポートを追加表示
hako_check --dead-code target.hako

環境変数について

  • Phase 153 では ENV 追加なしCLI フラグのみ)
  • 将来「CI からフラグを渡しにくい」等のニーズが出たら、そのときに NYASH_HAKO_CHECK_DEAD=1 を 1 個だけ足す

成果物

  • DeadCodeAnalyzerBox の実装
  • hako_check CLI に --dead-code フラグ追加

6. Task 5: テストとスモーク

テスト用 .hako を 2〜3 本作る

  1. 単純に未使用関数 1 個だけあるケース
  2. 入口から到達しない if/loop 分岐を含むケース
  3. selfhost 関連の .hako から代表 1 本(小さなコンパイラ部品)を選び、未使用関数が検出できるか見る

スモークスクリプト

  • tools/hako_check_deadcode_smoke.sh(など)を作成し:
    • 上のテスト .hako をまとめて実行
    • 期待する dead code 行が出ているかを軽く grep

JoinIR 依存の確認

  • 少なくとも代表 1 本は JoinIR lowering → MIR → hako_check まで通し、 Rust VM と hako_check の結果が論理的に矛盾していないことを確認

成果物

  • テスト .hako 2〜3 本
  • tools/hako_check_deadcode_smoke.sh

7. Task 6: ドキュメント / CURRENT_TASK 更新

ドキュメント更新

  1. phase153_hako_check_inventory.md に:

    • どのモードがあり、今どこまで動くかを確定版として追記
  2. hako_check_design.md を更新:

    • 新しい dead code モードの説明と CLI/API を追加
  3. CURRENT_TASK.md

    • Phase 153 セクションを追加し、以下を 2〜3 行で書く:
      • 「hako_check が JoinIR 専用パイプラインで動き、dead code モードが復活した」
      • 「これを .hako JoinIR/MIR 移植時の安全ネットとして使う」

成果物

  • 各種ドキュメント更新
  • git commit

完成チェックリストPhase 153

  • Task 1: hako_check 現状インベントリ完了
    • phase153_hako_check_inventory.md 作成
  • Task 2: JoinIR 専用パイプライン確認
    • パイプライン図確定・記録
  • Task 3: DeadCodeAnalyzerBox 設計
    • API シグネチャ決定
    • 入力フォーマット決定
  • Task 4: 実装と CLI 統合
    • DeadCodeAnalyzerBox 実装
    • --dead-code フラグ追加
  • Task 5: テストとスモーク
    • テスト .hako 作成2〜3 本)
    • hako_check_deadcode_smoke.sh 作成
  • Task 6: ドキュメント更新
    • phase153_hako_check_inventory.md 確定版
    • hako_check_design.md 更新
    • CURRENT_TASK.md 更新
    • git commit

次のステップ

Phase 153 完了後:

  • Phase 160+: .hako JoinIR/MIR 移植章hako_check が安全ネットとして機能)
  • Phase 200+: Python → Hakorune トランスパイラ構想

作成日: 2025-12-04 Phase: 153hako_check / dead code 検出モードの復活)