docs: Phase 124 指示書作成(hako_check レガシー削除&JoinIR専用化)
This commit is contained in:
@ -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 122–124 実装完了サマリー
|
||||||
|
|
||||||
|
### 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 次大型フェーズ
|
||||||
Reference in New Issue
Block a user