304 lines
9.1 KiB
Markdown
304 lines
9.1 KiB
Markdown
# Phase 32: Hakorune Static Analyzer - Dead Code Detector MVP
|
||
|
||
**Status**: 計画完了、実装準備中(構造改訂版)
|
||
**期間**: 1週間(7日、2025-10-20 → 2025-10-27)
|
||
**担当**: Claude + ChatGPT協調
|
||
**優先度**: HIGH ⭐⭐⭐⭐⭐
|
||
**Ring位置**: Ring-1(Meta/自己ホスト)
|
||
|
||
---
|
||
|
||
## 🎯 目標
|
||
|
||
**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-1(Meta/自己ホスト)に属する開発ツール**
|
||
- 将来のコンパイラと密に連携する前提
|
||
- 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限定)
|
||
|
||
```bash
|
||
# 追加チェック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
|
||
|
||
```hako
|
||
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本(緑)**:
|
||
```bash
|
||
# 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本(診断文言固定)**:
|
||
```bash
|
||
# 不正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)
|
||
```bash
|
||
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 path(Day 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.md`(SSOT要約を 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
|