Files
hakorune/docs/development/current/main/phase183-selfhost-depth2-joinir-status.md
nyash-codex 17ecb0ed26 docs(joinir): Add Phase 182+183 design documents
Phase 182: CharComparison generalization plan
- Generalize "Trim" pattern to "CharComparison" pattern
- Documentation/comment updates only (no code changes)
- Prepare for JsonParser quote/delimiter/escape patterns
- Phase 183+: Type/file renaming with backward compatibility

Phase 183: Selfhost Depth-2 JoinIR re-observation plan
- Re-examine 5-7 loops in selfhost depth-2 (compiler compiling itself)
- Observe JoinIR pattern usage (P1-P5) after Phase 171-181 improvements
- Design .hako-side JoinIR frontend for Phase 184+ implementation
- Create 3 analysis documents: loop inventory, observation, plan

Related: Phase 150 (depth-1), Phase 171-181 (JoinIR improvements)

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Haiku 4.5 <noreply@anthropic.com>
2025-12-08 21:26:57 +09:00

13 KiB
Raw Blame History

Phase 183: Selfhost Depth-2 JoinIR 再観測(観測フェーズ)

概要

Phase 150 で選定した「selfhost depth-2 の最小ループ 5本」について、 Phase 171-181 での JoinIR ループ統一・Pattern 整備の後で、 改めて「どのループが JoinIR で動いているか」を観測する。

目的は、selfhost depth-2 実装フェーズPhase 184+)での 「JoinIR → .hako 側フロントエンド」の設計に活かす。

背景: Selfhost Depth とは

Depth-1現在の実装状態

定義: Rust コンパイラが .hako ソースをコンパイルする1周目

パイプライン:

target/release/hakorune (Rust)
    ↓ [Stage-B: 関数スキャン + scaffold]
stage1_cli.hako (JSON v0 scaffold)
    ↓ [Stage-1: CLI/using 解決]
stage1_output.hako (Stage-3 構文)
    ↓ [Stage-3: 実際のコンパイル本体 - Rust実装]
Program(JSON v0)
    ↓ [dev verify]
VM/LLVM 実行

現状: Phase 150 で 5本の代表ケースが動作確認済み

Depth-2Phase 183-184 での目標)

定義: .hako コンパイラが .hako ソースをコンパイルする2周目

パイプライン:

target/release/hakorune (Rust)
    ↓ [Stage-B: Rust実装]
stage1_cli.hako (JSON v0)
    ↓ [Stage-1: .hako実装NEW!]
stage1_output.hako
    ↓ [Stage-3: .hako実装NEW!]
Program(JSON v0)
    ↓ [dev verify]
VM/LLVM 実行

Phase 183 の役割: Depth-2 で動かす Stage-1/Stage-3 の .hako コンパイラを観測し、 どのループが JoinIR で動いているかを確認

Phase 150 で選定した Depth-2 最小ループ5本

Phase 150 選定内容の確認

Phase 150 のドキュメントphase150_selfhost_stage3_depth1_baseline.mdによると、 Depth-1 で動作確認済みの 5本のケースは以下の通り

# ケース名 タイプ 備考
1 peek_expr_block.hako block/match式 Baseline: match式、ブロック式の基本動作確認
2 loop_min_while.hako loop基本 Baseline: ループ変数、Entry PHI、Exit PHI
3 string_method_chain.hako string処理 NEW: メソッドチェーン(substring().length()
4 joinir_min_loop.hako loop+break NEW: break制御、ControlForm::Loop検証
5 joinir_if_select_simple.hako if+return NEW: 早期return、分岐の値伝播

注意: これらは Depth-1Rust コンパイラで実行)のテストケースであり、 Depth-2 で観測する対象は「.hako コンパイラ自身のループ」である。

Depth-2 観測対象の定義

Phase 183 で観測すべき対象:

  • Stage-1 コンパイラapps/selfhost-runtime/ 配下)のループ
  • Stage-3 コンパイラapps/selfhost-runtime/ 配下)のループ
  • 特に「文字列解析」「トークン処理」「AST構築」に関わるループ

観測方針:

  1. Phase 181 で分析した JsonParser のループパターンと同様の手法を使う
  2. MirAnalyzerBox / JoinIrAnalyzerBox での実行時観測
  3. ループごとに P1-P5 分類を行う

観測方法

Step 1: Depth-2 ループの特定

対象ファイルPhase 150 で定義済み):

  • apps/selfhost-runtime/ 配下の .hako ファイル
  • Stage-1/Stage-3 コンパイラの実装

作業内容:

  1. selfhost-runtime 配下の .hako ファイルをリストアップ
  2. 各ファイルのループを特定(行番号、関数名)
  3. 最小の代表ループ 5-7本を選定Phase 150 と同様)

選定基準:

  • 頻繁に実行されるループ(トークン走査、文字列解析など)
  • 異なるパターンP1-P5を代表するループ
  • 実装難易度が低い〜中程度のループ

Step 2: 各ループの Pattern 分類

Phase 192 の AST feature extractor を使用:

# ループの特徴を自動抽出
NYASH_FEATURES=stage3 NYASH_USE_NY_COMPILER=1 \
  ./target/release/hakorune --analyze-loop <file.hako> <function_name>

分類観点:

  • loop_condition: LoopParam/OuterLocal/LoopBodyLocal のどれに依存するか
  • body_pattern: simple, break, continue, PHI など
  • キャリア: 単一/複数、型
  • ブロック有無: if/else ネスト
  • MethodCall: 有無、呼び出し回数

Step 3: MirAnalyzerBox / JoinIrAnalyzerBox での検証

実行方法:

# Depth-2 selfhost 実行Stage-1/Stage-3 を .hako で動かす)
NYASH_FEATURES=stage3 NYASH_USE_NY_COMPILER=1 \
  NYASH_JOINIR_STRICT=1 \
  NYASH_JOINIR_DEBUG=1 \
  ./target/release/hakorune <selfhost_target.hako>

観測ポイント:

  • どのループが JoinIR ルートで通っているか
  • どのループが Fail-Fast しているか(理由付き)
  • Phase 192 の AST feature extractor が正しく動作しているか

ログ確認:

# JoinIR 詳細ログ
grep "\[trace:joinir\]" log.txt

# Pattern 検出ログ
grep "\[trace:pattern\]" log.txt

# Fail-Fast 理由
grep "JoinIR blocked" log.txt

Step 4: 結果まとめ

観測結果テーブルTask 183-2 で作成):

| ループ名 | ファイル | 行番号 | Pattern 予想 | Pattern 実績 | JoinIR通過 | Fail-Fast理由 | 実装優先度 |
|---------|---------|--------|------------|-----------|-----------|-------------|-----------|
| ... | ... | ... | ... | ... | ... | ... | ... |

分析観点:

  • P1-P5 のどのパターンが多いか
  • Fail-Fast が多い原因は何かLoopBodyLocal, MethodCall, etc.
  • Phase 184+ で優先実装すべきループはどれか

ドキュメント出力

Task 183-1: ループ特定とパターン分類

ファイル: phase183-selfhost-depth2-loop-inventory.md(新規作成)

内容:

# Phase 183: Selfhost Depth-2 ループ一覧

## 選定ループ一覧5-7本

| # | ループ名 | ファイル | 行番号 | 関数名 | 役割 |
|---|---------|---------|--------|--------|------|
| 1 | ... | ... | ... | ... | ... |
| 2 | ... | ... | ... | ... | ... |
| ... | ... | ... | ... | ... | ... |

## 各ループの詳細構造

### Loop 1: ...

**ソースコード**:
```nyash
loop(condition) {
    ...
}

特徴:

  • loop_condition: ...
  • キャリア: ...
  • PHI: ...
  • MethodCall: ...
  • break/continue: ...

P1-P5 分類: Pattern X



### Task 183-2: JoinIR 通過・Fail-Fast 観測結果

**ファイル**: `phase183-selfhost-depth2-joinir-observation.md`(新規作成)

**内容**:
```markdown
# Phase 183: Selfhost Depth-2 JoinIR 観測結果

## 実行環境

- **Date**: 2025-12-08
- **Rust VM**: ./target/release/hakorune
- **JoinIR Strict**: NYASH_JOINIR_STRICT=1
- **JoinIR Debug**: NYASH_JOINIR_DEBUG=1
- **Selfhost**: NYASH_FEATURES=stage3 NYASH_USE_NY_COMPILER=1

## 観測結果サマリー

| Pattern | JoinIR通過数 | Fail-Fast数 | 合計 |
|---------|------------|------------|------|
| P1 Simple | ... | ... | ... |
| P2 Break | ... | ... | ... |
| P3 If-PHI | ... | ... | ... |
| P4 Continue | ... | ... | ... |
| P5 Trim | ... | ... | ... |
| **合計** | ... | ... | ... |

## 各ループの観測結果

### Loop 1: ...

**実行コマンド**:
```bash
NYASH_FEATURES=stage3 NYASH_USE_NY_COMPILER=1 \
  NYASH_JOINIR_STRICT=1 \
  ./target/release/hakorune <file.hako>

結果: JoinIR 通過 / Fail-Fast

ログ:

[trace:joinir] pattern1: 3 functions, 13 blocks
[trace:pattern] route: Pattern1_Minimal MATCHED

Pattern 分類: Pattern X

Fail-Fast 理由(該当する場合):

  • LoopBodyLocal が条件に含まれる
  • MethodCall が複数存在
  • その他


### Task 183-3: Phase 184+ への提案

**ファイル**: `phase183-selfhost-depth2-implementation-plan.md`(新規作成)

**内容**:
```markdown
# Phase 183: Selfhost Depth-2 実装計画Phase 184+ への提案)

## 観測結果に基づく戦略

### 高優先度ループPhase 184A

**対象**:
- ループ名: ...
- Pattern: ...
- 理由: ...

**実装戦略**:
- ...

### 中優先度ループPhase 184B

**対象**:
- ループ名: ...
- Pattern: ...
- 理由: ...

**実装戦略**:
- ...

### 低優先度ループPhase 184C+

**対象**:
- ループ名: ...
- Pattern: ...
- 理由: ...

**実装戦略**:
- ...

## .hako 側 JoinIR フロントエンド設計

### 必要な機能

1. **AST → JoinIR 変換**.hako 実装)
2. **Pattern 検出ロジック**.hako 実装)
3. **Carrier 情報の伝播**.hako 実装)
4. **PHI 命令生成**.hako 実装)

### 段階的実装方針

**Phase 184A**: P1/P2 Simple ループの .hako 実装
**Phase 184B**: P3/P4 複雑ループの .hako 実装
**Phase 184C**: P5 Trim/CharComparison ループの .hako 実装

## Analyzer 拡張

### MirAnalyzerBox 拡張

**追加機能**:
- Selfhost Depth-2 専用ルート
- ループごとの Pattern 自動分類
- Fail-Fast 理由の詳細レポート

### JoinIrAnalyzerBox 拡張

**追加機能**:
- JoinIR 構造の可視化DOT/JSON
- ループごとの lowering ログ
- Phase 184+ 向けの実装ヒント出力

---

関連ドキュメント

  • phase150_selfhost_stage3_depth1_baseline.md - Depth-1 ベースラインPhase 150
  • phase150_selfhost_stage3_depth1_results.md - Depth-1 実行結果
  • phase181-jsonparser-loop-roadmap.md - JsonParser ループ分析Phase 181
  • phase182-char-comparison-generalization.md - CharComparison 汎用化Phase 182
  • joinir-architecture-overview.md - JoinIR アーキテクチャ全体図

タイムライン

Phase 183このフェーズ

  • Task 183-1: ループ特定とパターン分類60分
    • selfhost-runtime 配下の .hako ファイル解析
    • 5-7本の代表ループ選定
    • P1-P5 分類
  • Task 183-2: JoinIR 通過・Fail-Fast 観測90分
    • MirAnalyzerBox / JoinIrAnalyzerBox での実行
    • 観測ログの収集・解析
    • 結果テーブル作成
  • Task 183-3: Phase 184+ への提案45分
    • 実装優先度の決定
    • .hako 側 JoinIR フロントエンドの設計方針
    • Analyzer 拡張提案

Total Estimated Time: 195分約3.25時間)

Phase 184+(次フェーズ以降)

  • Phase 184A: 高優先度ループ実装P1/P2 Simple
  • Phase 184B: 中優先度ループ実装P3/P4 Complex
  • Phase 184C: 低優先度ループ実装P5 Trim/CharComparison
  • Phase 185: Analyzer 拡張実装
  • Phase 186: Depth-2 統合テスト

成功基準

Phase 183

  • Depth-2 ループを 5-7本特定
  • 各ループの P1-P5 分類完了
  • MirAnalyzerBox / JoinIrAnalyzerBox での観測完了
  • 観測結果ドキュメント 3本作成
    • phase183-selfhost-depth2-loop-inventory.md
    • phase183-selfhost-depth2-joinir-observation.md
    • phase183-selfhost-depth2-implementation-plan.md
  • Phase 184+ への実装方針明確化

Phase 184+

  • .hako 側 JoinIR フロントエンド実装開始
  • 高優先度ループの JoinIR 統一完了
  • Depth-2 selfhost 実行成功(最小ケース)

重要な観点

Depth-1 と Depth-2 の違い

観点 Depth-1Phase 150 Depth-2Phase 183+
コンパイラ Rust .hako
対象 テストケース5本 コンパイラ自身のループ5-7本
JoinIR Rust実装済み .hako実装が必要
目的 基本動作確認 selfhost 完全実装

JoinIR → .hako フロントエンド設計の鍵

Phase 183 の観測が重要な理由:

  1. Pattern 分布の把握: どのパターンが多いか → 実装優先度決定
  2. Fail-Fast 原因の特定: どのような制約がボトルネックか → 解決策設計
  3. 実装難易度の評価: 段階的実装の計画立案

Phase 184+ での活用:

  • P1/P2 Simple が多い → 優先実装
  • P3/P4 Complex が多い → PHI/MethodCall 対応が鍵
  • P5 Trim/CharComparison が多い → Phase 182 の汎用化が活きる

備考

Phase 150 との関係

Phase 150 は Depth-1 のテストケースを選定・実行したフェーズ。 Phase 183 は Depth-2 のコンパイラ自身のループを観測するフェーズ。

相違点:

  • Phase 150: Rust コンパイラで .hako テストケースを実行
  • Phase 183: .hako コンパイラで .hako コンパイラを実行

共通点:

  • どちらも「5-7本の代表ケース」を選定
  • どちらも JoinIR の動作確認が目的

JsonParser との類似性

Phase 181 で JsonParser の全11ループを分析した手法を、 Phase 183 では selfhost コンパイラのループに適用する。

共通の分析手法:

  • ループの特徴抽出loop_condition, carrier, PHI, etc.
  • P1-P5 分類
  • Fail-Fast 原因の特定

作成日: 2025-12-08 Phase: 183Selfhost Depth-2 JoinIR 再観測・設計) ステータス: 観測計画ドキュメント(実装なし) 次フェーズ: Phase 184+.hako 側 JoinIR フロントエンド実装)