Files
hakorune/CURRENT_TASK.md

12 KiB
Raw Blame History

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.pypreds/succs
    • PHI 配線の分離: src/llvm_py/phi_wiring.py に placeholder/finalize を移管builder 薄化)
    • 値解決ポリシー共通化: src/llvm_py/utils/values.pyprefer 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 --gcNYASH_GC_MODE。CountingGcは互換ラッパに縮退。
    • NyRT exports: ny_safepoint / ny_check_safepoint / nyash.gc.barrier_write → runtime hooks 連携。
    • LLVM自動 safepoint 挿入loop header / call / externcall / boxcallNYASH_LLVM_AUTO_SAFEPOINT で制御(既定=1
    • メトリクスtext/JSONNYASH_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-compilerCLI名: ny-llvmc)。
      • --dummy --out <o> でダミー .o を生成。
      • --in <mir.json|-> --out <o> で MIR(JSON)→.o を llvmlite ハーネス経由で生成(tools/llvmlite_harness.py)。
    • ドキュメント追記: docs/LLVM_HARNESS.mdny-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 と CLIny-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 を基準として継続。