docs: Update current task and loop builder SSA bug details

- Update dates to 2025-09-08
- Document loop builder SSA scope management issue
- Add notes about continue/break implementation status
- Fix birth/init consistency in CLAUDE.md
This commit is contained in:
Selfhosting Dev
2025-09-09 09:31:39 +09:00
parent 62246c76e3
commit 370e725926
3 changed files with 68 additions and 26 deletions

View File

@ -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() { // 明示的オーバーライド必須

View File

@ -1,11 +1,11 @@
# Restart Notes — Ny Syntax Alignment (20250907)
# Restart Notes — Ny Syntax Alignment (20250908)
目的
- SelfHosting 方針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 は保留

View File

@ -1,25 +1,62 @@
# Self Current Task — Now (main)
20250908現状と直近タスク
- LLVM 側 P0 完了BitOps/Array/Echo/Map 緑。VInvoke(byname/byid vector) は戻り値マッピングの暫定課題を確認中(下記 Decisions 参照)。
- selfhosting-dev の作業を main に順次取り込み。VM/MIR 基盤は main で先に整える方針。
20250908現状と直近タスクselfhosting
直近タスク(優先
1) continue/break の loweringBuilder 修正のみで表現)
- ループ文脈スタック {head, exit} を導入。
- continue に遭遇 → headまたは latchへ br を emit し終端。
- break に遭遇 → exit へ br を emit し終端。
- postterminated 後に 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<ValueId, String> {
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<String, ValueId>,
parent: Option<Box<ScopeBox>>, // 親スコープへの参照
}
```
2. **全BasicBlockで変数スナップショットを保存**
- ブロック遷移時に自動的に変数状態を箱として保存
- 階層的な変数解決(現在の箱→親の箱→...
3. **最小限の修正案**
- `build_statement`でブロック遷移を検出し、変数マップを保存
- phi node作成時に適切な箱から値を取得
## 進捗
- MIR ビルダーself_mainへ Loop CFG/continue/break を移植(単一 exit + 単一 backedge、postterminated 禁止)。
- dep_treestring最小版の実装完了も、上記バグにより実行不可。
## 直近タスク(優先度順)
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`