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>
This commit is contained in:
@ -0,0 +1,417 @@
|
||||
# Phase 182: CharComparison ループの汎用化(設計・命名調整)
|
||||
|
||||
## 概要
|
||||
|
||||
Phase 171-180 で実装した "Trim" パターンは、実は「特定の文字と比較するループ」の特例である。
|
||||
次フェーズ以降、JsonParser などで同様のパターン(例: `ch == '"'`, `ch == ','` など)が出てくる。
|
||||
|
||||
Phase 182 では、内部的な実装は変えずに、ドキュメント・コメント・型名を
|
||||
「Trim 専用」から「CharComparison パターン」として一般化する準備をする。
|
||||
|
||||
## 現在の用語体系
|
||||
|
||||
### Phase 171-180 での呼称
|
||||
|
||||
| 用語 | 場所 | 役割 |
|
||||
|------|------|------|
|
||||
| TrimLoopHelper | `src/mir/loop_pattern_detection/trim_loop_helper.rs` | Trim パターンの条件生成 |
|
||||
| TrimPatternInfo | loop_body_carrier_promoter.rs | Trim 昇格検出結果 |
|
||||
| TrimLoopLowering module | `src/mir/builder/control_flow/joinir/patterns/trim_loop_lowering.rs` | Trim ループ前処理 lowerer |
|
||||
| TrimPatternLowerer | trim_pattern_lowerer.rs | JoinIR 条件生成(Trim専用) |
|
||||
| TrimPatternValidator | trim_pattern_validator.rs | Trim パターン構造検証 |
|
||||
| LoopBodyCarrierPromoter | loop_pattern_detection/ | キャリア昇格検出(汎用) |
|
||||
|
||||
### 将来の呼称(Phase 183+)
|
||||
|
||||
| 用語 | 対応する現在名 | 新しい役割 |
|
||||
|------|---------------|-----------|
|
||||
| CharComparisonHelper | TrimLoopHelper | **文字比較ループ**の条件生成(汎用) |
|
||||
| CharComparisonPatternInfo | TrimPatternInfo | **文字比較パターン**の昇格検出結果 |
|
||||
| CharComparisonLowering module | TrimLoopLowering module | **文字比較パターン**ループ前処理 lowerer |
|
||||
| CharComparisonPatternLowerer | TrimPatternLowerer | JoinIR 条件生成(文字比較汎用) |
|
||||
| CharComparisonPatternValidator | TrimPatternValidator | 文字比較パターン構造検証 |
|
||||
| LoopBodyCarrierPromoter | (変更なし) | キャリア昇格検出(汎用、変更なし) |
|
||||
|
||||
## 用語一般化の意図
|
||||
|
||||
### Trim → CharComparison へ
|
||||
|
||||
**Trim パターン**は、以下の構造を持つ:
|
||||
```nyash
|
||||
loop(p < s.length()) {
|
||||
local ch = s.substring(p, p+1)
|
||||
if ch == ' ' or ch == '\n' { p = p + 1; continue }
|
||||
break
|
||||
}
|
||||
```
|
||||
|
||||
これは本質的に「**文字比較ループ**」であり、以下のパターンでも同じ構造:
|
||||
|
||||
#### JsonParser: Quote Check
|
||||
```nyash
|
||||
loop(p < s.length()) {
|
||||
local ch = s.substring(p, p+1)
|
||||
if ch == '"' { break } // 引用符を見つけたら終了
|
||||
p = p + 1
|
||||
}
|
||||
```
|
||||
|
||||
#### JsonParser: Delimiter Check
|
||||
```nyash
|
||||
loop(p < s.length()) {
|
||||
local ch = s.substring(p, p+1)
|
||||
if ch == ',' or ch == ']' { break } // デリミタを見つけたら終了
|
||||
p = p + 1
|
||||
}
|
||||
```
|
||||
|
||||
#### 汎用の文字比較ループ
|
||||
```nyash
|
||||
loop(p < s.length()) {
|
||||
local ch = s.substring(p, p+1)
|
||||
if <character_comparison> { <action> }
|
||||
p = p + 1
|
||||
}
|
||||
```
|
||||
|
||||
**共通点**:
|
||||
- ループ変数: 文字列インデックス(`p`, `i` など)
|
||||
- キャリア: LoopBodyLocal の文字変数(`ch`)
|
||||
- 比較対象: 特定の文字(whitespace, quote, delimiter など)
|
||||
- アクション: break, continue, または複雑な処理
|
||||
|
||||
**一般化の価値**:
|
||||
- Trim は whitespace 比較の特例
|
||||
- JsonParser では quote, delimiter, escape 文字など多種類の比較が必要
|
||||
- 同じ lowering ロジックで複数のパターンに対応可能
|
||||
|
||||
## Phase 182 作業内容(コード変更なし)
|
||||
|
||||
### 1. ドキュメント・docstring 更新
|
||||
|
||||
**対象ファイル群**:
|
||||
- `src/mir/builder/control_flow/joinir/patterns/trim_loop_lowering.rs`
|
||||
- `src/mir/builder/control_flow/joinir/patterns/trim_pattern_lowerer.rs`
|
||||
- `src/mir/builder/control_flow/joinir/patterns/trim_pattern_validator.rs`
|
||||
- `src/mir/loop_pattern_detection/trim_loop_helper.rs`
|
||||
- `src/mir/loop_pattern_detection/loop_body_carrier_promoter.rs`
|
||||
- 各ファイルの crate-level comment
|
||||
|
||||
**更新内容**:
|
||||
|
||||
```rust
|
||||
// Before
|
||||
//! Phase 171: Trim pattern detection and lowering for JsonParser
|
||||
|
||||
// After
|
||||
//! Phase 171+: Character Comparison pattern detection and lowering
|
||||
//!
|
||||
//! Initially implemented for Trim pattern (whitespace comparison).
|
||||
//! Generalized for any character comparison patterns (e.g., quoted string parsing, delimiter matching).
|
||||
//!
|
||||
//! ## Examples
|
||||
//! - Trim: `ch == ' '` (whitespace check)
|
||||
//! - JsonParser: `ch == '"'` (quote check), `ch == ','` (delimiter check)
|
||||
//! - CSV Parser: `ch == ','` (delimiter), `ch == '\n'` (line break)
|
||||
```
|
||||
|
||||
### 2. 型・関数のコメント更新
|
||||
|
||||
#### TrimLoopHelper
|
||||
```rust
|
||||
// Before
|
||||
pub struct TrimLoopHelper { ... }
|
||||
|
||||
// After
|
||||
/// Character comparison loop helper (initially for Trim patterns)
|
||||
///
|
||||
/// Used by loops like:
|
||||
/// - Trim: `ch == ' '` (whitespace check)
|
||||
/// - JsonParser: `ch == '"'` (quote check), `ch == ','` (delimiter check)
|
||||
/// - CSV Parser: `ch == ','` (delimiter), `ch == '\n'` (line break)
|
||||
///
|
||||
/// ## Renaming Plan (Phase 183+)
|
||||
/// This struct will be renamed to `CharComparisonHelper` in Phase 183.
|
||||
pub struct TrimLoopHelper { ... }
|
||||
```
|
||||
|
||||
#### TrimPatternLowerer
|
||||
```rust
|
||||
// Before
|
||||
pub struct TrimPatternLowerer;
|
||||
|
||||
// After
|
||||
/// Trim/CharComparison pattern lowerer (JoinIR condition generation)
|
||||
///
|
||||
/// Initially implemented for Trim patterns (whitespace comparison).
|
||||
/// Generalized for any character comparison patterns.
|
||||
///
|
||||
/// ## Renaming Plan (Phase 183+)
|
||||
/// This struct will be renamed to `CharComparisonPatternLowerer` in Phase 183.
|
||||
pub struct TrimPatternLowerer;
|
||||
```
|
||||
|
||||
#### TrimPatternValidator
|
||||
```rust
|
||||
// Before
|
||||
pub struct TrimPatternValidator;
|
||||
|
||||
// After
|
||||
/// Trim/CharComparison pattern validator (structure validation)
|
||||
///
|
||||
/// Validates character comparison loop structure:
|
||||
/// - LoopBodyLocal carrier (e.g., `ch`)
|
||||
/// - Character comparison condition (e.g., `ch == ' '`)
|
||||
/// - Substring pattern detection
|
||||
///
|
||||
/// ## Renaming Plan (Phase 183+)
|
||||
/// This struct will be renamed to `CharComparisonPatternValidator` in Phase 183.
|
||||
pub struct TrimPatternValidator;
|
||||
```
|
||||
|
||||
### 3. 用語統一の計画メモ
|
||||
|
||||
**Phase 183+ での段階的リネーム**:
|
||||
|
||||
#### Step 1: 型エイリアス追加(互換性維持)
|
||||
```rust
|
||||
// Phase 183
|
||||
pub type TrimLoopHelper = CharComparisonHelper;
|
||||
pub type TrimPatternInfo = CharComparisonPatternInfo;
|
||||
|
||||
#[deprecated(note = "Use CharComparisonPatternLowerer instead")]
|
||||
pub type TrimPatternLowerer = CharComparisonPatternLowerer;
|
||||
```
|
||||
|
||||
#### Step 2: ファイル名変更
|
||||
```
|
||||
src/mir/builder/control_flow/joinir/patterns/
|
||||
trim_loop_lowering.rs → char_comparison_lowering.rs
|
||||
trim_pattern_lowerer.rs → char_comparison_pattern_lowerer.rs
|
||||
trim_pattern_validator.rs → char_comparison_pattern_validator.rs
|
||||
|
||||
src/mir/loop_pattern_detection/
|
||||
trim_loop_helper.rs → char_comparison_helper.rs
|
||||
```
|
||||
|
||||
#### Step 3: 旧名の非推奨化
|
||||
```rust
|
||||
#[deprecated(since = "Phase 183", note = "Use CharComparisonHelper instead")]
|
||||
pub type TrimLoopHelper = CharComparisonHelper;
|
||||
```
|
||||
|
||||
#### Step 4: 完全置換(Phase 184+)
|
||||
- 型エイリアス削除
|
||||
- 旧名の完全廃止
|
||||
- ドキュメント内の "Trim" → "CharComparison" 一斉置換
|
||||
|
||||
### 4. 互換性の考慮
|
||||
|
||||
**段階的リネーム戦略**:
|
||||
- **Phase 182**: ドキュメント・コメントのみ更新(実装変更なし)
|
||||
- **Phase 183**: 型エイリアス追加、ファイル名変更、新名称導入
|
||||
- **Phase 184**: 旧名削除、完全統一
|
||||
|
||||
**移行期間**:
|
||||
- Phase 183-184 の間、旧名と新名を共存させる
|
||||
- 型エイリアスで互換性維持
|
||||
- docstring に `#[deprecated]` マークを付ける
|
||||
|
||||
## 実装例(Phase 183 以降向け)
|
||||
|
||||
### CharComparisonHelper の使用例
|
||||
|
||||
```rust
|
||||
// Phase 182: ドキュメント更新のみ(この段階では実装なし)
|
||||
//
|
||||
// docstring に記載:
|
||||
// "This will be renamed to CharComparisonHelper in Phase 183"
|
||||
// "Initially used for Trim patterns; generalized for any char comparison"
|
||||
|
||||
// Phase 183+: 実装例(参考)
|
||||
impl CharComparisonHelper {
|
||||
pub fn new(carrier_name: String, comparison_chars: Vec<String>) -> Self {
|
||||
// whitespace以外の文字比較にも対応
|
||||
Self {
|
||||
carrier_name,
|
||||
comparison_chars,
|
||||
}
|
||||
}
|
||||
|
||||
pub fn for_trim() -> Self {
|
||||
// Trim パターン専用ヘルパー(後方互換性)
|
||||
Self::new("ch".to_string(), vec![" ".to_string(), "\n".to_string(), "\t".to_string()])
|
||||
}
|
||||
|
||||
pub fn for_quote_check() -> Self {
|
||||
// JsonParser 引用符チェック
|
||||
Self::new("ch".to_string(), vec!["\"".to_string()])
|
||||
}
|
||||
|
||||
pub fn for_delimiter_check() -> Self {
|
||||
// JsonParser デリミタチェック
|
||||
Self::new("ch".to_string(), vec![",".to_string(), "]".to_string(), "}".to_string()])
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
## 次フェーズへの提案
|
||||
|
||||
### Phase 183: 実装・リネーム フェーズ
|
||||
|
||||
**目標**: 型名・ファイル名を実際にリネーム、互換性維持
|
||||
|
||||
**タスク**:
|
||||
- [ ] `trim_loop_lowering.rs` → `char_comparison_lowering.rs` リネーム
|
||||
- [ ] `TrimLoopHelper` → `CharComparisonHelper` リネーム(型エイリアス付き)
|
||||
- [ ] `TrimPatternLowerer` → `CharComparisonPatternLowerer` リネーム
|
||||
- [ ] `TrimPatternValidator` → `CharComparisonPatternValidator` リネーム
|
||||
- [ ] テスト・ドキュメント内の明示的な "Trim" → "CharComparison" 置換
|
||||
- [ ] 新規の JsonParser ループ(_parse_string 等)でも同モジュール使用
|
||||
|
||||
**互換性**:
|
||||
```rust
|
||||
// 型エイリアスで旧コード動作保証
|
||||
pub type TrimLoopHelper = CharComparisonHelper;
|
||||
pub type TrimPatternInfo = CharComparisonPatternInfo;
|
||||
|
||||
#[deprecated(note = "Use CharComparisonHelper instead. Will be removed in Phase 184.")]
|
||||
pub type TrimLoopHelper = CharComparisonHelper;
|
||||
```
|
||||
|
||||
### Phase 184+: 完全置換フェーズ
|
||||
|
||||
**目標**: 旧名完全廃止、用語統一完了
|
||||
|
||||
**タスク**:
|
||||
- [ ] 型エイリアス削除
|
||||
- [ ] 旧名への参照を全て新名に置換
|
||||
- [ ] `#[deprecated]` マーク削除
|
||||
- [ ] ドキュメント最終確認
|
||||
|
||||
## Pattern5 (Trim/CharComparison) の拡張性
|
||||
|
||||
### 現在のサポート範囲
|
||||
|
||||
**Trim パターン**:
|
||||
- whitespace 比較(`ch == ' '`, `ch == '\n'`, `ch == '\t'`)
|
||||
- キャリア: `ch` (LoopBodyLocal)
|
||||
- アクション: continue(whitespace skip)
|
||||
|
||||
### Phase 183+ での拡張
|
||||
|
||||
**JsonParser パターン**:
|
||||
- quote 比較(`ch == '"'`)
|
||||
- delimiter 比較(`ch == ','`, `ch == ']'`, `ch == '}'`)
|
||||
- escape 文字比較(`ch == '\\'`)
|
||||
- キャリア: `ch` (LoopBodyLocal)
|
||||
- アクション: break, continue, 複雑な処理
|
||||
|
||||
**CSV Parser パターン**:
|
||||
- delimiter 比較(`ch == ','`)
|
||||
- line break 比較(`ch == '\n'`)
|
||||
- quote 処理(`ch == '"'`)
|
||||
|
||||
**汎用文字比較ループ**:
|
||||
- 任意の文字列との比較
|
||||
- 複数文字の OR 条件
|
||||
- 否定条件(`ch != '...'`)
|
||||
|
||||
## 実装の安全性
|
||||
|
||||
### Conservative Approach
|
||||
|
||||
1. **Phase 182**: ドキュメント・コメントのみ更新(実装変更なし)
|
||||
2. **Phase 183**: 型エイリアス・ファイル名変更(後方互換性維持)
|
||||
3. **Phase 184**: 旧名削除(完全統一)
|
||||
|
||||
### テスト戦略
|
||||
|
||||
**既存テストの継続動作保証**:
|
||||
```bash
|
||||
# Trim pattern tests
|
||||
cargo test --release --lib trim
|
||||
|
||||
# JsonParser tests (uses Trim pattern)
|
||||
./target/release/hakorune apps/tests/test_jsonparser_skip_whitespace.hako
|
||||
|
||||
# Pattern2 tests
|
||||
cargo test --release --lib pattern2
|
||||
|
||||
# Pattern4 tests
|
||||
cargo test --release --lib pattern4
|
||||
```
|
||||
|
||||
## アーキテクチャへの影響
|
||||
|
||||
### joinir-architecture-overview.md への追記
|
||||
|
||||
**更新内容**:
|
||||
```markdown
|
||||
### Pattern 5: CharComparison (Trim-like) Loops
|
||||
|
||||
**Previously Known As**: Trim Pattern (Phase 171-180)
|
||||
|
||||
**Generalized**: Character comparison loops (Phase 182+)
|
||||
|
||||
**Examples**:
|
||||
- Trim: `ch == ' '` (whitespace skip)
|
||||
- JsonParser: `ch == '"'` (quote detection), `ch == ','` (delimiter detection)
|
||||
- CSV Parser: `ch == ','` (field delimiter), `ch == '\n'` (line break)
|
||||
|
||||
**Components**:
|
||||
- `CharComparisonHelper` (was `TrimLoopHelper`) - Pattern data structure
|
||||
- `CharComparisonPatternLowerer` (was `TrimPatternLowerer`) - JoinIR condition generation
|
||||
- `CharComparisonPatternValidator` (was `TrimPatternValidator`) - Pattern structure validation
|
||||
- `LoopBodyCarrierPromoter` - Carrier promotion (shared, unchanged)
|
||||
|
||||
**Lowering Module**: `src/mir/builder/control_flow/joinir/patterns/char_comparison_lowering.rs`
|
||||
```
|
||||
|
||||
## 関連ドキュメント
|
||||
|
||||
- `phase180-trim-module-design.md` - Trim module 当初の設計
|
||||
- `phase171-c-trim-pattern-lowering.md` - Phase 171 実装詳細
|
||||
- `phase181-jsonparser-loop-roadmap.md` - JsonParser 次実装予定
|
||||
- `joinir-architecture-overview.md` - JoinIR アーキテクチャ全体図
|
||||
|
||||
## タイムライン
|
||||
|
||||
### Phase 182(このフェーズ)
|
||||
- **Task 182-1**: 設計ドキュメント作成(このファイル) - 完了
|
||||
- **Task 182-2**: docstring 更新(オプション) - 10-15分
|
||||
|
||||
### Phase 183(次フェーズ)
|
||||
- **Task 183-1**: 型名・ファイル名リネーム - 30分
|
||||
- **Task 183-2**: 型エイリアス追加 - 10分
|
||||
- **Task 183-3**: テスト確認 - 15分
|
||||
|
||||
### Phase 184+(最終フェーズ)
|
||||
- **Task 184-1**: 旧名削除 - 20分
|
||||
- **Task 184-2**: 完全統一確認 - 10分
|
||||
|
||||
**Total Estimated Time**: 95-100分(3フェーズ合計)
|
||||
|
||||
## 成功基準
|
||||
|
||||
### Phase 182
|
||||
- ✅ 設計ドキュメント作成完了
|
||||
- ✅ docstring に汎用化の意図を明記
|
||||
- ✅ Phase 183+ の実装計画を明確化
|
||||
|
||||
### Phase 183
|
||||
- ✅ 型名・ファイル名リネーム完了
|
||||
- ✅ 型エイリアスで後方互換性維持
|
||||
- ✅ 既存テスト全てパス(変更なし)
|
||||
|
||||
### Phase 184+
|
||||
- ✅ 旧名完全削除
|
||||
- ✅ ドキュメント統一
|
||||
- ✅ "Trim" → "CharComparison" 用語統一完了
|
||||
|
||||
---
|
||||
|
||||
**作成日**: 2025-12-08
|
||||
**Phase**: 182(CharComparison 汎用化の準備・設計)
|
||||
**ステータス**: ドキュメント・計画のみ(コード変更なし)
|
||||
**次フェーズ**: Phase 183(実装・リネーム)
|
||||
@ -0,0 +1,438 @@
|
||||
# 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-2(Phase 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-1(Rust コンパイラで実行)の**テストケース**であり、
|
||||
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 を使用**:
|
||||
|
||||
```bash
|
||||
# ループの特徴を自動抽出
|
||||
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 での検証
|
||||
|
||||
**実行方法**:
|
||||
```bash
|
||||
# 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 が正しく動作しているか
|
||||
|
||||
**ログ確認**:
|
||||
```bash
|
||||
# JoinIR 詳細ログ
|
||||
grep "\[trace:joinir\]" log.txt
|
||||
|
||||
# Pattern 検出ログ
|
||||
grep "\[trace:pattern\]" log.txt
|
||||
|
||||
# Fail-Fast 理由
|
||||
grep "JoinIR blocked" log.txt
|
||||
```
|
||||
|
||||
### Step 4: 結果まとめ
|
||||
|
||||
**観測結果テーブル**(Task 183-2 で作成):
|
||||
```markdown
|
||||
| ループ名 | ファイル | 行番号 | Pattern 予想 | Pattern 実績 | JoinIR通過 | Fail-Fast理由 | 実装優先度 |
|
||||
|---------|---------|--------|------------|-----------|-----------|-------------|-----------|
|
||||
| ... | ... | ... | ... | ... | ... | ... | ... |
|
||||
```
|
||||
|
||||
**分析観点**:
|
||||
- P1-P5 のどのパターンが多いか
|
||||
- Fail-Fast が多い原因は何か(LoopBodyLocal, MethodCall, etc.)
|
||||
- Phase 184+ で優先実装すべきループはどれか
|
||||
|
||||
## ドキュメント出力
|
||||
|
||||
### Task 183-1: ループ特定とパターン分類
|
||||
|
||||
**ファイル**: `phase183-selfhost-depth2-loop-inventory.md`(新規作成)
|
||||
|
||||
**内容**:
|
||||
```markdown
|
||||
# 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-1(Phase 150) | Depth-2(Phase 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**: 183(Selfhost Depth-2 JoinIR 再観測・設計)
|
||||
**ステータス**: 観測計画ドキュメント(実装なし)
|
||||
**次フェーズ**: Phase 184+(.hako 側 JoinIR フロントエンド実装)
|
||||
Reference in New Issue
Block a user