2025-11-19 08:35:56 +09:00
|
|
|
|
# Current Task — Phase 21.8 / 25 / 25.1 / 25.2 Snapshot(2025-11-18 時点)
|
2025-11-15 00:02:13 +09:00
|
|
|
|
|
2025-11-19 08:35:56 +09:00
|
|
|
|
> このファイルは「今どこまで終わっていて、次に何をやるか」を 1000 行以内でざっくり把握するためのスナップショットだよ。
|
|
|
|
|
|
> 詳細な履歴やログは `git log CURRENT_TASK.md` からいつでも参照できるようにしておくね。
|
2025-11-15 05:42:32 +09:00
|
|
|
|
|
2025-11-15 00:02:13 +09:00
|
|
|
|
---
|
|
|
|
|
|
|
2025-11-19 08:35:56 +09:00
|
|
|
|
## 0. 現在地ざっくり
|
2025-11-13 16:40:58 +09:00
|
|
|
|
|
2025-11-19 08:35:56 +09:00
|
|
|
|
- フェーズ軸:
|
|
|
|
|
|
- **21.8**: Numeric Core / Core-15 まわりの安定化(既に日常的には安定運用)。
|
|
|
|
|
|
- **25.x**: Stage0/Stage1/Stage‑B / Selfhost ラインのブートストラップと LoopForm v2 / LoopSSA v2 まわりの整備。
|
|
|
|
|
|
- **25.1 系**: Stage‑B / Stage‑1 / selfhost 向けに、Rust MIR / LoopForm v2 / LoopSSA v2 を段階的に整える長期ライン。
|
|
|
|
|
|
- Rust 側:
|
|
|
|
|
|
- LoopForm v2 + ControlForm + Conservative PHI は、代表テスト(Stage‑1 UsingResolver / Stage‑B 最小ループ)ではほぼ安定。
|
|
|
|
|
|
- 静的メソッド呼び出し規約と `continue` 絡みの PHI は 25.1m までで根治済み。
|
|
|
|
|
|
- .hako 側:
|
|
|
|
|
|
- Stage‑B コンパイラ本体 / LoopSSA v2 / BreakFinderBox / PhiInjectorBox はまだ部分実装。
|
|
|
|
|
|
- JSON v0 / selfhost ルートは Rust 側の LoopForm v2 規約に追いつかせる必要がある。
|
2025-11-13 16:40:58 +09:00
|
|
|
|
|
2025-11-15 00:02:13 +09:00
|
|
|
|
---
|
|
|
|
|
|
|
2025-11-19 08:35:56 +09:00
|
|
|
|
## 1. 最近完了した重要タスク
|
|
|
|
|
|
|
|
|
|
|
|
### 1-1. Phase 25.1m — Static Method / LoopForm v2 continue + PHI Fix(完了)
|
|
|
|
|
|
|
|
|
|
|
|
**目的**
|
|
|
|
|
|
- 静的メソッド呼び出し時の「暗黙レシーバ+引数ずれ」バグと、LoopForm v2 経路における `continue` + header PHI の欠落を根本から直す。
|
|
|
|
|
|
|
2025-11-19 10:08:04 +09:00
|
|
|
|
**Rust 側(静的メソッド / 暗黙レシーバ / JSON v0 Bridge)**
|
2025-11-19 08:35:56 +09:00
|
|
|
|
- `src/mir/function.rs::MirFunction::new`
|
|
|
|
|
|
- 暗黙 receiver 判定を是正し、**「第 1 パラメータが Box 型の関数だけ」をインスタンスメソッド with receiver** とみなす。
|
|
|
|
|
|
- 非 Box 型(`String`, `Integer` など)で始まるパラメータ列の関数は、暗黙レシーバなしの静的メソッド / Global 関数として扱うように変更。
|
|
|
|
|
|
- その結果:
|
|
|
|
|
|
- `static box TraceTest { method log(label) { ... } }` に対して `TraceTest.log("HELLO")` を呼ぶと、
|
|
|
|
|
|
`label` に `"HELLO"` が正しく入る(以前は `label = null` になっていた)。
|
2025-11-19 10:08:04 +09:00
|
|
|
|
- `src/mir/builder/decls.rs::build_static_main_box`
|
|
|
|
|
|
- `Main.main(args)` を「静的エントリ関数」に lower する経路を **`NYASH_BUILD_STATIC_MAIN_ENTRY=1` のときだけ有効** にし、
|
|
|
|
|
|
通常の VM 実行では wrapper `main()` を正規エントリとして扱うように整理。
|
|
|
|
|
|
- これにより、「`Main.main(args)` 版ではループが 1 度も回らず `return 0` で終わる」バグを解消。
|
|
|
|
|
|
- JSON v0 Bridge 経由の Box メソッド(Stage‑1/Stage‑B defs):
|
|
|
|
|
|
- `src/runner/json_v0_bridge/lowering.rs` で `prog.defs` の降下ロジックを調整し、
|
|
|
|
|
|
- `box_name != "Main"` の関数定義をインスタンスメソッドとして扱って `signature.params` に「暗黙 `me` + 明示パラメータ」を載せる。
|
|
|
|
|
|
- `func_var_map` に `me` → `func.params[0]` を事前バインドし、残りのパラメータ名を `params[1..]` に対応づける。
|
|
|
|
|
|
- これにより、`Stage1UsingResolverFull._build_module_map()` のように JSON では `params: []` でも Hako 側で `me._push_module_entry(...)` を使う関数について、
|
|
|
|
|
|
Rust VM 実行時に `me` が未定義(ValueId(0))になるケースを構造的に防止。
|
2025-11-19 08:35:56 +09:00
|
|
|
|
|
|
|
|
|
|
**LoopForm v2(continue + header PHI)**
|
|
|
|
|
|
- `src/mir/phi_core/loopform_builder.rs::LoopFormBuilder::seal_phis`
|
|
|
|
|
|
- シグネチャを `seal_phis(ops, latch_id)` → `seal_phis(ops, latch_id, &continue_snapshots)` に拡張。
|
|
|
|
|
|
- preheader と latch に加え、`LoopBuilder` 側で記録している **`continue_snapshots` からの値も header PHI の入力** として統合。
|
|
|
|
|
|
- pinned / carrier いずれも、header の全 predecessor:
|
|
|
|
|
|
- `(preheader, preheader_copy)`
|
|
|
|
|
|
- `(continue_bb, value_at_continue)`
|
|
|
|
|
|
- `(latch, value_at_latch)`
|
|
|
|
|
|
を入力として持つようになり、balanced scan など「continue を含むループ」の SSA が正しく構成される。
|
|
|
|
|
|
- `src/mir/loop_builder.rs::build_loop_with_loopform`
|
|
|
|
|
|
- `let continue_snaps = self.continue_snapshots.clone();`
|
|
|
|
|
|
- `loopform.seal_phis(self, actual_latch_id, &continue_snaps)?;`
|
|
|
|
|
|
- という形で、LoopBuilder → LoopForm 側に `continue` スナップショットを橋渡し。
|
|
|
|
|
|
|
|
|
|
|
|
**ControlForm / LoopShape invariant**
|
|
|
|
|
|
- `src/mir/control_form.rs::LoopShape::debug_validate`(debug ビルドのみ)
|
|
|
|
|
|
- 既存の:
|
|
|
|
|
|
- `preheader -> header` エッジ必須
|
|
|
|
|
|
- `latch -> header` バックエッジ必須
|
|
|
|
|
|
- に加えて、次の invariant を追加:
|
|
|
|
|
|
- `continue_targets` の各ブロックから `header` へのエッジが存在すること。
|
|
|
|
|
|
- `break_targets` の各ブロックから `exit` へのエッジが存在すること。
|
|
|
|
|
|
- これにより、LoopForm / LoopBuilder が `continue` / `break` 経路を誤配線した場合に、構造レベルで早期検知できる。
|
|
|
|
|
|
|
|
|
|
|
|
**テスト / 検証**
|
|
|
|
|
|
- MIR ユニットテスト:
|
|
|
|
|
|
- `src/mir/phi_core/loopform_builder.rs::tests::test_seal_phis_includes_continue_snapshots`
|
|
|
|
|
|
- LoopFormBuilder 単体で「preheader + continue + latch」が PHI 入力に含まれることを固定。
|
|
|
|
|
|
- `src/tests/mir_stageb_loop_break_continue_verifies`
|
|
|
|
|
|
- Stage‑B 風の `loop + break/continue` パターンで MirVerifier 緑。
|
|
|
|
|
|
- `src/tests/mir_stage1_using_resolver_verify.rs::mir_stage1_using_resolver_full_collect_entries_verifies`
|
2025-11-19 08:56:44 +09:00
|
|
|
|
- LoopForm v2/PHI v2 経路(現在は既定実装)で Stage‑1 UsingResolver フル版が MirVerifier 緑。
|
2025-11-19 08:35:56 +09:00
|
|
|
|
- 実行観測:
|
|
|
|
|
|
- 開発用 Hako `loop_continue_fixed.hako`:
|
|
|
|
|
|
- 期待 `RC=3` / 実測 `RC=3`、PHI pred mismatch なし。
|
|
|
|
|
|
- Stage‑B balanced scan:
|
|
|
|
|
|
- `StageBBodyExtractorBox` のバランススキャンループに trace を入れて 228 回イテレーションが回ること、
|
|
|
|
|
|
`ch == "{"` ブランチで `depth` / `i` を更新 → `continue` → 次イテレーションに **確実に戻っている** ことを確認。
|
2025-11-10 19:42:42 +09:00
|
|
|
|
|
2025-11-11 02:07:12 +09:00
|
|
|
|
---
|
|
|
|
|
|
|
2025-11-19 08:35:56 +09:00
|
|
|
|
### 1-2. Phase 25.1k — LoopSSA v2 (.hako) & Stage‑B harness 追従(Rust 側はおおむね完了)
|
2025-11-11 02:07:12 +09:00
|
|
|
|
|
2025-11-19 08:35:56 +09:00
|
|
|
|
**目的**
|
|
|
|
|
|
- Rust 側の LoopForm v2 / ControlForm / Conservative PHI を SSOT としつつ、Stage‑B / selfhost で使っている `.hako` 側 LoopSSA/BreakFinderBox/PhiInjectorBox をその規約に追従させる準備フェーズ。
|
2025-11-10 19:42:42 +09:00
|
|
|
|
|
2025-11-19 08:35:56 +09:00
|
|
|
|
**Rust 側でやったこと(サマリ)**
|
|
|
|
|
|
- Receiver / pinning:
|
|
|
|
|
|
- `CallMaterializerBox::materialize_receiver_in_callee` を事実上 no-op にし、
|
|
|
|
|
|
receiver の pinning / LocalSSA 連携を `receiver::finalize_method_receiver` に一本化。
|
|
|
|
|
|
- `MirBuilder` に `pin_slot_names: HashMap<ValueId, String>` を持たせ、
|
|
|
|
|
|
`LocalSSA.ensure` が「同じ slot にぶらさがる最新の ValueId」へ自動でリダイレクトできるようにした。
|
|
|
|
|
|
- Compiler Box の分類:
|
|
|
|
|
|
- `CalleeResolverBox::classify_box_kind` に `BreakFinderBox` / `PhiInjectorBox` / `LoopSSA` を追加し、
|
|
|
|
|
|
Stage‑1/Stage‑B 用 LoopSSA 箱を `CalleeBoxKind::StaticCompiler` として明示。
|
2025-11-10 19:42:42 +09:00
|
|
|
|
|
2025-11-19 08:35:56 +09:00
|
|
|
|
**.hako 側の今後(25.1k 後半)**
|
|
|
|
|
|
- `LoopSSA.stabilize_merges(json)` を Rust LoopForm v2 の Carrier/Pinned 規約に合わせて実装する(現在はほぼ stub)。
|
|
|
|
|
|
- Stage‑B Test2(`tools/test_stageb_min.sh`)で得られる Program(JSON v0) に対し、
|
|
|
|
|
|
- Rust 側で `NYASH_VM_VERIFY_MIR=1` を立てた実行結果と、
|
|
|
|
|
|
- `.hako` 側 LoopSSA v2 適用後の JSON → Rust 実行結果
|
|
|
|
|
|
を比較し、BreakFinderBox / PhiInjectorBox / LoopSSA の責務を切り分けていく。
|
2025-11-06 15:41:52 +09:00
|
|
|
|
|
|
|
|
|
|
---
|
|
|
|
|
|
|
2025-11-19 08:35:56 +09:00
|
|
|
|
### 1-3. Phase 25.1e/f/g — LoopForm PHI v2 / ControlForm 統合(サマリ)
|
2025-11-04 20:46:43 +09:00
|
|
|
|
|
2025-11-19 08:35:56 +09:00
|
|
|
|
- 25.1e(LoopForm PHI v2 migration):
|
|
|
|
|
|
- Local SSA(`local a = ...`)の ValueId 分離を完了し、LoopForm v2 を「PHI/SSA の正」とする方向へ寄せた。
|
|
|
|
|
|
- Stage‑1 UsingResolver / 基本的な Stage‑B ループは、LoopForm v2 経路で MirVerifier 緑。
|
|
|
|
|
|
- 25.1f(ControlForm 層の導入):
|
|
|
|
|
|
- `ControlForm` / `LoopShape` / `IfShape` を導入し、Loop / If を共通ビューとして扱う箱を定義。
|
|
|
|
|
|
- ここでは挙動を変えず、「構造だけを先に固定」する方針で設計を固めた。
|
|
|
|
|
|
- 25.1g(Conservative PHI ↔ ControlForm ブリッジ):
|
|
|
|
|
|
- `phi_core::loopform_builder::build_exit_phis_for_control` など、ControlForm から Conservative PHI を呼び出す薄いラッパを追加。
|
|
|
|
|
|
- 既存の PHI ロジックはそのままに、将来の置き換えポイントだけを明示している。
|
2025-11-04 20:46:43 +09:00
|
|
|
|
|
2025-11-19 08:35:56 +09:00
|
|
|
|
---
|
2025-11-03 23:21:48 +09:00
|
|
|
|
|
2025-11-19 08:35:56 +09:00
|
|
|
|
## 2. まだ残っている問題・課題(2025-11-18 時点)
|
2025-11-03 23:21:48 +09:00
|
|
|
|
|
2025-11-19 08:35:56 +09:00
|
|
|
|
### 2-1. Stage‑B 本体の型エラー(`String > Integer(13)`)
|
2025-11-03 23:21:48 +09:00
|
|
|
|
|
2025-11-19 08:35:56 +09:00
|
|
|
|
- 症状:
|
|
|
|
|
|
- Stage‑B の `Main.main` 実行時に、
|
|
|
|
|
|
`Type error: unsupported compare Gt on String(...) and Integer(13)` が発生。
|
|
|
|
|
|
- LoopForm v2 / PHI / continue 修正とは **独立の Stage‑B 固有のロジック問題**。
|
|
|
|
|
|
- 想定される原因:
|
|
|
|
|
|
- Stage‑B 側の body 構築 / JSON 生成で、本来数値比較にすべき箇所で「生の文字列」と整数を比較している。
|
|
|
|
|
|
- もしくは、Parser/Scanner が `len` やインデックスを文字列のまま扱っている部分がある。
|
|
|
|
|
|
- 対応方針(次フェーズ向けメモ):
|
|
|
|
|
|
- `StageBBodyExtractorBox.build_body_src` が吐く `body_src` を最小ケースで抽出し、
|
|
|
|
|
|
その中から問題の比較式(`>`)がどのように生成されているかを特定する。
|
|
|
|
|
|
- Stage‑B の box レベルで:
|
|
|
|
|
|
- 「どのフェーズで型を決めるか」(例: ParserBox / Stage‑B / VM 手前)を決めてから修正する。
|
|
|
|
|
|
- このタスクは 25.1c 続き or 新フェーズ(25.1n 相当)として、Stage‑B 箱の設計側で扱う。
|
2025-11-03 23:21:48 +09:00
|
|
|
|
|
2025-11-19 08:35:56 +09:00
|
|
|
|
---
|
2025-11-03 23:21:48 +09:00
|
|
|
|
|
2025-11-19 08:35:56 +09:00
|
|
|
|
### 2-2. Stage‑B 再入ガード `env.set/2` の扱い
|
2025-11-03 23:21:48 +09:00
|
|
|
|
|
2025-11-19 08:35:56 +09:00
|
|
|
|
- 現状:
|
|
|
|
|
|
- 一部 Stage‑B コードが `env.set/2` を使った再入ガードに依存しており、
|
|
|
|
|
|
Rust VM 側には `env.set/2` extern が定義されていないため、
|
|
|
|
|
|
`❌ VM error: Invalid instruction: extern function: Unknown: env.set/2` が発生するケースがある。
|
|
|
|
|
|
- 方針メモ:
|
|
|
|
|
|
- 選択肢 A: Stage‑B 再入ガードを Box 内 state(フィールド)に寄せて、`env.set/2` 依存をなくす。
|
|
|
|
|
|
- 選択肢 B: Stage‑B ハーネス専用に、最小限の `env.set/2` extern を Rust 側に実装する(本番経路では使わない)。
|
|
|
|
|
|
- 25.1m では構造修正(Loop/PHI/receiver)を優先し、この extern の話は据え置き。
|
2025-11-03 23:21:48 +09:00
|
|
|
|
|
2025-11-19 08:35:56 +09:00
|
|
|
|
---
|
2025-11-03 23:21:48 +09:00
|
|
|
|
|
2025-11-19 08:35:56 +09:00
|
|
|
|
### 2-3. .hako 側 LoopSSA v2(Rust LoopForm v2 との乖離)
|
|
|
|
|
|
|
|
|
|
|
|
- 現状:
|
|
|
|
|
|
- `lang/src/compiler/builder/ssa/loopssa.hako` の `stabilize_merges()` はまだ実質的に stub に近い。
|
|
|
|
|
|
- Stage‑B Test2(`compiler_stageb.hako` 経由)では、Rust MIR 側で LoopForm v2 / PHI v2 が安定した後も、
|
|
|
|
|
|
`.hako` 側 LoopSSA 経由の JSON から生成した MIR で PHI/SSA 問題が残る可能性がある。
|
|
|
|
|
|
- 目標:
|
|
|
|
|
|
- Rust LoopForm v2 を「制御構造と PHI の SSOT」とみなし、
|
|
|
|
|
|
`.hako` 側 LoopSSA が同じ Carrier/Pinned / preheader/header/exit の規約を JSON レベルで再現する。
|
|
|
|
|
|
- やること(フェーズ 25.1k 後半〜 25.1f/g 連携):
|
|
|
|
|
|
- 特定の関数(例: `BreakFinderBox._find_loops/2`)を対象に、Rust 側 / .hako 側のそれぞれで生成されるループ構造を比較。
|
|
|
|
|
|
- LoopSSA v2 の中に:
|
|
|
|
|
|
- Carrier 変数の検出、
|
|
|
|
|
|
- pinned 変数の扱い、
|
|
|
|
|
|
- exit PHI の構築
|
|
|
|
|
|
を Rust LoopForm v2 に合わせて実装。
|
2025-11-03 23:21:48 +09:00
|
|
|
|
|
2025-11-19 08:35:56 +09:00
|
|
|
|
---
|
2025-11-04 16:33:04 +09:00
|
|
|
|
|
2025-11-19 08:35:56 +09:00
|
|
|
|
### 2-4. Builder / Selfhost まわりの残タスク(超ざっくり)
|
2025-11-04 16:33:04 +09:00
|
|
|
|
|
2025-11-19 08:35:56 +09:00
|
|
|
|
- Builder 内部ルート(20.43 系):
|
|
|
|
|
|
- `MirBuilderBox` 経由の internal ルートで、MIR を stdout 経由ではなく一時ファイル / FileBox に書き出し、
|
|
|
|
|
|
ハーネスがそこから読む形に揃える案が残タスク。
|
|
|
|
|
|
- Selfhost CLI / Stage1 CLI:
|
|
|
|
|
|
- Stage‑B / Stage‑1 CLI を「Rust VM / LLVM / PyVM / selfhost」の 4 経路で安定確認するラインは進行中。
|
|
|
|
|
|
- 25.1m では Rust VM + Stage‑B balanced scan を優先し、CLI 全体は次のフェーズで詰める。
|
2025-11-04 16:33:04 +09:00
|
|
|
|
|
2025-11-19 08:35:56 +09:00
|
|
|
|
---
|
2025-11-03 23:21:48 +09:00
|
|
|
|
|
2025-11-19 08:35:56 +09:00
|
|
|
|
## 3. 次にやること(候補タスク)
|
2025-11-04 16:33:04 +09:00
|
|
|
|
|
2025-11-19 08:35:56 +09:00
|
|
|
|
ここから先は「どのフェーズを進めるか」をそのときの優先度で選ぶ感じだよ。
|
2025-11-05 18:57:03 +09:00
|
|
|
|
|
2025-11-19 08:35:56 +09:00
|
|
|
|
1. **Stage‑B 型エラーの根治(Phase 25.1c か新フェーズ 25.1n)**
|
|
|
|
|
|
- `Main.main` 内の `String(...) > Integer(13)` 比較を最小ケースで再現。
|
|
|
|
|
|
- Stage‑B BodyExtractor / ParserBox / TestBox のどこで型が崩れているかを箱単位で切り分け。
|
2025-11-05 18:57:03 +09:00
|
|
|
|
|
2025-11-19 08:35:56 +09:00
|
|
|
|
2. **Stage‑B 再入ガード `env.set/2` の整理**
|
|
|
|
|
|
- 再入ガードを Box 内 state で持つ方向か、Rust 側に dev 専用 extern を追加するかを決める。
|
|
|
|
|
|
- どちらにしても「本番経路(prod ランナー)には影響しない」ようフラグでガードする。
|
2025-11-05 18:57:03 +09:00
|
|
|
|
|
2025-11-19 08:35:56 +09:00
|
|
|
|
3. **.hako LoopSSA v2 実装(LoopForm v2 への追従)**
|
|
|
|
|
|
- Rust LoopForm v2 の規約(Carrier/Pinned / preheader/header/latch/exit)を `.hako` の LoopSSA に輸入。
|
|
|
|
|
|
- Stage‑B Test2 / selfhost CLI の JSON→MIR 経路で MirVerifier 緑を目標にする。
|
2025-11-05 18:57:03 +09:00
|
|
|
|
|
2025-11-19 08:35:56 +09:00
|
|
|
|
4. **Selfhost / CLI 周辺のテスト整理**
|
|
|
|
|
|
- 代表的な selfhost / Stage‑B / Stage‑1 CLI ケースに対して、
|
|
|
|
|
|
「Phase 25.1m でどこまで緑になったか」「どこから先が 25.1k 以降の仕事か」を tests / tools 側で見える化する。
|
2025-11-05 18:57:03 +09:00
|
|
|
|
|
2025-11-19 08:35:56 +09:00
|
|
|
|
---
|
2025-11-05 18:57:03 +09:00
|
|
|
|
|
2025-11-19 08:35:56 +09:00
|
|
|
|
## 4. 履歴の見方メモ
|
2025-11-05 18:57:03 +09:00
|
|
|
|
|
2025-11-19 08:35:56 +09:00
|
|
|
|
- 以前の `CURRENT_TASK.md` は ~1900 行の長いログだったけど、読みやすさ重視でこのファイルはスナップショット形式にしたよ。
|
|
|
|
|
|
- 過去の詳細ログが必要になったら:
|
|
|
|
|
|
- `git log -p CURRENT_TASK.md`
|
|
|
|
|
|
- あるいは特定のコミット時点の `CURRENT_TASK.md` を `git show <commit>:CURRENT_TASK.md`
|
|
|
|
|
|
でいつでも復元できるよ。
|
2025-11-05 18:57:03 +09:00
|
|
|
|
|
|
|
|
|
|
---
|
2025-11-15 22:32:13 +09:00
|
|
|
|
|
2025-11-19 08:35:56 +09:00
|
|
|
|
以上が 2025-11-18 時点の Phase 21.8 / 25 / 25.1 / 25.2 ラインの「いまどこ」「なに済み」「なに残り」だよ。
|
|
|
|
|
|
次にどの箱から攻めるか決めたら、ここに箇条書きで足していこうね。
|