Files
hakorune/CURRENT_TASK.md

158 lines
12 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# Current Task — Phase 15 SelfHosting (20250917)
Summary
- Default execution is MIR13 (PHIoff). Bridge/Builder do not emit PHIs; llvmlite synthesizes PHIs when needed. MIR14 (PHIon) remains experimental for targeted tests.
- PyVM is the semantic reference engine; llvmlite is used for AOT and parity checks.
- GC: user modes defined; controller実装rc+cycle skeleton + metrics/diagnosticsに移行。LLVM safepoint輸出/NyRT配線と自動挿入envゲートONを完了。
What Changed (recent)
- MIR13 default enabled
- `mir_no_phi()` default set to true (can disable via `NYASH_MIR_NO_PHI=0`).
- Curated LLVM runner defaults to PHIoff; `--phi-on` enables MIR14 lane.
- Added doc: `docs/development/mir/MIR13_MODE.md`; README references it.
- JSON v0 Bridge lowering refactor + features
- Split helpers: `src/runner/json_v0_bridge/lowering/{if_else.rs, loop_.rs, try_catch.rs, merge.rs}`(既存)に加え、式系を `lowering/expr.rs` に分離(振る舞い不変)。
- 新規サポート: Ternary/Peek の Lowering を実装し、`expr.rs` から `ternary.rs`/`peek.rs` へ委譲MIR13 PHIoff=Copy合流PHIon=Phi 合流)。
- Selfhost 生成器Stage1 JSON v0に Peek emit を追加: `apps/selfhost-compiler/boxes/parser_box.nyash`
- Selfhost/PyVM スモークを通して E2E 確認peek/ternary
- llvmlite stability for MIR13bringup進行中
- Controlflow 分離: `instructions/controlflow/{branch,jump,while_.py}` を導入し、`llvm_builder.py` の責務を縮小。
- プリパス(環境変数で有効化): `NYASH_LLVM_PREPASS_LOOP=1`, `NYASH_LLVM_PREPASS_IFMERGE=1`
- ループ検出(単純 while 形)→ 構造化 lowerLoopForm失敗時は regular while
- ifmergeretmerge前処理: ret 値 PHI の前宣言と finalize 配線の一意化
- CFG ユーティリティ: `src/llvm_py/cfg/utils.py`preds/succs
- PHI 配線の分離: `src/llvm_py/phi_wiring.py` に placeholder/finalize を移管builder 薄化)
- 値解決ポリシー共通化: `src/llvm_py/utils/values.py`prefer sameblock SSA → resolver
- vmap の perblock 化: `vmap_cur` を用意し、ブロック末に `block_end_values` へスナップショット。crossblock 汚染を抑制。
- Resolver 強化: endofblock 解決で他ブロック PHI を安易に採用しない(自己参照/非支配を回避)。
- BuildCtx 導入: `src/llvm_py/build_ctx.py` で lowering 引数を集約compare/ret/call/boxcall/externcall/typeop/newbox/safepoint が ctx 対応)
- トレース統一: `src/llvm_py/trace.py` を追加し、`NYASH_CLI_VERBOSE`/`NYASH_LLVM_TRACE_PHI`/`NYASH_LLVM_TRACE_VALUES` を一元管理
- curated スモーク拡張: `tools/smokes/curated_llvm.sh --with-if-merge` を追加ifmerge ケース含む)
- Parity runner pragmatics
- `tools/pyvm_vs_llvmlite.sh` compares exit code by default; use `CMP_STRICT=1` for stdout+exit.
- Stage2 smokes更新: `tools/selfhost_stage2_smoke.sh` に "Peek basic" を追加。
- GC controller/metricsPhase15
- `GcController`統合フック導入CLI `--gc``NYASH_GC_MODE`。CountingGcは互換ラッパに縮退。
- NyRT exports: `ny_safepoint` / `ny_check_safepoint` / `nyash.gc.barrier_write` → runtime hooks 連携。
- LLVM自動 safepoint 挿入loop header / call / externcall / boxcall`NYASH_LLVM_AUTO_SAFEPOINT` で制御(既定=1
- メトリクスtext/JSON`NYASH_GC_METRICS{,_JSON}=1`。JSONに alloc_count/alloc_bytes/trial_nodes/edges/collections/last_ms/reason_bits/thresholds を含む。
- 診断:`NYASH_GC_LEAK_DIAG=1` でハンドルTopK残存出力。Array/Map 到達集合の試走gc_trace
- CI/DevOpsSelfHosting パイロット強化)
- 追加: `.github/workflows/selfhost-bootstrap.yml`(常時) — `tools/bootstrap_selfhost_smoke.sh` を40s timeoutで実行。
- 追加: `.github/workflows/selfhost-exe-first.yml`(任意/cron — LLVM18 + llvmlite をセットアップし `tools/exe_first_smoke.sh` を実行。
- スモーク堅牢化: `tools/bootstrap_selfhost_smoke.sh`/`tools/exe_first_smoke.sh` に timeout を付与。
- JSON v0 スキーマ追加: `docs/reference/mir/json_v0.schema.json` と検証ツール `tools/validate_mir_json.py`。EXEfirst スモークに組み込み。
- LLVM crate 分離の足場Phase15.6 向け)
- 新規クレート(スキャフォールド): `crates/nyash-llvm-compiler`CLI名: `ny-llvmc`)。
- `--dummy --out <o>` でダミー `.o` を生成。
- `--in <mir.json|-> --out <o>` で MIR(JSON)→`.o` を llvmlite ハーネス経由で生成(`tools/llvmlite_harness.py`)。
- ドキュメント追記: `docs/LLVM_HARNESS.md``ny-llvmc` とスキーマ検証の項を追加。
- Nyash ABI v2TypeBox検出の足場
- ローダに `nyash_typebox_<Box>` シンボル検出を追加(`abi_tag='TYBX'`/`version`/`invoke_id`し、Boxスペックへ保持まだ実行には未使用
Current Status
- Selfhosting Bridge → PyVM smokes: PASSStage2 代表: array/string/logic/if/loop/ternary/peek/dot-chain
- PyVM core fixes applied: compare(None,x) の安全化、Copy 命令サポート、最大ステップ上限NYASH_PYVM_MAX_STEPS
- MIR13PHIoff: if/ternary/loop の合流で Copy が正しく JSON に出るよう修正emit_mir_json + builder nophi 合流)
- Curated LLVMPHIoff 既定): 継続(個別ケースの IR 生成不備は未着手)
LLVM ハーネスllvmlite/AOT:
- `loop_if_phi`: プリパスON構造化whileで EXE 退出コード 0
- `ternary_nested`: ifmerge プリパスphi_wiring で retmerge を構造化し、退出コード一致(緑)。
Next (short plan)
0) Refactor/Structure継続
- BuildCtx 展開を完了barrier/atomic/loopform も ctx 主経路に)
- trace 化の残り掃除(環境直読み print を削減)
- phi_wiring を関数分割(解析/配線/タグ付け)→ ユニットテスト追加
1) Legacy Interpreter/VM offboarding (phaseA):
- ✅ Introduced `vm-legacy` feature (default OFF) to gate old VM execution層。
- ✅ 抽出: JIT が参照する最小型(例: `VMValue`)を薄い共通モジュールへ切替(`vm_types`)。
-`interpreter-legacy`/`vm-legacy` を既定ビルドから外し、既定は PyVM 経路に(`--backend vm` は PyVM へフォールバック)。
- ✅ Runner: vm-legacy OFF のとき `vm`/`interpreter` は PyVM モードで実行。
- ✅ HostAPI: VM 依存の GC バリアは vm-legacy ON 時のみ有効。
- ✅ PyVM/Bridge Stage2 スモークを緑に再整備(短絡/三項/合流 反映)
2) Legacy Interpreter/VM offboarding (phaseB):
- 物理移動: `src/archive/{interpreter_legacy,vm_legacy}/` へ移設(ドキュメント更新)。
3) LLVM/llvmlite 整備(優先中):
- MIR13 の Copy 合流を LLVM IR に等価反映predlocalize or PHI 合成): perblock vmap 完了、resolver/phi_wiring 強化済。
- 代表ケース:
- `apps/tests/loop_if_phi.nyash`: プリパスONで緑退出コード一致
- `apps/tests/ternary_nested.nyash`: ifmerge + phi_wiring で退出コード一致を継続。
- `tools/pyvm_vs_llvmlite.sh` で PyVM と EXE の退出コード一致(必要に応じて CMP_STRICT=1
4) PHIon lane任意: `loop_if_phi` 支配関係を finalize/resolve の順序強化で観察(低優先)。
5) Runner refactor小PR:
- `selfhost/{child.rs,json.rs}` 分離; `modes/common/{io,resolve,exec}.rs` 分割; `runner/mod.rs`の表面削減。
6) Optimizer/Verifier thinhub cleanup非機能: orchestrator最小化とパス境界の明確化。
7) GCcontroller観測の磨き込み
- JSON: running averages / roots要約任意 / 理由タグ拡張
- 収集頻度のサンプリング支援
- plugin/FFI は非移動のまま、ハンドル間接を継続
8) LLVM crate splitEXEfirst
- LLVM harness/builder を `nyash-llvm-compiler` crate と CLI`ny-llvmc`)に分離(入力: MIR JSON v0 / 出力: .o/.exe
- `tools/build_llvm.sh` 内部を新crate APIに寄せ、Runnerからも呼べるよう段階移行
- CI: selfhost smokes と LLVM EXE smokes を分離しアーティファクト配布線を評価
9) Nyash ABI v2 統一(後方互換なし)
- 方針: 既存 TypeC ABIlibrarylevel `nyash_plugin_invoke`を撤退し、Box単位の TypeBox へ一本化。
- ローダ: `nyash_typebox_<Box>``invoke_id(instance_id, method_id, ...)` を実行ポインタとして保持し、birth/fini も含めて統一。
- プラグイン: 公式プラグインString/File/Array/Map/Console/Integerを順次 v2 へ移行。`resolve(name)->method_id` 実装。
- 仕様: エラー規約OK/E_SHORT/E_ARGS/E_TYPE/E_METHOD/E_HANDLE/E_PLUGIN・TLVタグ一覧を docs に凍結、Cヘッダ雛形`nyash_abi.h`)を配布。
- CI: v2専用スモークを常時化Linux。Windows/macOS は任意ジョブで追随。
How to Run
- PyVM reference smokes: `tools/pyvm_stage2_smoke.sh`
- Bridge → PyVM smokes: `tools/selfhost_stage2_bridge_smoke.sh`
- LLVM curated (PHIoff default): `tools/smokes/curated_llvm.sh`
- LLVM PHIon (experimental): `tools/smokes/curated_llvm.sh --phi-on`
- LLVM curated with ifmerge prepass: `tools/smokes/curated_llvm.sh --with-if-merge`
- Parity (AOT vs PyVM): `tools/pyvm_vs_llvmlite.sh <file.nyash>` (`CMP_STRICT=1` to enable stdout check)
- 開発時の補助: `NYASH_LLVM_PREPASS_LOOP=1` を併用loop/ifmerge のプリパス有効化)。
- GC modes/metrics: see `docs/reference/runtime/gc.md``--gc` / 自動 safepoint / 収集トリガ / JSONメトリクス
SelfHosting CI
- Bootstrap常時: `.github/workflows/selfhost-bootstrap.yml`
- EXEfirst任意: `.github/workflows/selfhost-exe-first.yml`
LLVM Crate試用
- ダミー: `cargo build -p nyash-llvm-compiler --release && ./target/release/ny-llvmc --dummy --out /tmp/dummy.o`
- JSON→.o: `./target/release/ny-llvmc --in mir.json --out out.o`
Operational Notes
- 環境変数
- `NYASH_PYVM_MAX_STEPS`: PyVM の最大命令ステップ(既定 200000。ループ暴走時に安全終了。
- `NYASH_VM_USE_PY=1`: `--backend vm` を PyVM ハーネスへ切替。
- `NYASH_PIPE_USE_PYVM=1`: `--ny-parser-pipe` / JSON v0 ブリッジも PyVM 実行に切替。
- `NYASH_CLI_VERBOSE=1`: ブリッジ/エミットの詳細出力。
- スモークの実行例
- `timeout -s KILL 20s bash tools/pyvm_stage2_smoke.sh`
- `timeout -s KILL 30s bash tools/selfhost_stage2_bridge_smoke.sh`
Backend selection (PhaseA after vmlegacy off)
- Default: `vm-legacy` = OFF, `interpreter-legacy` = OFF
- `--backend vm` → PyVM 実行python3 と `tools/pyvm_runner.py` が必要)
- `--backend interpreter` → legacy 警告の上で PyVM 実行
- `--benchmark` → vmlegacy が必要(`cargo build --features vm-legacy`
Enable legacy VM/Interpreter (optin)
- `cargo build --features vm-legacy,interpreter-legacy`
- その後 `--backend vm`/`--backend interpreter` が有効
Key Flags
- `NYASH_MIR_NO_PHI` (default 1): PHIoff when 1 (MIR13). Set `0` for PHIon.
- `NYASH_VERIFY_ALLOW_NO_PHI` (default 1): relax verifier for PHIless MIR.
- `NYASH_LLVM_USE_HARNESS=1`: route AOT through llvmlite harness.
- `NYASH_LLVM_TRACE_PHI=1`: trace PHI resolution/wiring.
- `NYASH_LLVM_PREPASS_LOOP=1`: enable loop prepass (while detection/structure)
- `NYASH_LLVM_PREPASS_IFMERGE=1`: enable ifmerge (retmerge) prepass
- `NYASH_LLVM_TRACE_VALUES=1`: trace value resolution path
Notes / Policies
- Focus is selfhosting stability. JIT/Cranelift is out of scope (safety fixes only).
- PHI generation remains centralized in llvmlite; Bridge/Builder keep PHIoff by default.
- No full tracing/moving GC yet; handles/Arc lifetimes govern object retention. Safepoint/barrier/roots are staging utilities.
- GC mode UX: keep userfacing modes minimal (rc+cycle, minorgen); advanced modes are optin for language dev.
- Legacy Interpreter/VM は段階的にアーカイブへ。日常の意味論確認は PyVM を基準として継続。