Created comprehensive Phase 197 design document for JoinIR deployment validation on lightweight loops. 1. phase197-lightweight-loops-deployment.md: - Target loops selection (5 loops: 2 JsonParser + 3 tests) - Task breakdown (197-1 to 197-4) - Success criteria and design principles - Deferred loops documentation 2. CURRENT_TASK.md: - Added Phase 197 section with target loop list - Implementation plan (routing check, structure trace, E2E execution) - Next phase candidates (Phase 200+ ConditionEnv, Phase 198+ JsonParser) Target Loops: - _match_literal (P1) - JsonParser simple while - _skip_whitespace (P2) - JsonParser break pattern - phase195_sum_count.hako (P3 multi-carrier) - Phase 196 verified - loop_if_phi.hako (P3 single-carrier) - Phase 196 verified - loop_min_while.hako (P1 minimal) - Phase 165 baseline Ready for Phase 197 implementation. 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
13 KiB
13 KiB
Phase 197: JoinIR 実戦適用(軽量ループライン)
Date: 2025-12-09 Status: Ready for Implementation Prerequisite: Phase 196 complete (Select bug fixed)
目的
Phase 196 までで安定した JoinIR 基盤(P1/P2/P3/P4 + P5 Trim)を、 実戦の小さいループに当てはめて、以下の一連動作を確認する:
- パターン検出: LoopFeatures / router が正しく Pattern を選択
- JoinIR lowering: Pattern lowerer が JoinIR を生成
- MIR 実行: phase195_sum_count.hako 等が正しく動作
スコープ:
- ✅ 既存インフラの検証(新機能追加なし)
- ✅ 軽量ループのみ(3-5本)
- ✅ ドキュメント駆動(実戦適用状況を可視化)
Task 197-1: 対象ループの確定
選定基準
- 既にwhitelisted OR 既存テストで動作実績あり
- 依存関係が少ない(ConditionEnv制約/複雑キャリアなし)
- 代表性がある(P1/P2/P3を1本ずつ)
対象ループ一覧(3-5本)
JsonParser 側(2本)
-
_match_literal(Pattern 1)- Location:
tools/hako_shared/json_parser.hako:357-362 - Pattern: P2 (break via return) → 実際は P1 候補(単純whileとして扱える)
- Carrier: i (IntegerBox)
- Update: i = i + 1
- Status: ✅ Already whitelisted (
JsonParserBox._match_literal/3) - 理由: P1 の最もシンプルなケース(break なし、単純な継続条件)
- Location:
-
_skip_whitespace(Pattern 2)- Location:
tools/hako_shared/json_parser.hako:312-319 - Pattern: P2 (break condition)
- Carrier: p (IntegerBox)
- Update: p = p + 1
- Status: ✅ Already whitelisted (
JsonParserBox._skip_whitespace/2) - 理由: P2 の代表的な break パターン
- Location:
selfhost/tests 側(2本)
-
phase195_sum_count.hako(Pattern 3)- Location:
apps/tests/phase195_sum_count.hako - Pattern: P3 (If-Else PHI, multi-carrier)
- Carrier: sum, count (2キャリア)
- Update:
- then: sum = sum + i, count = count + 1
- else: sum = sum + 0, count = count + 0
- Status: ✅ Phase 196 で動作確認済み(出力: 93)
- 理由: P3 multi-carrier の実証済みケース
- Location:
-
loop_if_phi.hako(Pattern 3 single-carrier)- Location:
apps/tests/loop_if_phi.hako - Pattern: P3 (If-Else PHI, single-carrier)
- Carrier: sum (1キャリア)
- Update: if (i > 2) sum = sum + i else sum = sum + 0
- Status: ✅ Phase 196 で動作確認済み(出力: sum=9)
- 理由: P3 single-carrier の既存実績
- Location:
オプション(5本目)
loop_min_while.hako(Pattern 1 representative)- Location:
apps/tests/loop_min_while.hako - Pattern: P1 (simple while)
- Carrier: i (IntegerBox)
- Update: i = i + 1
- Status: ✅ Phase 165 で動作確認済み(出力: 0,1,2)
- 理由: P1 の最小ケース(比較用)
- Location:
対象外ループ(Phase 197 では扱わない)
- ❌
_parse_number/_atoi: ConditionEnv 制約(digits.indexOf 依存) → Phase 200+ - ❌
_parse_string/_unescape_string: 複雑キャリア → Phase 195+ Pattern3 拡張後 - ❌
_parse_array/_parse_object: 複数 MethodCall → Phase 195+ MethodCall 拡張後
成果物
CURRENT_TASK.md の Phase 197 セクションに以下を追記:
### Phase 197: JoinIR 実戦適用(軽量ループライン)
**対象ループ**:
1. `_match_literal` (P1) - JsonParser 単純 while
2. `_skip_whitespace` (P2) - JsonParser break パターン
3. `phase195_sum_count.hako` (P3 multi-carrier) - 既存実績
4. `loop_if_phi.hako` (P3 single-carrier) - 既存実績
5. `loop_min_while.hako` (P1 minimal) - 比較用
**実施内容**: 構造トレース + E2E 実行 + ドキュメント更新
Task 197-2: routing 更新(JoinIR 経路に載せる)
方針
- 構造ベース判定優先: PatternPipelineContext / LoopPatternKind が自動判定
- 名前ベース whitelist は補助: 既に whitelisted のものはそのまま
- 新規トグル・条件なし: 既存インフラのみで対応
作業内容
1. routing.rs の確認
File: src/mir/builder/control_flow/joinir/routing.rs
確認事項:
_match_literalが whitelist に存在するか_skip_whitespaceが whitelist に存在するか- 構造ベース判定(LoopFeatures)が優先されているか
Expected: Phase 194 で既に whitelisted 済み(変更不要の可能性大)
2. 必要な場合のみ whitelist 追加
// routing.rs の whitelist テーブル(例)
const JOINIR_WHITELIST: &[&str] = &[
"JsonParserBox._skip_whitespace/2", // ✅ 既存
"JsonParserBox._trim/1", // ✅ 既存
"JsonParserBox._match_literal/3", // ✅ 既存
// Phase 197: 追加不要(既に全部 whitelisted)
];
検証
# routing.rs の whitelist を確認
grep -n "JsonParserBox\._match_literal" src/mir/builder/control_flow/joinir/routing.rs
grep -n "JsonParserBox\._skip_whitespace" src/mir/builder/control_flow/joinir/routing.rs
Expected: 既に存在している → 変更不要
Task 197-3: 構造トレースと E2E 実行
手順
1. 構造トレース(失敗しないことの確認)
各対象ループについて、Pattern 選択が正しく動作するか確認。
# Test 1: _match_literal (P1)
NYASH_JOINIR_CORE=1 NYASH_JOINIR_STRUCTURE_ONLY=1 ./target/release/hakorune \
tools/hako_shared/json_parser.hako 2>&1 | grep -E "match_literal|Pattern1"
# Test 2: _skip_whitespace (P2)
NYASH_JOINIR_CORE=1 NYASH_JOINIR_STRUCTURE_ONLY=1 ./target/release/hakorune \
tools/hako_shared/json_parser.hako 2>&1 | grep -E "skip_whitespace|Pattern2"
# Test 3: phase195_sum_count.hako (P3 multi-carrier)
NYASH_JOINIR_CORE=1 NYASH_JOINIR_STRUCTURE_ONLY=1 ./target/release/hakorune \
apps/tests/phase195_sum_count.hako 2>&1 | grep -E "Pattern3|sum_count"
# Test 4: loop_if_phi.hako (P3 single-carrier)
NYASH_JOINIR_CORE=1 NYASH_JOINIR_STRUCTURE_ONLY=1 ./target/release/hakorune \
apps/tests/loop_if_phi.hako 2>&1 | grep -E "Pattern3|if_phi"
# Test 5: loop_min_while.hako (P1 minimal)
NYASH_JOINIR_CORE=1 NYASH_JOINIR_STRUCTURE_ONLY=1 ./target/release/hakorune \
apps/tests/loop_min_while.hako 2>&1 | grep -E "Pattern1|min_while"
確認ポイント:
- ✅ router が正しい Pattern (P1/P2/P3) を選択
- ✅
[joinir/freeze]が出ない(freeze = legacy fallback) - ✅
UnsupportedPatternエラーが出ない
2. E2E 実行テスト
実際に実行して、期待値が出力されるか確認。
# Test 1: _match_literal
# (JsonParser 全体実行が必要 - Phase 197 では個別テストを作成)
# TODO: phase197_match_literal.hako を作成
# Test 2: _skip_whitespace
# TODO: phase197_skip_whitespace.hako を作成
# Test 3: phase195_sum_count.hako
NYASH_JOINIR_CORE=1 ./target/release/hakorune apps/tests/phase195_sum_count.hako
# Expected: 93
# Test 4: loop_if_phi.hako
NYASH_JOINIR_CORE=1 ./target/release/hakorune apps/tests/loop_if_phi.hako
# Expected: [Console LOG] sum=9
# Test 5: loop_min_while.hako
NYASH_JOINIR_CORE=1 ./target/release/hakorune apps/tests/loop_min_while.hako
# Expected: 0\n1\n2
検証項目:
- 出力が期待値と一致
- RC (Return Code) が 0
- エラーメッセージなし
3. 必要に応じてトレース(デバッグ)
ValueId の流れや PHI 接続が怪しい場合のみ実施。
# PHI トレース
NYASH_JOINIR_CORE=1 NYASH_TRACE_PHI=1 ./target/release/hakorune \
apps/tests/phase195_sum_count.hako 2>&1 | grep -E "phi|PHI"
# variable_map トレース
NYASH_JOINIR_CORE=1 NYASH_TRACE_VARMAP=1 ./target/release/hakorune \
apps/tests/phase195_sum_count.hako 2>&1 | grep -E "\[trace:varmap\]"
確認ポイント:
- PHI の dst と inputs が正しく対応
- variable_map 更新が整合している
Task 197-4: ドキュメント更新
1. joinir-architecture-overview.md
Section: 7.2 残タスク(Phase 192+ で対応予定)
追加内容:
7. **Phase 197: 実戦適用(軽量ループ検証)** → 完了 ✅
- 目的: 既存インフラの実戦検証(新機能追加なし)
- 対象ループ:
- `_match_literal` (P1) - JsonParser 単純 while
- `_skip_whitespace` (P2) - JsonParser break パターン
- `phase195_sum_count.hako` (P3 multi-carrier) - 既存実績
- `loop_if_phi.hako` (P3 single-carrier) - 既存実績
- `loop_min_while.hako` (P1 minimal) - 比較用
- 結果:
- [x] 構造トレース: 全ループで正しい Pattern 選択 ✅
- [x] E2E 実行: 全ループで期待値出力 ✅
- [x] 退行なし: Phase 190-196 テスト全 PASS ✅
- 詳細: phase197-lightweight-loops-deployment.md
### JsonParser/selfhost 実戦 JoinIR 適用状況
| Function | Pattern | Status | Note |
|----------|---------|--------|------|
| `_match_literal` | P1 | ✅ JoinIR OK | Phase 197 検証済み |
| `_skip_whitespace` | P2 | ✅ JoinIR OK | Phase 197 検証済み |
| `_trim` (leading) | P5 | ✅ JoinIR OK | Phase 173 実証済み |
| `_trim` (trailing) | P5 | ✅ JoinIR OK | Phase 173 実証済み |
| `phase195_sum_count` | P3 | ✅ JoinIR OK | Phase 196 検証済み(multi-carrier)|
| `loop_if_phi` | P3 | ✅ JoinIR OK | Phase 196 検証済み(single-carrier)|
| `loop_min_while` | P1 | ✅ JoinIR OK | Phase 165 基本検証済み |
| `_parse_number` | P2 | ⚠️ Deferred | ConditionEnv 制約(Phase 200+)|
| `_atoi` | P2 | ⚠️ Deferred | ConditionEnv 制約(Phase 200+)|
| `_parse_string` | P3 | ⚠️ Deferred | 複雑キャリア(Phase 195+ 拡張後)|
| `_unescape_string` | P3 | ⚠️ Deferred | 複雑キャリア(Phase 195+ 拡張後)|
| `_parse_array` | - | ⚠️ Deferred | 複数 MethodCall(Phase 195+)|
| `_parse_object` | - | ⚠️ Deferred | 複数 MethodCall(Phase 195+)|
**Coverage**: 7/13 ループ JoinIR 対応済み(54%)
2. CURRENT_TASK.md
Phase 197 セクション追加:
- [x] **Phase 197: JoinIR 実戦適用(軽量ループ検証)** ✅ (完了: 2025-12-XX)
- **目的**: Phase 196 までの安定基盤を実戦の小さいループで検証
- **対象ループ(5本)**:
1. `_match_literal` (P1) - JsonParser 単純 while ✅
2. `_skip_whitespace` (P2) - JsonParser break パターン ✅
3. `phase195_sum_count.hako` (P3 multi-carrier) ✅
4. `loop_if_phi.hako` (P3 single-carrier) ✅
5. `loop_min_while.hako` (P1 minimal) ✅
- **実施内容**:
- 197-1: 対象ループ確定(3-5本)✅
- 197-2: routing 確認(whitelist 既存)✅
- 197-3: 構造トレース + E2E 実行 ✅
- 197-4: ドキュメント更新 ✅
- **成果**:
- 全ループで正しい Pattern 選択 ✅
- 全ループで期待値出力 ✅
- 退行なし(Phase 190-196 テスト全 PASS)✅
- JsonParser/selfhost 実戦適用状況表作成 ✅
- **次候補**:
- Phase 200+: ConditionEnv 拡張(_parse_number, _atoi)
- Phase 198+: JsonParser 残りループ個別対応
成功基準
- 対象ループ 3-5本を CURRENT_TASK.md に固定
- routing.rs 確認(whitelist 既存確認)
- 構造トレース: 全ループで正しい Pattern 選択
- E2E 実行: 全ループで期待値出力
- 退行なし: Phase 190-196 テスト全 PASS
- ドキュメント更新(joinir-architecture-overview.md, CURRENT_TASK.md)
設計原則(Phase 197)
- 検証フォーカス: 新機能追加なし、既存インフラの実戦検証のみ
- 軽量ループのみ: 複雑なループ(ConditionEnv制約/複数MethodCall)は Phase 200+ に保留
- ドキュメント駆動: 実戦適用状況を可視化(カバレッジ表作成)
- 退行防止: 全 Phase 190-196 テストが PASS することを確認
次フェーズ候補
Phase 200+: ConditionEnv 拡張
- 目的: function-scoped local variables を ConditionEnv に含める
- 対象:
_parse_number,_atoi(digits.indexOf 依存) - 設計: ConditionEnv 拡張 OR .hako リライト
Phase 198+: JsonParser 残りループ個別対応
- 目的:
_parse_string,_unescape_string等の複雑ループ - 前提: Pattern 3 拡張(multi-flag carriers)完了
- 対象: 2-3 ループずつ段階的に適用
関連ファイル
調査対象
src/mir/builder/control_flow/joinir/routing.rs(whitelist 確認)tools/hako_shared/json_parser.hako(JsonParser ループ)
テストファイル
apps/tests/phase195_sum_count.hako(P3 multi-carrier)apps/tests/loop_if_phi.hako(P3 single-carrier)apps/tests/loop_min_while.hako(P1 minimal)
ドキュメント
docs/development/current/main/phase194-loop-inventory.md(ループ一覧)docs/development/current/main/joinir-architecture-overview.md(実戦適用状況表)CURRENT_TASK.md(Phase 197 セクション)