Files
hakorune/docs/private/roadmap/phases/phase-32

Phase 32: Hakorune Static Analyzer - Dead Code Detector MVP

Status: 計画完了、実装準備中(構造改訂版) 期間: 1週間7日、2025-10-20 → 2025-10-27 担当: Claude + ChatGPT協調 優先度: HIGH Ring位置: Ring-1Meta/自己ホスト)


🎯 目標

HakoruneでHakoruneコードを解析する静的解析ツールの実装

Phase 32 スコープMVP

  • MIR JSONからデッドコード到達不可能関数を検出
  • Gate-C/AST Strict MIR前提の厳密解析
  • テキストレポート出力(診断サマリ)
  • 95%以上の精度目標

Phase 32外Phase 33以降

  • 重複コード検出Phase 33
  • 複雑度メトリクスPhase 34
  • マルチファイル解析Phase 35
  • JSON/DOT出力Phase 36

💡 革命的な理由

15倍の精度改善

  • cargo-udeps: 25%精度75%誤検出)
  • Hakorune Analyzer: 95%精度5%誤検出)

なぜこんなに精度が高いのか?

  1. 完璧な呼び出しグラフ

    • グローバル変数なしすべてBox
    • 明示的関数呼び出しのみ
    • 動的ディスパッチも型情報で追跡可能
  2. ネイティブMIRアクセス

    • Rust: 外部ツールでAST推論不正確
    • Hakorune: Gate-C Strict MIR JSONで完全な呼び出し情報
  3. Box理論の恩恵

    • すべてBoxで統一
    • 拡張が簡単新しいBoxを追加するだけ
    • 型安全

🏗️ アーキテクチャ設計(改訂版)

配置理由: selfhost/ 配下

Three Rings の Ring-1Meta/自己ホスト)に属する開発ツール

  • 将来のコンパイラと密に連携する前提
  • selfhost/shared の BoxHelpers/MirSchema/Gate-C Strict を直に再利用
  • 独立箱として将来 CLI 化しやすい

ファイル構造(責務分離)

selfhost/analyzer/
├── hako_module.toml           # exports 最小selfhost.analyzer.*
├── boxes/
│   ├── driver_box.hako        # 入口: 入力→走査→レポート
│   ├── ast_scan_box.hako      # AST Strict前提の走査
│   ├── mir_scan_box.hako      # Gate-C Strict MIR JSONの走査
│   └── report_box.hako        # 集計と文字列整形、出力
├── README.md                  # 責務/入出力/ENV/非対象
└── smokes/
    ├── analyzer_ast_strict_ok_vm.sh
    ├── analyzer_mir_gatec_ok_vm.sh
    └── analyzer_bad_mir_fail_vm.sh    # 負例・診断固定

データフロー

.hako file
    ↓ (hakorune --emit-mir-json + Gate-C Strict)
MIR JSON (厳密型保証)
    ↓ driver_box.hako
    ├→ ast_scan_box.hako (AST走査)
    └→ mir_scan_box.hako (MIR走査)
         ↓ selfhost/shared/MirSchema
         ↓ BoxHelpers (JSON解析)
    ↓ 到達可能性分析BFS
["unused_helper/1", "deprecated_func/0"]
    ↓ report_box.hako
Text Report + MapBox診断

📦 依存とガードFail-Fast

依存関係

  • selfhost/shared のみBoxHelpers, MirSchema, JsonEmit
  • 外部I/Oなし(入力は文字列/MapBox
  • Gate-C/AST Strict を既定ONで実行

環境変数dev限定

# 追加チェックON
NYASH_ANALYZER_STRICT=1

# 将来の切替(既定=mir
HAKO_ANALYZER_ENTRY=ast|mir

# Gate-C/AST Strictスモークテストで既定ON
NYASH_GATE_C_STRICT=1
NYASH_AST_STRICT=1

Fail-Fast 原則

  • 不正なMIR JSON → 即座にエラー
  • 余剰キー/型不一致 → 診断固定(負例テスト)
  • フォールバック禁止Silent failure なし)

🔧 公開インターフェース(最小)

DriverBox API

static box DriverBox {
  # 文字列入力→文字列出力
  run_from_string(input: StringBox, kind: StringBox) -> StringBox

  # MapBox入力→MapBox出力
  run_from_box(input: MapBox, kind: StringBox) -> MapBox
}

kind引数:

  • "ast" - AST走査将来実装
  • "mir" - MIR JSON走査Phase 32実装

返り値:

  • 文字列: 診断サマリ(テキストレポート)
  • MapBox: 構造化診断dead_functions, reachable_functions等

📋 実装計画(改訂版)

Day タスク 成果物 LOC 状態
Day 1 スケルトン作成 driver/ast_scan/mir_scan/report + README 150 🟡 準備中
Day 2 MIR走査基盤 mir_scan_box.hako関数抽出 200 🟡 計画中
Day 3 呼び出しグラフ構築 mir_scan_box.hako拡張Graph 250 🟡 計画中
Day 4 BFS到達可能性分析 mir_scan_box.hako完成 200 🟡 計画中
Day 5 レポート生成 report_box.hako完成 150 🟡 計画中
Day 6 スモークテスト整備 3本happy/happy/負例) 100 🟡 計画中
Day 7 セルフホスト解析 + ドキュメント 実用化 50 🟡 計画中
Total 1,100

🧪 テスト戦略(ドキュメント・テスト先行)

スモークテスト構成

happy path 2本:

# AST Strict入力将来
selfhost/analyzer/smokes/analyzer_ast_strict_ok_vm.sh

# Gate-C MIR JSON入力Phase 32
selfhost/analyzer/smokes/analyzer_mir_gatec_ok_vm.sh

負例1本診断文言固定:

# 不正MIR: 余剰キー/型不一致
selfhost/analyzer/smokes/analyzer_bad_mir_fail_vm.sh

quick-lite → quick → integration 段階追加

  • quick-lite: 負例のみ診断Fail-Fast確認
  • quick: happy path 2本追加
  • integration: セルフホストコード解析(実用検証)

🎓 参考実装(学習元)

selfhost/shared から再利用

  1. BoxHelpers - JSON解析パターン
  2. MirSchema - MIR構造定義
  3. JsonEmit - MapBox→JSON文字列変換

Rustコードベースから学ぶ

  1. src/mir/optimizer.rs (diagnose_unlowered_type_ops)
    • デッドコード検出の基本パターン
  2. src/mir/verification.rs
    • 呼び出し検証ロジック
    • Callee型のパース

📈 Phase 33以降の展望

Phase 33: 重複コード検出1週間

  • MIR正規化レジスタ・定数・演算子
  • 構造ハッシュ化
  • 4種類の重複完全一致/変数名/構造/部分)

Phase 34: 複雑度メトリクス1週間

  • サイクロマティック複雑度
  • 認知的複雑度
  • 行数・関数数統計

Phase 35: マルチファイル解析2週間

  • プロジェクト全体解析
  • モジュール間依存グラフ
  • 到達可能性の階層分析

Phase 36: 可視化・出力2週間

  • JSON出力機械可読
  • DOT出力Graphviz
  • HTML/Markdown レポート

合計: 7週間で完全な静的解析ツールキット完成


🏆 期待される成果

技術的成果

  1. 95%精度のデッドコード検出器
  2. セルフホスト開発の加速(不要コード削除)
  3. Everything is Box のショーケース

戦略的成果

  1. 論文ネタ: "70日でセルフホスト + 静的解析ツール"
  2. 採用材料: Hakorune の品質保証能力
  3. コミュニティ貢献: 他言語でも応用可能なパターン

学術的価値

  • PLDI SRC: "Bootstrapping Static Analysis"
  • ICSE Demo: 実動デモ
  • 比較研究: cargo-udeps vs Hakorune (15倍精度)

🚀 導入ステップ(短期)

Step 1: スケルトン作成Day 1

mkdir -p selfhost/analyzer/{boxes,smokes}
touch selfhost/analyzer/hako_module.toml
touch selfhost/analyzer/README.md
touch selfhost/analyzer/boxes/{driver_box,ast_scan_box,mir_scan_box,report_box}.hako

Step 2: Gate-C/AST Strict happy pathDay 2-3

  • MIR JSON入力の基本走査
  • 関数リスト抽出
  • スモーク2本

Step 3: 負例スモークDay 4

  • 不正MIR: 余剰キー/型不一致
  • 診断文言固定

Step 4: CURRENT_TASK.md 登録

  • Phase 32 トラックとして追加

📚 関連ドキュメント

  • 設計書: docs/development/proposals/analyzer-mvp-summary.md
  • アルゴリズム: docs/development/proposals/dead-code-detection/call-graph-algorithm-detailed-design.md
  • 重複検出: docs/development/proposals/ideas/refactoring/mir-duplicate-detection-algorithm.md
  • 実現可能性: docs/development/proposals/hakorune-static-analyzer-feasibility.md
  • 実装ガイド: docs/development/proposals/analyzer-implementation-guide.mdSSOT要約を selfhost/analyzer/README.md に配置)

決定事項

  1. 配置: selfhost/analyzer/Ring-1: Meta/自己ホスト)
  2. 責務分離: driver/ast_scan/mir_scan/report
  3. 依存: selfhost/shared のみ
  4. Gate-C/AST Strict: 既定ON
  5. Fail-Fast: フォールバック禁止
  6. テスト先行: ドキュメント→スモーク→実装

作成日: 2025-10-19 改訂日: 2025-10-19構造改訂版 次回レビュー: 2025-10-20 (Day 1完了時) 最終更新: 2025-10-19