docs: Phase 124 指示書作成(hako_check レガシー削除&JoinIR専用化)

This commit is contained in:
nyash-codex
2025-12-04 06:24:03 +09:00
parent adc10fdf54
commit 26526f91bb

View File

@ -0,0 +1,379 @@
# Phase 124: hako_check レガシー削除 & JoinIR 専用再構築
## 🎯 ゴール
hako_check の MIR 生成経路を **JoinIR 専用化** し、環境変数フラグに頼らずデフォルトで JoinIR 経路を使う。旧 PHI/MIR Builder 経路は hako_check に関しては完全削除。
```
現状Phase 123: NYASH_HAKO_CHECK_JOINIR で 2パス選択可能
目標Phase 124: JoinIR 一本専用化&レガシー削除
```
## 📋 スコープ(やること・やらないこと)
### ✅ やること
1. docs の 2パス図を 1本JoinIR 一本)に畳む
2. NYASH_HAKO_CHECK_JOINIR フラグを廃止
3. MIR Builder から hako_check 用 legacy lowering を削除
4. try_cf_if_joinir() / try_cf_loop_joinir() を JoinIR 専用に確定
5. テスト・CURRENT_TASK を JoinIR Only 前提に更新
### ❌ やらないこと
- JoinIR Lowerer 自体の仕様変更
- hako_check 診断ルールHC001-031のロジック変更
## 🏗️ 5 つのタスク
### Task 1: ドキュメントの 2パス図を 1本に畳む
**ファイル**:
- `docs/development/current/main/hako_check_design.md`
- `docs/development/current/main/phase121_hako_check_joinir_design.md`
**現在の図Phase 123**:
```
┌─ Legacy Path NYASH_HAKO_CHECK_JOINIR=0
│ .hako → Parse → MIR Builder (legacy) → VM
└─ JoinIR Path NYASH_HAKO_CHECK_JOINIR=1
.hako → Parse → MIR Builder → JoinIR Lowerer → VM
```
**目標の図Phase 124**:
```
JoinIR Only:
.hako → Parse → AST → MIR Builder (JoinIR if/loop lowering) → MIR → VM
```
**更新内容**:
```markdown
## hako_check 実行フローPhase 124 JoinIR 専用化)
### アーキテクチャ
```
Input: .hako script
Tokenize & Parse → AST
MIR Builder (JoinIR lowering for if/loop)
MIR (SSA form with PHI nodes)
VM Interpreter
Diagnostic Output
```
### 設計の進化
- **Phase 121**: JoinIR 統合設計
- **Phase 123**: 環境変数フラグで 2パス選択可能に
- **Phase 124**: JoinIR 一本化&レガシー削除
```
**Phase 121 docs に追加**:
```markdown
## Phase 122124 実装完了サマリー
### Phase 123: 環境変数スイッチ導入
- NYASH_HAKO_CHECK_JOINIR で 2パス選択可能に
### Phase 124: JoinIR 専用化&レガシー削除
- NYASH_HAKO_CHECK_JOINIR を廃止
- MIR Builder から legacy if/loop lowering を削除
- hako_check は JoinIR 一本化
- 旧経路は他モード用途から削除v確認
### 成果
✅ hako_check + selfhost Stage-3 が JoinIR 統一パイプラインで動作
✅ ドキュメント・実装・テストが JoinIR 前提に統一
```
### Task 2: NYASH_HAKO_CHECK_JOINIR フラグの完全削除
**方針**: パターン A完全削除を採用
**削除対象**:
1. **src/config/env/hako_check.rs**:
```rust
// ❌ 以下を完全削除
pub fn hako_check_joinir_enabled() -> bool {
matches!(
std::env::var("NYASH_HAKO_CHECK_JOINIR").as_deref(),
Ok("1") | Ok("true")
)
}
```
2. **src/config/env.rs**:
- `pub mod hako_check;` を削除 or hako_check モジュール自体を削除
3. **docs/reference/environment-variables.md**:
- NYASH_HAKO_CHECK_JOINIR セクション削除
**記録方法**:
```markdown
### NYASH_HAKO_CHECK_JOINIR (削除済み - Phase 124
このフラグは Phase 123 で導入され、hako_check の legacy/JoinIR 2パス切り替え用でした。
Phase 124 で JoinIR 一本化により廃止。
**理由**: hako_check は現在 JoinIR 専用のため、環境変数による選択が不要。
**備考**: 他の用途で legacy if/loop lowering が必要な場合は NYASH_LEGACY_PHI=1 などで対応。
```
### Task 3: MIR Builder から legacy path を削除
**ファイル**:
- `src/mir/builder/if_form.rs` (cf_if())
- `src/mir/builder/control_flow.rs` (cf_loop() など)
**現在の分岐Phase 123**:
```rust
pub fn cf_if(&mut self, ...) -> Result<...> {
if hako_check_joinir_enabled() {
// JoinIR 経路
self.try_cf_if_joinir(...)
} else {
// Legacy 経路
self.lower_if_form(...)
}
}
```
**Phase 124 での処理**:
#### Option 1: hako_check モードの判定で分ける
```rust
pub fn cf_if(&mut self, ...) -> Result<...> {
if self.is_hako_check_mode() {
// hako_check は常に JoinIR
self.try_cf_if_joinir(...)? // Fail-Fast: error ならエラー確定
} else {
// 他のモード(あれば)は legacy をキープ
self.lower_if_form(...)
}
}
```
#### Option 2: 完全一本化(推奨)
もし他のモードでも legacy lowering が不要なら:
```rust
pub fn cf_if(&mut self, ...) -> Result<...> {
// 常に JoinIR全モード統一
self.try_cf_if_joinir(...) // Fail-Fast
}
```
**確認方針**:
1. hako_check 経路以外で lower_if_form() を使っている箇所を検索
2. 使っていなければ削除
3. 使っていれば、そのモード用のフラグで分岐を維持
**フォールバック処理の廃止**:
- Phase 123 の try_cf_if_joinir() に「JoinIR 不可 → legacy fallback」があれば削除
- Fail-Fast 原則に従い、JoinIR が適用できないパターンはエラーにする
```rust
// ❌ 削除対象(フォールバック)
if use_joinir {
match self.try_cf_if_joinir() {
Ok(phi_val) => return Ok(phi_val),
Err(_) => {
// fallback to legacy ← これを削除
return self.lower_if_form();
}
}
}
// ✅ Phase 124 版Fail-Fast
if self.is_hako_check_mode() {
self.try_cf_if_joinir()? // Error は即座に伝播
}
```
### Task 4: テスト更新JoinIR Only を正とする)
**ファイル**:
- `local_tests/phase123_*.hako` (4ケース)
- `tools/smokes/v2/profiles/integration/hako_check_joinir.sh`
**テストケース修正**:
1. **テスト実行方法を簡略化**:
```bash
# Phase 123 形式(削除対象)
NYASH_HAKO_CHECK_JOINIR=0 ./target/release/nyash test.hako # ❌ 削除
NYASH_HAKO_CHECK_JOINIR=1 ./target/release/nyash test.hako # ← これだけ残す
# Phase 124 形式(推奨)
./target/release/nyash test.hako # JoinIR 一本で動く前提
```
2. **smoke スクリプトhako_check_joinir.shの修正**:
```bash
#!/bin/bash
# Phase 124: hako_check JoinIR Only テスト
test_cases=(
"phase123_simple_if.hako"
"phase123_nested_if.hako"
"phase123_while_loop.hako"
"phase123_if_in_loop.hako"
)
echo "=== hako_check JoinIR Only Mode ==="
for case in "${test_cases[@]}"; do
# 環境変数なし(デフォルト JoinIRで実行
./target/release/nyash "local_tests/$case" || exit 1
echo "✓ $case"
done
echo "All tests PASSED"
```
3. **テスト名・コメント更新**:
- ファイル名: `phase123_*.hako` → `hako_check_joinir_*.hako`(または keep
- コメント: "Phase 123 JoinIR test" → "Phase 124 JoinIR Only (stable)"
4. **Phase 120/121 docs に追記**:
```markdown
### hako_check 代表パスの JoinIR 統一化Phase 124
hako_check の stable paths すべてが JoinIR 専用パイプラインで動作確認済み:
- ✅ simple_if.hako
- ✅ nested_if.hako
- ✅ while_loop.hako
- ✅ if_in_loop.hako
legacy 経路は削除済み)
```
### Task 5: docs / CURRENT_TASK を第2章クローズ仕様にする
**ファイル**:
- `docs/development/current/main/hako_check_design.md`
- `docs/development/current/main/phase121_hako_check_joinir_design.md`
- `CURRENT_TASK.md`
**hako_check_design.md に追加**:
```markdown
## Phase 124: JoinIR 専用化&レガシー削除(完了)
### 変更内容
- ✅ NYASH_HAKO_CHECK_JOINIR フラグを廃止
- ✅ MIR Builder から legacy if/loop lowering を削除
- ✅ hako_check は JoinIR 一本化
- ✅ Fail-Fast 原則でエラーハンドリングを統一
### 実行フロー(最終版)
```
.hako script
Parse & Tokenize → AST
MIR Builder (JoinIR lowering for if/loop)
MIR with PHI nodes
VM Interpreter
Diagnostic Report
```
### テスト状況
- 代表 4 ケース: 全て JoinIR Only で PASS
- legacy 経路: 削除確認済み
```
**Phase 121 docs に "Chapter Close" セクション追加**:
```markdown
## JoinIR/selfhost 第2章 完了
### 設計フェーズPhase 121
- If/Loop の JoinIR 統合設計
- hako_check 代表パス洗出し
### 実装フェーズPhase 122-124
- Phase 122: println/log 統一
- Phase 123: hako_check に JoinIR スイッチ導入
- Phase 124: JoinIR 専用化&レガシー削除
### 成果
✅ hako_check は JoinIR 一本化
✅ selfhost Stage-3 + hako_check が統一パイプラインで動作
✅ ドキュメント・実装・テストが統一
### 次章予告
次は selfhost Stage-4高度なパターン対応への準備を進める。
```
**CURRENT_TASK.md に追加**:
```markdown
### Phase 124: hako_check レガシー削除 & JoinIR 専用再構築 ✅
**完了内容**:
- NYASH_HAKO_CHECK_JOINIR フラグを廃止
- MIR Builder から legacy if/loop lowering を削除hako_check用
- hako_check は JoinIR 一本化
- 代表テスト 4 ケースで JoinIR Only 動作確認
**テスト結果**:
- 4/4 PASS全て JoinIR 専用)
**成果**:
- JoinIR/selfhost 第2章 完了
- hako_check + selfhost Stage-3 が統一パイプラインで動作
- ドキュメント・実装・テストが統一
**次フェーズ**: selfhost Stage-4 拡張 or 次の大型改善へ
```
## ✅ 完成チェックリスト
- [ ] hako_check_design.md の図を 2パス → 1本に更新
- [ ] phase121_hako_check_joinir_design.md に "Phase 122-124 実装完了" セクション追加
- [ ] NYASH_HAKO_CHECK_JOINIR フラグを src/config/env/hako_check.rs から削除
- [ ] docs/reference/environment-variables.md から NYASH_HAKO_CHECK_JOINIR を削除
- [ ] MIR Builder の cf_if() / cf_loop() から NYASH_HAKO_CHECK_JOINIR 分岐を削除
- [ ] try_cf_if_joinir() / try_cf_loop_joinir() のフォールバック処理を削除Fail-Fast
- [ ] hako_check モード判定がある場合、legacy path 削除後も分岐を確認
- [ ] local_tests/phase123_*.hako テストを環境変数なしで実行確認
- [ ] hako_check_joinir.sh を更新環境変数削除、JoinIR Only 前提)
- [ ] テスト実行: 4/4 PASS 確認
- [ ] CURRENT_TASK.md に Phase 124 完了を記録
- [ ] ビルドエラーなしZero errors
## 所要時間
**2.5時間程度**
- Task 1 (ドキュメント更新): 30分
- Task 2 (フラグ削除): 20分
- Task 3 (legacy path 削除): 45分
- Task 4 (テスト更新): 30分
- Task 5 (最終ドキュメント): 15分
## 次のステップ
**selfhost Stage-4 拡張** または **次の大型改善フェーズ**
JoinIR/selfhost 第2章が完了し、hako_check + selfhost が統一パイプラインで動作。
今後はさらに複雑なパターン対応やパフォーマンス最適化へ進める準備が整った。
---
**進捗**:
- ✅ Phase 122-126: ConsoleBox 改善・統合
- ✅ Phase 123 proper: hako_check JoinIR 基盤構築
- 🎯 Phase 124: hako_check レガシー削除 & JoinIR 専用化 ← **現在のフェーズ**
- 📋 次: selfhost Stage-4 or 次大型フェーズ