diff --git a/CURRENT_TASK.md b/CURRENT_TASK.md index acd48f71..a6bc2e4b 100644 --- a/CURRENT_TASK.md +++ b/CURRENT_TASK.md @@ -1,10 +1,74 @@ -# Current Task — JoinIR / PHI 削減スナップショット + Ring0/FileBox I/O パイプライン(2025-12-03 時点) +# Current Task — JoinIR / PHI 削減スナップショット + Ring0/FileBox I/O パイプライン(2025-12-04 時点) > このファイルは「今どこまで終わっていて、次に何をやるか」を把握するためのスナップショットだよ。 > 過去の詳細ログは `docs/private/roadmap2/CURRENT_TASK_2025-11-29_full.md` や各 Phase の README/TASKS を見てね。 --- +## 🎯 Phase 120: selfhost Stage-3 代表パスの安定化(完了)✅ 2025-12-04 + +### 📋 実装内容 + +**目的**: Phase 106-115 完了時点での selfhost 経路(Stage-3 .hako コンパイラ)のベースライン確立 + +**代表パス選定**: +1. **peek_expr_block.hako**: match 式・ブロック式(✅ PASS) +2. **loop_min_while.hako**: loop 構文・PHI 命令(✅ PASS) +3. **esc_dirname_smoke.hako**: 複雑な制御構造・StringBox 操作(⚠️ ConsoleBox.println エラー) + +**実装成果**: +- ✅ 期待フロー整理: `docs/development/current/main/selfhost_stage3_expected_flow.md` 作成 +- ✅ 実行調査完了: `NYASH_JOINIR_STRICT=1` での動作確認(/tmp/phase120_execution_results.txt) +- ✅ ベースライン確立: `docs/development/current/main/phase120_baseline_results.md` 作成 +- ✅ スモークスクリプト: `tools/smokes/v2/profiles/integration/selfhost/phase120_stable_paths.sh` 作成 +- ✅ 統合テスト成功: integration プロファイルで自動実行確認 + +### 📊 Phase 120 実行結果 + +**JoinIR Strict モード検証**(NYASH_JOINIR_STRICT=1): +| 検証項目 | 結果 | 備考 | +|---------|------|------| +| If 文の JoinIR Lowering | ✅ 正常動作 | peek_expr_block.hako | +| Loop の JoinIR Lowering | ✅ 正常動作 | loop_min_while.hako | +| ControlForm 構造生成 | ✅ 正常動作 | header/body/latch/exit ブロック | +| PHI 命令生成 | ✅ 正常動作 | 分岐・ループでの値合流 | +| StringBox メソッド | ✅ 正常動作 | length, substring, lastIndexOf | +| ConsoleBox.println | ❌ エラー | メソッド解決失敗(Phase 122+ 課題) | + +**統計**: +- ✅ **完全成功**: 2/3 プログラム +- ⚠️ **既知の問題**: 1/3(ConsoleBox.println - Phase 122+ で修正予定) +- 📄 **作成ドキュメント**: 3 ファイル +- 🧪 **スモークテスト**: 統合完了(6 秒で自動実行) + +### 🏆 Phase 120 の価値 + +**ベースライン First 原則の実践**: +``` +Phase 106-115 完了 + ↓ +Phase 120: 現状記録(ベースライン確立)← 今ここ + ↓ +Phase 121: 設計(hako_check 統合計画) + ↓ +Phase 122+: 実装修正(段階的改善) +``` + +**Phase 122+ への明確な課題リスト**: +- **優先度高**: ConsoleBox.println メソッドエラーの解決 +- **優先度中**: NYASH_PARSER_STAGE3 deprecation 警告への対応 +- **優先度低**: builtin Box の plugin 化推奨 + +**自動テストによる回帰検出**: +- integration プロファイルで自動実行 +- 将来の変更による退行を即座に検出可能 + +### 🚀 次のステップ + +**Phase 121**: hako_check JoinIR 統合設計(Phase 120 ベースラインをもとに設計) + +--- + ## Ring0/FileBox I/O ライン - Phase 106-112 完全完成! ✅ 2025-12-03 ### 📦 Phase 106-112 完了サマリ diff --git a/docs/development/current/main/phase120_baseline_results.md b/docs/development/current/main/phase120_baseline_results.md new file mode 100644 index 00000000..84ce49f1 --- /dev/null +++ b/docs/development/current/main/phase120_baseline_results.md @@ -0,0 +1,172 @@ +# Phase 120: selfhost Stage-3 ベースライン結果 + +## 実行日時 + +2025-12-04(Phase 106-115 完了直後) + +## 環境 + +- **Rust VM**: ./target/release/hakorune +- **LLVM**: llvmlite ハーネス(今回は未実行) +- **JoinIR Strict**: NYASH_JOINIR_STRICT=1 +- **selfhost**: NYASH_USE_NY_COMPILER=1 NYASH_PARSER_STAGE3=1 HAKO_PARSER_STAGE3=1 + +## 代表パス実行結果 + +### 1. peek_expr_block.hako + +**ファイル**: `apps/tests/peek_expr_block.hako` + +| 項目 | 結果 | +|------|------| +| **実行結果** | ✅ 成功 | +| **エラーメッセージ** | なし | +| **警告メッセージ** | `[deprecate/env]` NYASH_PARSER_STAGE3 deprecated
`⚠️ [DEPRECATED]` builtin ArrayBox deprecated
`[selfhost-child] timeout` 2000ms | +| **標準出力** | `found one`
`RC: 1` | +| **備考** | match 式が正常に JoinIR If Lowering で処理。ブロック式の評価も正常動作。期待通りの出力を確認。 | + +**技術的詳細**: +- match 式が If Lowering で複数の条件分岐に変換された +- ブロック式(`{ print("...") 値 }`)が正しく評価され、最後の値が返却された +- PHI 命令による各分岐からの値の合流が正常動作 + +### 2. loop_min_while.hako + +**ファイル**: `apps/tests/loop_min_while.hako` + +| 項目 | 結果 | +|------|------| +| **実行結果** | ✅ 成功 | +| **エラーメッセージ** | なし | +| **警告メッセージ** | `[deprecate/env]` NYASH_PARSER_STAGE3 deprecated
`[selfhost-child] timeout` 2000ms | +| **標準出力** | `0`
`1`
`2`
`RC: 0` | +| **デバッグ出力** | `[ControlForm::Loop]` entry=3 preheader=3 header=4 body=5 latch=6 exit=7 | +| **備考** | loop 構文が正常に JoinIR Loop Lowering で処理。ControlForm 構造が正しく構築。 | + +**技術的詳細**: +- ループが JoinIR Loop Lowering で処理され、ControlForm::Loop 構造を構築 +- entry/preheader/header/body/latch/exit の各ブロックが正しく生成 +- ループ変数 `i` の PHI 命令が正常生成(初期値 0 と更新値の合流) +- ループ終了条件 `i < 3` が正しく評価され、exit ブロックへ遷移 + +### 3. esc_dirname_smoke.hako + +**ファイル**: `apps/tests/esc_dirname_smoke.hako` + +| 項目 | 結果 | +|------|------| +| **実行結果** | ❌ エラー | +| **エラーメッセージ** | `[ERROR] ❌ [rust-vm] VM error: Invalid instruction: Unknown method 'println' on ConsoleBox` | +| **警告メッセージ** | `[deprecate/env]` NYASH_PARSER_STAGE3 deprecated
`[warn] dev verify:` NewBox ConsoleBox not followed by birth()
`[warn] dev verify:` NewBox Main not followed by birth()
`⚠️ [DEPRECATED]` builtin ConsoleBox deprecated
`[selfhost-child] timeout` 2000ms | +| **標準出力** | なし(エラーで中断) | +| **デバッグ出力** | `[ControlForm::Loop]` entry=8 preheader=8 header=9 body=10 latch=11 exit=12 | +| **備考** | esc_json メソッドのループと dirname メソッドの if 文は正常動作。ConsoleBox.println でエラー。 | + +**技術的詳細**: +- esc_json メソッド内のループが JoinIR Loop Lowering で正常処理 +- dirname メソッド内の if 文も JoinIR If Lowering で正常処理 +- StringBox メソッド(length, substring, lastIndexOf)の呼び出しは正常 +- **エラー原因**: ConsoleBox の println メソッドが見つからない + - ConsoleBox の実装に println メソッドがない可能性 + - selfhost コンパイラのメソッド解決に問題がある可能性 +- **NewBox→birth 警告**: ConsoleBox と Main の生成時に birth() 呼び出しが検出されない + - birth() が省略可能な設計なので、これは警告レベルの問題 + +## Phase 120 サマリー + +### 実行結果統計 + +- **✅ 完全成功**: 2本(peek_expr_block.hako, loop_min_while.hako) +- **⚠️ 警告あり**: 2本(警告があっても実行成功) +- **❌ エラー**: 1本(esc_dirname_smoke.hako) + +### JoinIR Strict モードでの検証 + +| 検証項目 | 結果 | 備考 | +|---------|------|------| +| If 文の JoinIR Lowering | ✅ 正常動作 | peek_expr_block.hako, esc_dirname_smoke.hako | +| Loop の JoinIR Lowering | ✅ 正常動作 | loop_min_while.hako, esc_dirname_smoke.hako | +| ControlForm 構造生成 | ✅ 正常動作 | header/body/latch/exit ブロックが正しく構築 | +| match 式の処理 | ✅ 正常動作 | If Lowering で複数条件分岐に変換 | +| ブロック式の評価 | ✅ 正常動作 | 最後の式が値として返却 | +| PHI 命令生成 | ✅ 正常動作 | 分岐・ループでの値合流 | +| StringBox メソッド | ✅ 正常動作 | length, substring, lastIndexOf | +| ConsoleBox.println | ❌ エラー | メソッド解決失敗 | + +### 重要な発見 + +1. **JoinIR Lowering は安定動作** + - If/Loop の基本的な JoinIR Lowering は完全に動作している + - ControlForm 構造が正しく構築され、PHI 命令も正常生成 + +2. **selfhost コンパイラの動作** + - 2000ms タイムアウト警告が出るが、これはコンパイル時間の警告(正常動作) + - NYASH_PARSER_STAGE3 の deprecation 警告は環境変数名の変更推奨 + +3. **ConsoleBox.println 問題** + - ConsoleBox の println メソッドが selfhost 経路で解決できない + - builtin ConsoleBox の plugin 化が推奨されている + - これは selfhost 経路特有の問題と思われる(通常の VM 実行では動作するはず) + +## Phase 122+ への課題 + +### 優先度高(エラー) + +- [ ] **ConsoleBox.println メソッドエラーの解決** + - 原因: selfhost 経路でのメソッド解決失敗 + - 影響: ConsoleBox を使用するプログラムが実行できない + - 対応: ConsoleBox の実装確認、または selfhost コンパイラのメソッド解決修正 + +- [ ] **NewBox→birth 警告の調査** + - 原因: birth() 呼び出しの検出ロジック + - 影響: 警告レベル(実行は可能) + - 対応: birth() 呼び出し検出の改善、または警告条件の緩和 + +### 優先度中(警告) + +- [ ] **NYASH_PARSER_STAGE3 deprecation 警告への対応** + - 原因: 環境変数名の変更推奨 + - 影響: 警告メッセージが出力される + - 対応: `NYASH_FEATURES=stage3` への移行 + +- [ ] **selfhost-child 2000ms タイムアウト警告の改善** + - 原因: selfhost コンパイル時間が長い + - 影響: 警告メッセージが出力される(実行は成功) + - 対応: タイムアウト時間の調整、またはコンパイル速度の改善 + +### 優先度低(最適化) + +- [ ] **builtin ArrayBox/ConsoleBox の plugin 化推奨への対応** + - 原因: Phase 15.5 の Everything is Plugin 方針 + - 影響: deprecation 警告が出力される + - 対応: plugin 化の検討(長期的な対応) + +## 結論 + +Phase 120 時点での selfhost Stage-3 経路は: + +### ✅ **基本動作は良好** +- 2/3 のプログラムが完全に動作 +- JoinIR If/Loop Lowering が安定動作 +- ControlForm 構造とPHI 命令の生成が正常 + +### ⚠️ **警告はあるが実行可能** +- deprecation 警告は情報提供レベル +- selfhost コンパイル時間の警告は既知の挙動 + +### ❌ **1つの致命的エラー** +- ConsoleBox.println メソッド解決エラー +- これは Phase 122+ で優先的に修正が必要 + +### 📊 **Phase 106-115 の成果** +- JoinIR Strict モードでの基本動作が確立 +- If/Loop の Lowering が安定して動作 +- selfhost 経路の基礎が固まった + +Phase 122+ で上記課題を段階的に解決し、selfhost Stage-3 経路の完全な安定化を目指す。 + +--- + +**作成日**: 2025-12-04 +**Phase**: 120(selfhost Stage-3 代表パスの安定化) +**ベースライン確立**: Phase 106-115 完了時点 diff --git a/docs/development/current/main/phase120_selfhost_stable_paths.md b/docs/development/current/main/phase120_selfhost_stable_paths.md new file mode 100644 index 00000000..9f6b052d --- /dev/null +++ b/docs/development/current/main/phase120_selfhost_stable_paths.md @@ -0,0 +1,352 @@ +# Phase 120: selfhost Stage-3 代表パスの安定化 + +## 0. ゴール + +- **JoinIR Strict ON 環境**で selfhost 経路(Stage-3 .hako コンパイラ)が安定動作することを確認 +- 代表的な .hako プログラム(2-3本)を選定し、**NYASH_JOINIR_STRICT=1** での実行を記録 +- フォールバック・警告・エラーを洗い出し、**Phase 106-115 完了時点のベースライン**を確立 + +--- + +## 1. スコープと非スコープ + +### スコープ(今回やること) + +1. **代表パス選定**: selfhost で使う .hako ファイルから代表的なものを2-3本選定 +2. **docs 整理**: 代表パスの期待フロー・JoinIR Strict モードの意味を1ドキュメントにまとめる +3. **実行調査**: `NYASH_JOINIR_STRICT=1` で各代表パスを実行し、フォールバック・警告・エラーを記録 +4. **スモークスクリプト作成**: 代表パスの実行を再現できる smoke スクリプト化(`tools/smokes/v2/` 形式) +5. **ベースライン確立**: Phase 106-115 完了時点での動作状況を記録(Phase 120 実装前の基準点) + +### 非スコープ(今回はやらない) + +- **実装修正**: JoinIR 経路の実装バグ修正(Phase 122+ に回す) +- **hako_check 統合**: Phase 121 で設計を行う(今回は selfhost パスのみ) +- **全プログラム網羅**: 代表的なもの2-3本のみ(全 .hako の検証は別 Phase) + +--- + +## 2. Task 1: 代表パス選定と期待フロー整理 + +### 2.1 代表パスの選定基準 + +**Phase 120 で扱う「代表パス」の条件**: + +| 基準 | 説明 | +|------|------| +| **selfhost 経路で実行** | `NYASH_USE_NY_COMPILER=1` 等の selfhost 環境変数で動作するもの | +| **Stage-3 対象** | .hako コンパイラ自体、または selfhost で動作する実用プログラム | +| **複雑さのバランス** | 単純すぎず(hello world)、複雑すぎず(全 selfhost コンパイラ)のもの | +| **既存テスト可能** | apps/ または local_tests/ に既に存在し、動作確認済みのもの | + +**推奨候補**(2-3本選定): + +1. **簡易パーサーテスト**: `apps/tests/peek_expr_block.hako` 等(簡単な制御構造) +2. **ループ・PHI 含む**: `apps/tests/loop_min_while.hako` 等(JoinIR If/Loop Lowering 対象) +3. **実用スクリプト**: `apps/examples/` から1本(FileBox/StringBox 使用等) + +### 2.2 期待フローのドキュメント化 + +**ファイル**: `docs/development/current/main/selfhost_stage3_expected_flow.md`(新規) + +**記載内容**: + +```markdown +# selfhost Stage-3 期待フロー(Phase 120 時点) + +## 概要 + +Phase 106-115 完了時点での selfhost 経路(Stage-3 .hako コンパイラ)の動作フローを記録。 + +## 実行環境 + +- **VM バックエンド**: `./target/release/nyash program.hako`(デフォルト) +- **LLVM バックエンド**: `./target/release/nyash --backend llvm program.hako` +- **selfhost 有効**: `NYASH_USE_NY_COMPILER=1` 等の環境変数 + +## JoinIR Strict モードとは + +**環境変数**: `NYASH_JOINIR_STRICT=1` + +**目的**: JoinIR 経路で旧 MIR/PHI 経路へのフォールバックを禁止し、厳格に JoinIR Lowering のみを使用 + +**期待される動作**: +- ✅ If/Loop Lowering が完全に JoinIR 経由で動作 +- ❌ 旧 PHI 生成器へのフォールバックは禁止(エラーで停止) +- ⚠️ 警告: フォールバック候補があれば警告出力 + +## 代表パスの期待フロー + +### 1. peek_expr_block.hako(簡易パーサーテスト) + +**期待**: +- ✅ If 文が JoinIR If Lowering で処理 +- ✅ ブロック式が正常に評価 +- ✅ NYASH_JOINIR_STRICT=1 でもエラーなし + +### 2. loop_min_while.hako(ループ・PHI 含む) + +**期待**: +- ✅ Loop が JoinIR Loop Lowering で処理 +- ✅ PHI 命令が正しく生成(ループ変数の合流) +- ⚠️ 警告: 旧 PHI 経路へのフォールバック候補があるかもしれない(Phase 120 調査対象) + +### 3. [実用スクリプト名](実用例) + +**期待**: +- ✅ FileBox/StringBox 等の Box 操作が正常動作 +- ✅ 複雑な制御構造が JoinIR 経由で処理 +- ⚠️ 警告: 複雑さによってはフォールバックや警告が出る可能性 + +## Phase 120 の目標 + +上記の「期待」と「実際の動作」を比較し、ギャップを記録する。 +実装修正は Phase 122+ で行う(Phase 120 はベースライン確立のみ)。 +``` + +--- + +## 3. Task 2: 実行調査とログ記録 + +### 3.1 実行コマンド + +各代表パスについて、以下のコマンドで実行し、出力を記録する: + +```bash +# VM バックエンド(デフォルト) +NYASH_JOINIR_STRICT=1 NYASH_USE_NY_COMPILER=1 \ + ./target/release/nyash [代表パス.hako] 2>&1 | tee /tmp/phase120_vm_[name].log + +# LLVM バックエンド(オプション) +NYASH_JOINIR_STRICT=1 NYASH_USE_NY_COMPILER=1 \ + ./target/release/nyash --backend llvm [代表パス.hako] 2>&1 | tee /tmp/phase120_llvm_[name].log +``` + +### 3.2 記録内容 + +**ログファイル**: `/tmp/phase120_execution_results.txt`(新規) + +**記録形式**: + +``` +=== Phase 120: selfhost Stage-3 代表パス実行記録 === +実行日時: 2025-12-04 +Phase 106-115 完了時点のベースライン + +--- 代表パス 1: peek_expr_block.hako --- +コマンド: NYASH_JOINIR_STRICT=1 NYASH_USE_NY_COMPILER=1 ./target/release/nyash apps/tests/peek_expr_block.hako +結果: ✅ 成功 / ❌ エラー / ⚠️ 警告あり + +エラー・警告メッセージ: +[ログ出力をここに貼り付け] + +備考: +- [気づいた点や特記事項] + +--- 代表パス 2: loop_min_while.hako --- +... +``` + +### 3.3 分類基準 + +**ログ分類**: + +| 分類 | 判定基準 | 対応 | +|------|---------|------| +| ✅ **完全成功** | エラーなし、警告なし、期待通りの出力 | ベースライン記録 | +| ⚠️ **警告あり** | 実行成功、警告メッセージあり | Phase 122+ で調査 | +| ❌ **エラー** | 実行失敗、エラーで停止 | Phase 122+ で修正 | + +--- + +## 4. Task 3: スモークスクリプト作成 + +### 4.1 実装内容 + +**ファイル**: `tools/smokes/v2/profiles/integration/selfhost/phase120_stable_paths.sh`(新規) + +**スクリプト構造**: + +```bash +#!/bin/bash +# Phase 120: selfhost Stage-3 代表パス smoke テスト + +SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" +source "$SCRIPT_DIR/../../../common.sh" + +# Phase 120 環境変数 +export NYASH_JOINIR_STRICT=1 +export NYASH_USE_NY_COMPILER=1 + +# 代表パス 1: peek_expr_block.hako +run_test "selfhost_peek_expr" "apps/tests/peek_expr_block.hako" "vm" + +# 代表パス 2: loop_min_while.hako +run_test "selfhost_loop_min" "apps/tests/loop_min_while.hako" "vm" + +# 代表パス 3: [実用スクリプト] +run_test "selfhost_example" "apps/examples/[name].hako" "vm" + +# LLVM バックエンド版(オプション) +# run_test "selfhost_peek_expr_llvm" "apps/tests/peek_expr_block.hako" "llvm" + +echo "[Phase 120] selfhost stable paths smoke test completed" +``` + +### 4.2 統合 + +**スモークテストランナーに追加**: + +`tools/smokes/v2/profiles/integration/integration_profile.txt` に以下を追加: + +``` +selfhost/phase120_stable_paths.sh +``` + +### 4.3 実行確認 + +```bash +# 単発実行 +bash tools/smokes/v2/profiles/integration/selfhost/phase120_stable_paths.sh + +# integration プロファイル全体実行 +tools/smokes/v2/run.sh --profile integration --filter "selfhost_*" +``` + +--- + +## 5. Task 4: ベースライン確立とドキュメント更新 + +### 5.1 実装内容 + +**ファイル**: `docs/development/current/main/phase120_baseline_results.md`(新規) + +**記載内容**: + +```markdown +# Phase 120: selfhost Stage-3 ベースライン結果 + +## 実行日時 + +2025-12-04(Phase 106-115 完了直後) + +## 環境 + +- **Rust VM**: ./target/release/nyash +- **LLVM**: llvmlite ハーネス(オプション) +- **JoinIR Strict**: NYASH_JOINIR_STRICT=1 +- **selfhost**: NYASH_USE_NY_COMPILER=1 + +## 代表パス実行結果 + +### 1. peek_expr_block.hako + +| 項目 | 結果 | +|------|------| +| **実行結果** | ✅ 成功 / ⚠️ 警告 / ❌ エラー | +| **エラーメッセージ** | [ログから抽出] | +| **警告メッセージ** | [ログから抽出] | +| **備考** | [特記事項] | + +### 2. loop_min_while.hako + +[同様の表] + +### 3. [実用スクリプト名] + +[同様の表] + +## Phase 122+ への課題 + +**優先度高**: +- [ ] [エラー1の説明] +- [ ] [エラー2の説明] + +**優先度中**: +- [ ] [警告1の説明] +- [ ] [警告2の説明] + +**優先度低(最適化)**: +- [ ] [改善案1] +- [ ] [改善案2] + +## 結論 + +Phase 120 時点での selfhost Stage-3 経路は: +- ✅ **基本動作**: [成功した代表パスの数]本 +- ⚠️ **警告あり**: [警告があった数]本 +- ❌ **エラー**: [エラーが出た数]本 + +Phase 122+ で上記課題を段階的に解決する。 +``` + +### 5.2 CURRENT_TASK.md 更新 + +**ファイル**: `CURRENT_TASK.md`(修正) + +**Phase 120 セクション追加**: + +```markdown +### 🎯 Phase 120: selfhost Stage-3 代表パスの安定化(完了) + +- ✅ 代表パス選定: [選定した .hako ファイル名] +- ✅ 期待フロー整理: selfhost_stage3_expected_flow.md 作成 +- ✅ 実行調査完了: NYASH_JOINIR_STRICT=1 での動作確認 +- ✅ ベースライン確立: phase120_baseline_results.md 作成 +- ✅ スモークスクリプト: phase120_stable_paths.sh 作成 + +**次のステップ**: Phase 121(hako_check JoinIR 統合設計) +``` + +--- + +## 6. 完成チェックリスト(Phase 120) + +- [ ] 代表パス 2-3本の選定完了(peek_expr_block.hako 等) +- [ ] selfhost_stage3_expected_flow.md 作成(期待フロー整理) +- [ ] NYASH_JOINIR_STRICT=1 での実行ログ記録(/tmp/phase120_execution_results.txt) +- [ ] phase120_baseline_results.md 作成(ベースライン確立) +- [ ] スモークスクリプト作成(phase120_stable_paths.sh) +- [ ] integration プロファイルへの統合確認 +- [ ] CURRENT_TASK.md 更新(Phase 120 完了記録) +- [ ] ビルド・テスト全 PASS(cargo build --release && bash phase120_stable_paths.sh) + +--- + +## 7. 設計原則(Phase 120 で確立) + +### ベースライン First + +``` +【Phase 120 の哲学】 +実装修正の前に、「現状を正確に記録する」 + +Flow: + Phase 106-115 完了 + ↓ + Phase 120: 現状記録(ベースライン確立) + ↓ + Phase 121: 設計(hako_check 統合計画) + ↓ + Phase 122+: 実装修正(段階的改善) +``` + +### 代表パスの活用 + +**少数精鋭の代表パスで効率的に検証**: + +- **2-3本**で selfhost 経路の主要パターンをカバー +- **簡単・中間・複雑**の3段階でバランス +- **既存テスト**を活用(新規作成は最小限) + +### JoinIR Strict モードの意義 + +**Phase 120 での使い方**: + +- **厳格モード**: フォールバックを禁止し、JoinIR 経路の完全性を確認 +- **警告収集**: 現状の JoinIR 経路の課題を可視化 +- **Phase 122+ の修正指針**: 警告・エラーが修正の優先順位を決める + +--- + +**Phase 120 指示書完成日**: 2025-12-04(Phase 106-115 完了直後) diff --git a/docs/development/current/main/selfhost_stage3_expected_flow.md b/docs/development/current/main/selfhost_stage3_expected_flow.md new file mode 100644 index 00000000..f144d498 --- /dev/null +++ b/docs/development/current/main/selfhost_stage3_expected_flow.md @@ -0,0 +1,137 @@ +# selfhost Stage-3 期待フロー(Phase 120 時点) + +## 概要 + +Phase 106-115 完了時点での selfhost 経路(Stage-3 .hako コンパイラ)の動作フローを記録。 + +## 実行環境 + +- **VM バックエンド**: `./target/release/nyash program.hako`(デフォルト) +- **LLVM バックエンド**: `./target/release/nyash --backend llvm program.hako` +- **selfhost 有効**: `NYASH_USE_NY_COMPILER=1` 等の環境変数 + +## JoinIR Strict モードとは + +**環境変数**: `NYASH_JOINIR_STRICT=1` + +**目的**: JoinIR 経路で旧 MIR/PHI 経路へのフォールバックを禁止し、厳格に JoinIR Lowering のみを使用 + +**期待される動作**: +- ✅ If/Loop Lowering が完全に JoinIR 経由で動作 +- ❌ 旧 PHI 生成器へのフォールバックは禁止(エラーで停止) +- ⚠️ 警告: フォールバック候補があれば警告出力 + +## 代表パスの期待フロー + +### 1. peek_expr_block.hako(簡易パーサーテスト) + +**ファイルパス**: `apps/tests/peek_expr_block.hako` + +**プログラム内容**: +- match 式によるパターンマッチング("0", "1", "_" パターン) +- ブロック式(複数文を含む式ブロック) +- 返り値の代入と返却 + +**期待される JoinIR 処理**: +- ✅ match 式が If Lowering で複数の条件分岐に変換 +- ✅ ブロック式が正常に評価(最後の式が値として返却) +- ✅ NYASH_JOINIR_STRICT=1 でもエラーなし + +**検証ポイント**: +- If 文の JoinIR Lowering が正常動作 +- PHI 命令の生成(各分岐からの値の合流) +- ブロック式の値伝播 + +### 2. loop_min_while.hako(ループ・PHI 含む) + +**ファイルパス**: `apps/tests/loop_min_while.hako` + +**プログラム内容**: +- loop 構文(条件: `i < 3`) +- ループ変数の更新(`i = i + 1`) +- ループ内での print 呼び出し + +**期待される JoinIR 処理**: +- ✅ Loop が JoinIR Loop Lowering で処理 +- ✅ PHI 命令が正しく生成(ループ変数 i の合流) +- ✅ ループの終了条件が正しく評価 + +**検証ポイント**: +- Loop の JoinIR Lowering が正常動作 +- Entry PHI(ループ変数の初期値と更新値の合流) +- Exit PHI(ループ終了時の値伝播) +- ⚠️ 警告: 旧 PHI 経路へのフォールバック候補があるかもしれない(Phase 120 調査対象) + +### 3. esc_dirname_smoke.hako(実用スクリプト) + +**ファイルパス**: `apps/tests/esc_dirname_smoke.hako` + +**プログラム内容**: +- 複数のメソッド定義(esc_json, dirname, main) +- 文字列操作(substring, length, lastIndexOf) +- 複雑な制御構造(ネストした if 文、ループ) +- Box 操作(ConsoleBox の使用) + +**期待される JoinIR 処理**: +- ✅ StringBox メソッド呼び出しが正常動作 +- ✅ ConsoleBox の生成と使用が正常動作 +- ✅ 複雑なネスト構造が JoinIR 経由で処理 +- ✅ ループと条件分岐の組み合わせが正常動作 + +**検証ポイント**: +- 複数メソッドの呼び出し(me.esc_json, me.dirname) +- StringBox の基本操作(length, substring, lastIndexOf) +- ネストした制御構造の JoinIR Lowering +- ConsoleBox プラグインとの連携 +- ⚠️ 警告: 複雑さによってはフォールバックや警告が出る可能性 + +## Phase 120 の目標 + +上記の「期待」と「実際の動作」を比較し、ギャップを記録する。 +実装修正は Phase 122+ で行う(Phase 120 はベースライン確立のみ)。 + +## 実行コマンド例 + +```bash +# 基本実行(VM バックエンド) +NYASH_JOINIR_STRICT=1 NYASH_USE_NY_COMPILER=1 \ + ./target/release/nyash apps/tests/peek_expr_block.hako + +# 詳細ログ付き実行 +NYASH_JOINIR_STRICT=1 NYASH_USE_NY_COMPILER=1 NYASH_CLI_VERBOSE=1 \ + ./target/release/nyash apps/tests/loop_min_while.hako + +# LLVM バックエンド(オプション) +NYASH_JOINIR_STRICT=1 NYASH_USE_NY_COMPILER=1 \ + ./target/release/nyash --backend llvm apps/tests/esc_dirname_smoke.hako +``` + +## 記録対象 + +Phase 120 実行調査では以下を記録する: + +1. **実行結果**: 成功/警告あり/エラー +2. **エラーメッセージ**: 完全なエラーログ +3. **警告メッセージ**: JoinIR 関連の警告 +4. **出力結果**: プログラムの標準出力 +5. **特記事項**: 予期しない動作や注目すべき点 + +## Phase 122+ への課題 + +Phase 120 での記録をもとに、以下の優先順位で課題を整理する: + +**優先度高(エラー)**: +- プログラムが実行できない致命的な問題 + +**優先度中(警告)**: +- 実行は成功するが、警告が出る問題 +- JoinIR 経路の不完全性 + +**優先度低(最適化)**: +- 動作するが、改善の余地がある点 +- パフォーマンス最適化の候補 + +--- + +**作成日**: 2025-12-04 +**Phase**: 120(selfhost Stage-3 代表パスの安定化) diff --git a/tools/smokes/v2/profiles/integration/selfhost/phase120_stable_paths.sh b/tools/smokes/v2/profiles/integration/selfhost/phase120_stable_paths.sh new file mode 100644 index 00000000..311eef21 --- /dev/null +++ b/tools/smokes/v2/profiles/integration/selfhost/phase120_stable_paths.sh @@ -0,0 +1,82 @@ +#!/bin/bash +# phase120_stable_paths.sh — Phase 120: selfhost Stage-3 stable paths smoke test + +source "$(dirname "$0")/../../../lib/test_runner.sh" +export SMOKES_USE_PYVM=0 +require_env || exit 2 +preflight_plugins || exit 2 + +# Phase 120 environment variables +export NYASH_JOINIR_STRICT=1 +export NYASH_USE_NY_COMPILER=1 +export NYASH_PARSER_STAGE3=1 +export HAKO_PARSER_STAGE3=1 + +log_info "Phase 120: selfhost Stage-3 stable paths smoke test" +log_info "JoinIR Strict mode: NYASH_JOINIR_STRICT=1" + +# Test counter +PASSED=0 +FAILED=0 +TOTAL=3 + +# Representative path 1: peek_expr_block.hako +log_info "[1/3] Testing peek_expr_block.hako (match expression with block expressions)" +output=$(run_nyash_vm "$NYASH_ROOT/apps/tests/peek_expr_block.hako" 2>&1) || true +if echo "$output" | grep -q "found one"; then + log_success "peek_expr_block.hako: PASS (match expression lowered correctly)" + PASSED=$((PASSED + 1)) +else + log_error "peek_expr_block.hako: FAIL (unexpected output or error)" + echo "$output" | head -20 + FAILED=$((FAILED + 1)) +fi + +# Representative path 2: loop_min_while.hako +log_info "[2/3] Testing loop_min_while.hako (loop with PHI instructions)" +output=$(run_nyash_vm "$NYASH_ROOT/apps/tests/loop_min_while.hako" 2>&1) || true +if echo "$output" | grep -q "0" && echo "$output" | grep -q "1" && echo "$output" | grep -q "2"; then + log_success "loop_min_while.hako: PASS (loop lowered correctly with PHI)" + PASSED=$((PASSED + 1)) +else + log_error "loop_min_while.hako: FAIL (unexpected output or error)" + echo "$output" | head -20 + FAILED=$((FAILED + 1)) +fi + +# Representative path 3: esc_dirname_smoke.hako +log_info "[3/3] Testing esc_dirname_smoke.hako (complex control structures with StringBox)" +output=$(run_nyash_vm "$NYASH_ROOT/apps/tests/esc_dirname_smoke.hako" 2>&1) || true +# Expected: This test currently fails with ConsoleBox.println error +# We record the baseline: this is a known issue for Phase 122+ +if echo "$output" | grep -q "Unknown method 'println' on ConsoleBox"; then + log_warn "esc_dirname_smoke.hako: BASELINE RECORDED (expected ConsoleBox.println error)" + log_info " Issue recorded for Phase 122+ resolution" + # Don't count as pass or fail - it's a baseline recording +else + log_error "esc_dirname_smoke.hako: FAIL (unexpected error - not the known ConsoleBox.println issue)" + echo "$output" | head -20 + FAILED=$((FAILED + 1)) +fi + +# Summary +log_info "==========================================" +log_info "Phase 120 Baseline Results:" +log_info " Passed: $PASSED/$TOTAL" +log_info " Failed: $FAILED/$TOTAL" +log_info " Known Issues: 1 (esc_dirname_smoke.hako)" +log_info "==========================================" +log_info "JoinIR If/Loop Lowering: Stable" +log_info "ControlForm structure: Correct" +log_info "PHI instruction generation: Working" +log_info "ConsoleBox.println: Known issue for Phase 122+" +log_info "==========================================" + +# Exit code: pass if at least 2/3 pass (allowing for known issues) +if [ "$PASSED" -ge 2 ]; then + log_success "Phase 120 baseline established successfully" + exit 0 +else + log_error "Phase 120 baseline check failed" + exit 1 +fi