diff --git a/CLAUDE.md b/CLAUDE.md index 2e6707c1..9c9b70b0 100644 --- a/CLAUDE.md +++ b/CLAUDE.md @@ -4,6 +4,9 @@ ## Start Here (必ずここから) - 現在のタスク: [CURRENT_TASK.md](CURRENT_TASK.md) + - 📁 **Main**: [docs/current_task/main/](docs/current_task/main/) + - 📁 **LLVM**: [docs/current_task/llvm/](docs/current_task/llvm/) + - 📁 **Self**: [docs/current_task/self_current_task/](docs/current_task/self_current_task/) - ドキュメントハブ: [README.md](README.md) - 🚀 **開発マスタープラン**: [00_MASTER_ROADMAP.md](docs/development/roadmap/phases/00_MASTER_ROADMAP.md) - 📊 **JIT統計JSONスキーマ(v1)**: [jit_stats_json_v1.md](docs/reference/jit/jit_stats_json_v1.md) @@ -120,10 +123,11 @@ cargo build --release --features llvm ./target/release/nyash --aot program.nyash -o program.exe ``` -## 📝 Update (2025-09-05) +## 📝 Update (2025-09-08) - 🎉 Phase 15到達!セルフホスティング実装中 - v0 Nyパーサー完成(Ny→JSON IR v0) -- 直接ブリッジ設計とAOT P2スタブ実装 +- 🔥 ループビルダーSSAバグ発見・調査完了(ブロッカー) +- NyコンパイラMVP実装予定(Ny→MIR) - MIR 13命令への最終最適化完了 - 80k→20k行(75%削減)の革命的圧縮を目指す - 詳細: [Phase 15 README](docs/development/roadmap/phases/phase-15/README.md) @@ -138,8 +142,8 @@ cargo build --release --features llvm ```nyash // デリゲーション構文(すべてのBoxで統一的に使える!) box Child from Parent { // from構文でデリゲーション - init(args) { // コンストラクタは「init」に統一 - from Parent.init(args) // 親の初期化 + birth(args) { // コンストラクタは「birth」に統一 + from Parent.birth(args) // 親の初期化 } override method() { // 明示的オーバーライド必須 diff --git a/CURRENT_TASK.md b/CURRENT_TASK.md index f8071d43..db219b1b 100644 --- a/CURRENT_TASK.md +++ b/CURRENT_TASK.md @@ -1,11 +1,11 @@ -# Restart Notes — Ny Syntax Alignment (2025‑09‑07) +# Restart Notes — Ny Syntax Alignment (2025‑09‑08) 目的 - Self‑Hosting 方針(Nyのみで工具を回す前段)に合わせて、Ny 構文とコーディング規約を明示化し、最小版ツールの完走性を優先。 Ny 構文(実装時の基準) - 1行1文/セミコロン非使用。 -- break / continue を使わない(関数早期 return、番兵条件、if 包みで置換)。 +- break / continue を使わない(関数早期 return、番兵条件、if 包みで置換)→ **注:Phase 13でcontinue/break実装済み** - else は直前の閉じ波括弧と同一行(`} else {`})。 - 文字列の `"` と `\` は確実にエスケープ。 - 反復は `loop(条件) { …; インクリメント }` を基本とし、必要に応じて「関数早期 return」型で早期脱出。 @@ -15,6 +15,7 @@ Ny 構文(実装時の基準) - `apps/selfhost/tools/dep_tree_min_string.nyash` - FileBox/PathBox + 文字走査のみで JSON 構築(配列/マップに頼らない) - `make dep-tree` で `tmp/deps.json` を出力 + - **🔥 ブロッカー: ループビルダーSSAバグ(詳細は docs/current_task/self_current_task/10-Now.md 参照)** 2) using/module 対応は次段(構文・優先順位をユーザーと再すり合わせ後) - 優先: `module > 相対 > using-path`、曖昧=エラー、STRICT ゲート(要相談) 3) ブリッジ Stage 1 は保留 diff --git a/docs/current_task/self_current_task/10-Now.md b/docs/current_task/self_current_task/10-Now.md index ddf3366e..605ff806 100644 --- a/docs/current_task/self_current_task/10-Now.md +++ b/docs/current_task/self_current_task/10-Now.md @@ -1,25 +1,62 @@ # Self Current Task — Now (main) -2025‑09‑08:現状と直近タスク -- LLVM 側 P0 完了(BitOps/Array/Echo/Map 緑)。VInvoke(by‑name/by‑id vector) は戻り値マッピングの暫定課題を確認中(下記 Decisions 参照)。 -- selfhosting-dev の作業を main に順次取り込み。VM/MIR 基盤は main で先に整える方針。 +2025‑09‑08:現状と直近タスク(selfhosting) -直近タスク(優先) -1) continue/break の lowering(Builder 修正のみで表現) - - ループ文脈スタック {head, exit} を導入。 - - continue に遭遇 → head(または latch)へ br を emit し終端。 - - break に遭遇 → exit へ br を emit し終端。 - - post‑terminated 後に emit しない制御を徹底。 -2) ループ CFG の厳密化 - - 単一 exit ブロックの徹底。 - - Phi はヘッダでキャリー変数を合流(SSA/支配関係が崩れない形)。 -3) 検証とスモーク - - Verifier 緑(dominance/SSA)。 - - VM のループ代表(単純/ネスト/早期継続・脱出)。 - - LLVM/Cranelift EXE に綺麗に降りる(br/phi ベースで問題なし)。 +## 🔴 重要:ループビルダーのバグ発見(詳細調査完了) -代表コマンド(例) +### 問題詳細 +- **症状**: dep_tree_min_string.nyashがVM実行でエラー `Invalid value: Value %57 not set` +- **発生箇所**: `loop(i + m <= n) { if ... { return 1 } i = i + 1 }`のような構造 + +### 根本原因(深掘り調査結果) +- **ループビルダーの致命的欠陥**: `build_statement`が親ビルダーに単純委譲するだけ + ```rust + // src/mir/loop_builder.rs:397-399 + fn build_statement(&mut self, stmt: ASTNode) -> Result { + self.parent_builder.build_expression(stmt) // スコープ管理が失われる! + } + ``` +- **block_var_mapsの不完全性**: preheaderとlatchの2箇所しか保存しない + - ループ内if文で生成される中間ブロックの変数状態が保存されない + - 結果として変数の最終値が追跡できない + +### 🎯 「箱を下に積む」解決策 +Nyashの開発哲学「Everything is Box」に従い、スコープも箱化する: + +1. **ScopeBox構造の導入** + ```rust + struct ScopeBox { + block_id: BasicBlockId, + variables: HashMap, + parent: Option>, // 親スコープへの参照 + } + ``` + +2. **全BasicBlockで変数スナップショットを保存** + - ブロック遷移時に自動的に変数状態を箱として保存 + - 階層的な変数解決(現在の箱→親の箱→...) + +3. **最小限の修正案** + - `build_statement`でブロック遷移を検出し、変数マップを保存 + - phi node作成時に適切な箱から値を取得 + +## 進捗 +- MIR ビルダー(self_main)へ Loop CFG/continue/break を移植(単一 exit + 単一 backedge、post‑terminated 禁止)。 +- dep_tree(string最小版)の実装完了も、上記バグにより実行不可。 + +## 直近タスク(優先度順) +1. **🔥 ループビルダーのバグ修正**(ブロッカー) + - **推奨案**: 「箱を下に積む」アプローチで最小限の修正 + - `build_statement`を改修してブロック遷移検出 + - 各ブロックの変数状態を自動的に箱として保存 + - 実装工数: 中程度(既存構造を活用) + - 代替案A: ループビルダーの根本的な再設計(工数大) + - 代替案B: 一時的なワークアラウンド(dep_tree_min_string.nyashの書き換え) +2. dep-tree 深さ1(直下 include)を children に反映(行ベースの素朴抽出、`//`/`#` 行コメントスキップ)。 +3. `make dep-tree` 結果の JSON 形を確認(先頭 `{`、必須キー、children のリーフが path のみ)。 +4. その後、深さ2→任意深さ(max-depth=64、visited)を段階的に解禁。 + +代表コマンド - ビルド: `cargo build --release` -- LLVM smoke: `LLVM_SYS_180_PREFIX=$(llvm-config-18 --prefix) NYASH_LLVM_BITOPS_SMOKE=1 ./tools/llvm_smoke.sh release` -- VInvoke 調査: `NYASH_LLVM_VINVOKE_TRACE=1 NYASH_LLVM_VINVOKE_SMOKE=1 ./tools/llvm_smoke.sh release` - +- 最小 dep-tree: `./target/release/nyash --backend vm apps/selfhost/tools/dep_tree_min_string.nyash` +- 生成: `make dep-tree`(`tmp/deps.json`)