Files
hakorune/docs/development/roadmap/phases/phase-15.7/README.md

132 lines
8.4 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.

# Phase 15.7: Known化Rewrite統合dev観測と MiniVM 安定化dev限定
目的
- Builderでの Known 化と Instance→Function の統一Known 経路を優先し、実行系VM/LLVM/Nyを単純化する。
- 早期観測resolve.try/choose, ssa.phiを devonly で整備し、Union の発生点を特定可能にする。
- 表示APIを `str()` に統一(互換: `stringify()`)し、言語表面のブレを解消する(挙動不変)。
- MiniVMNyを安全に安定化M2/M3代表ケース。NYABI Kernel は“下地のみ”既定OFF
背景
- Instance→Function 正規化の方針は既定ON。Known 経路は関数化し、VM側は単純化する。
- resolve.try/chooseBuilderと ssa.phiBuilderの観測は devonly で導入済み既定OFF
- MiniVM は M2/M3 の代表ケースを安定化(パス/境界厳密化)。
- VM Kernel の Ny 化は後段観測・ポリシーから段階導入、既定OFF
Unified Call開発既定ON
- 呼び出しの統一判定は、環境変数 `NYASH_MIR_UNIFIED_CALL``0|false|off` でない限り有効既定ON
- メソッド解決/関数化を `emit_unified_call` に集約し、以下の順序で決定:
1) 早期 toString/stringify→str
2) equals/1Known 優先→一意候補; ユーザーBox限定
3) Known→関数化`obj.m → Class.m(me,…)`)/一意候補フォールバック(決定性確保)
- レガシー側の関数化は dev ガードで抑止可能: `NYASH_DEV_DISABLE_LEGACY_METHOD_REWRITE=1`(移行期間の重複回避)
スコープ(やること)
1) Builder: Known 化 + Rewrite 統合Stage1
- P0: me 注入・Known 化origin 付与/維持)— 軽量PHI補強単一/一致時)
- P1: Known 経路 100% 関数化obj.m → Class.m(me,…)。special は `toString→str互換:stringify/equals` を統合
- 観測: resolve.try/choose / ssa.phi を devonly で JSONL 出力既定OFF`resolve.choose``certainty` を付加し、KPIKnown率を任意出力`NYASH_DEBUG_KPI_KNOWN=1`, `NYASH_DEBUG_SAMPLE_EVERY=N`)。
2) 表示APIの統一挙動不変
- 規範: `str()` / `x.str()`(同義)。`toString()` は早期に `str()` へ正規化
- 互換: `stringify()` は当面エイリアスとして許容
- QuickRef/ガイドの更新plus混在の誘導も `str()` に統一)
3) MiniVMMirVmMin安定化devのみ
- 厳密セグメントによる単一パス化、M2/M3 代表スモーク常緑const/binop/compare/branch/jump/ret
- パリティ: VM↔LLVM↔Ny のミニ・パリティ 2〜3件
4) NYABIVM Kernel Bridge下地未配線・既定OFF
- docs/abi/vm-kernel.md関数: caps()/policy.*()/resolve_method_batch()
- スケルトン: apps/selfhost/vm/boxes/vm_kernel_box.hakopolicy スタブ)
- 既定OFFトグル予約: NYASH_VM_NY_KERNEL, *_TIMEOUT_MS, *_TRACE
非スコープ(やらない)
- 既定挙動の変更Rust VM/LLVMが主軸のまま
- PHI/SSAの一般化Phase 16 で扱う)
- VM Kernel の本配線(観測・ポリシーは devonly/未配線)
リスクと軽減策
- 性能: 境界越えは後Phaseに限る本Phaseは未配線。MiniVMは開発補助で性能要件なし。
- 複雑性: 設計は最小APIに限定。拡張は追加のみ後方互換維持
- 安全: すべて既定OFF。FailFast方針。再入禁止/タイムアウトを仕様に明記。
受け入れ条件Acceptance
- quick: MiniVMM2/M3代表スモーク緑const/binop/compare/branch/jump/ret
- integration: 代表パリティ緑llvmlite/ハーネス)
- Builder: resolve.try/choose と ssa.phi が devonly で取得可能NYASH_DEBUG_*
- 表示API: QuickRef/ガイドが `str()` に統一(実行挙動は従前と同じ)
- Unified Call は開発既定ONだが、`NYASH_MIR_UNIFIED_CALL=0|false|off` で即時オプトアウト可能(段階移行)。
実装タスク(小粒)
1. origin/observe/rewrite の分割方針を CURRENT_TASK に反映(ガイド/README付き
2. Known fastpath の一本化rewrite::try_known_rewrite special の集約
3. 表示APIの統一toString→str、互換:stringify— VM ルータ特例の整合・ドキュメント更新
4. MirVmMin: 単一パス化・境界厳密化M2/M3・代表スモーク緑
5. docs/abi/vm-kernel.md下書き維持・スケルトン Box未配線
トグル/ENV予約、既定OFF
- NYASH_VM_NY_KERNEL=0|1
- NYASH_VM_NY_KERNEL_TIMEOUT_MS=200
- NYASH_VM_NY_KERNEL_TRACE=0|1
ロールバック方針
- MiniVMの変更は apps/selfhost/ 配下に限定(本線コードは未配線)。
- NYABIは docs/ と スケルトンBoxのみ実行経路から未参照
- Unified Call は env で即時OFF可能。問題時は `NYASH_MIR_UNIFIED_CALL=0` を宣言してレガシーへ退避し、修正後に既定へ復帰。
補足(レイヤー・ガード)
- builder 層は origin→observe→rewrite の一方向依存を維持する。違反検出スクリプト: `tools/dev/check_builder_layers.sh`
関連(参照)
- Phase 15セルフホスティング: ../phase-15/README.md
- Phase 15.5(基盤整理): ../phase-15.5/README.md
- Known/Rewrite 観測: src/mir/builder/{method_call_handlers.rs,builder_calls.rs}, src/debug/hub.rs
- QuickRef表示API: docs/reference/language/quick-reference.md
- MiniVM: apps/selfhost/vm/boxes/mir_vm_min.hako
- スモーク: tools/smokes/v2/profiles/quick/core/
更新履歴
- 20250928 v2本書: Known 化Rewrite 統合dev観測、表示API `str()` 統一、MiniVM 安定化へ焦点を再定義
- 20250928 初版: MiniVM M3 + NYABI下地の計画
## ステータス20250928 仕上げメモ)
- M3compare/branch/jump: MiniVMMirVmMinが厳密セグメントの単一パスで動作。代表 JSON 断片で compare(Eq)→ret、branch、jump を評価。
- 統合スモーク: integration プロファイルLLVM/llvmliteは PASS 17/17全緑
- ルータ/順序ガード(仕様不変):
- Router: 受信者クラスが Unknown のメソッド呼び出しは常にレガシー BoxCall にフォールバック安定性優先・常時ON
- BlockSchedule: φ→Copy(materialize)→本体(Call) の順序を devonly で検証(`NYASH_BLOCK_SCHEDULE_VERIFY=1`)。
- LocalSSA: 受信者・引数・条件・フィールド基底を emit 直前で「現在のブロック内」に必ず定義。
- VM 寛容フラグの方針:
- `NYASH_VM_TOLERATE_VOID`: dev 時の救済専用quick テストからは除去)。
- Router の Unknown→BoxCall は常時ON仕様不変・安定化目的
## 次のTODO短期
- json_query_vmVM: LocalSSA/順序の取りこぼしを補強し、SKIP を解除。
- ループ PHI 搬送: ループ header/合流での搬送を最小補強し、break/continue/loop_statement の SKIP を解除。
- MiniVM M2/M3: 単一パス化の仕上げ境界厳密化の再確認後、代表4件m2_eq_true/false, m3_branch_true, m3_jumpを PASS → SKIP 解除。
## Builder 小箱Box 化)方針(仕様不変・段階導入)
- S-tier導入:
- MetadataPropagationBox型/起源伝播): `metadata/propagate.rs`
- ConstantEmissionBoxConst発行: `emission/constant.rs`
- TypeAnnotationBox最小型注釈: `types/annotation.rs`
- RouterPolicyBoxUnified vs BoxCall ルート): `router/policy.rs`
- EmitGuardBoxemit直前の最終関所: `emit_guard/mod.rs`
- NameConstBox関数名Const生成: `name_const.rs`
- A/B-tier計画:
- Compare/BranchEmissionBox、PhiWiringBox、EffectMask/TypeInferenceBoxPhase16以降
採用順(小さく安全に)
1) Const → metadata → 最小注釈の順に薄く差し替え(代表箇所→全体)
2) RouterPolicyBox を統一Call経路に導入utils側は後段で移行
3) EmitGuardBox で Call 周辺の finalize/verify を集約Branch/Compare は後段)
4) NameConstBox を rewrite/special/known に段階適用
ドキュメント
- 詳細は `docs/development/builder/BOXES.md` を参照。
## Unskip Plan段階復帰
- P0: json_query_vm → 期待出力一致、寛容フラグ不要。
- P1: loopsbreak/continue/loop_statement→ PHI 搬送安定。
- P2: MiniVMM2/M3→ 代表4件 PASS、coarse 撤去・単一パス維持。