# Phase 15.7: セルフホスティング実現への道筋 - Hakoruneコンパイラ完成計画 Branch Note (selfhost) - このブランチでは CLI バイナリ名は `hako` だよ。本文中の `hakorune`/`nyash` は `hako` に読み替えて実行してね。 - 環境変数は `HAKO_*`/`HAKU_*`/`HRN_*` は `NYASH_*` と相互エイリアス(自動マップ)なので、そのまま使ってOK。 ## 🎯 **Phase 15.7の真の目的** **「Hakorune で Hakorune をコンパイルする」完全なセルフホスティングの実現** ### 🎯 First Goal(Milestone M1 — Bootstrap) - 目的: 「Hakorune コンパイラー(apps/selfhost-compiler/compiler.hako)を Hakorune でビルドし、LLVMで実行ファイル化」 - 成果物: 自己ホスト版コンパイラー実行ファイル(例: /tmp/hako_selfhost_compiler) - 受け入れ基準(Acceptances) - A1: `tools/build_llvm.sh apps/selfhost-compiler/compiler.hako -o /tmp/hako_selfhost_compiler` が 0 終了 - A2: `/tmp/hako_selfhost_compiler -- --min-json` の標準出力先頭行が非空 JSON ヘッダ(`{"version": …, "kind": …}` を含む) - A3(任意): 生成 EXE で小サンプルを解析→Rust VM での実行結果と等価(quick スモークで 1 本確認) - スモーク: `tools/smokes/v2/profiles/quick/selfhost/selfhost_bootstrap_llvm.sh`(既定 SKIP、`SMOKES_ENABLE_SELFHOST_BOOT=1` で有効) ### 🎯 Milestone M2 — Self‑Rebuild - 目的: 生成した自己ホストコンパイラ EXE で compiler.hako を解析し、Stage‑1 JSON を出力できること - 受け入れ: EXE の標準出力1行目が `"kind":"Program"` を含む - スモーク: `tools/smokes/v2/profiles/quick/selfhost/selfhost_rebuild_vm.sh`(LLVM未導入時は自動SKIP) ### 🎯 Milestone M3 — E2E Parity(VM ↔ LLVM, selfhost compiler) - 目的: ランナーから子プロセスに selfhost compiler を使い、VM/LLVM の結果が一致する - 受け入れ: 代表サンプル(const_ret 等)で `Result:` 行が一致 - スモーク: `tools/smokes/v2/profiles/quick/selfhost/selfhost_e2e_vm_llvm.sh`(LLVM未導入時はVMのみ通過) ### 🧱 Baseline → Selfhost → Legacy Removal(段階) - Baseline(本ドキュメントの前段) - デフォルト: 最小 Kernel 埋め込み、Plugins 既定OFF(オプトイン) - 解決順: User > Plugin > Kernel - ドキュメント: `docs/guides/kernel-plugin-baseline.md`, `docs/guides/build-runtime-defaults.md` - Selfhost(M1 以降) - M2(計画): 生成 EXE で compiler.hako を再ビルド → JSON ヘッダ/簡易 MIR を比較 - M3(計画): VM/LLVM の E2E 差分ゼロ(代表アプリ 1 本) - Legacy Removal(M*) - VM 便宜 boxes_* の段階撤退(Plugin 実装へ移管) - 旧 CoreBox の Kernel 残骸を削減(Null/Missing 以外の stateful 実装を撤去) - 文字列エラー依存("Key not found:") の完全廃止(null チェック統一) ## 🛣️ 実行ルート(道)— 小さく進めて確実に緑にする この順で小粒に進めると、常に quick 緑を維持しながらセルフホスティングへ到達できるよ。 1) パーサ仕上げ(prelude安全・静的化) - ObjectParseBox を prelude 安全に(_dq/_bs ヘルパで直文字回避) - expr/stmt 側も utils を静的呼び出しに統一(new排除) - 受け入れ: json_native 簡易 roundtrip 緑 2) Stage‑1 JSON の早期経路固定(quiet/--min-json) - quiet/--min-json では AST プレリュードマージをスキップ容認(エラーにしない) - main(args) に CLI script args を渡す(-- の後を JSON 経由で注入) - 受け入れ: selfhost_min_json_header_vm PASS(緑) 3) MIR ローアの段階実装(最小→分岐/PHI) - Return/Const → BinOp → Compare → Branch/Jump → PHI の順に有効化 - JSON v0 Bridge の到達不能 pred 除外を統一(return/throw) - 受け入れ: selfhost_mir_m2_*(eq_true/eq_false/compare)を順に UN‑SKIP→緑 4) Hakorune VM 箱化ラインの安定化 - InstructionScannerBox/OpHandlersBox に一本化(無限ループ対策・観測の集約) - Arithmetic/Compare の委譲(小さな共通箱へ移譲) - 受け入れ: m2/m3 代表(branch/jump/phi)緑 5) using/[modules] のE2E(AST OFFでも登録維持) - modules 登録は quiet でも常時維持(AST マージはスキップ可) - 受け入れ: using_modules_alias_vm / using_modules_rune_host_vm PASS 6) LLVM 連結ラインの最小安定化(AOT/ハーネス) - hako_kernel に最小シンボルを追加(string.concat_{ss,si,is} / console.* / readline) - 最小セマンティクスはフラグ NYASH_HAKO_MIN_SEM=1 でON(既定OFF) - 受け入れ: 代表ベンチのリンク成功・終了コード一致(ハーネス or AOT) 7) スモーク整備(quick → integration) - selfhost_min_json_header_vm / selfhost_mir_m2_* / pipeline_v2_* / json_native roundtrip を quick に集約 - 受け入れ: quick 全緑、integration 代表緑 8) 性能・回収(ホット箇所のみ) - Hakorune VM の compare/binop ホットパス最小化(ログ削減・必要なら inlining) - LLVM の concat/console 経路の cpool 最適化 - 受け入れ: ベンチ中央値で説明可能な改善(仕様不変) ### よく使うコマンド(抜粋) - ビルド: `cargo build --release` - quiet ヘッダ確認: `NYASH_USING=1 NYASH_USING_AST=0 NYASH_JSON_ONLY=1 ./target/release/hakorune --backend vm apps/selfhost-compiler/compiler.hako -- --min-json` - LLVM ハーネス: `NYASH_LLVM_USE_HARNESS=1 NYASH_NY_LLVM_COMPILER=target/release/ny-llvmc NYASH_EMIT_EXE_NYRT=target/release ./target/release/hakorune --backend llvm apps/APP/main.hako` - AOT最小セマンティクス: `NYASH_HAKO_MIN_SEM=1 NYASH_NYRT_SILENT_RESULT=1 ./app` ### 📊 **現状分析(2025-09-30)** ## 🆕 Updates — 2025-10-08(小粒の安定化) - Namespace CLI の可視性を強化 - `--list-modules` / `--modules-show` / `--modules-resolve` で先頭に `[policy] {module-first|path-first}` を表示。 - Module‑First 運用時の意図が出力から一目で分かるようにした(dev UX)。 - Strict 診断テンプレ(using/modules)をガイド化 - `NYASH_USING_CHECKS_STRICT=1` 時に 1 行で安定出力: - MissingDep: `workspace missing dependency: ()` - Conflict: `workspace namespace conflict: has multiple paths: ` - 併せて JSON 診断(`{"kind":"modules_error",...}`)も出すが、テストは 1 行文字列で安定比較可能。 - Throw/PHI の Builder 側の扱い修正(JSON v0 経路) - Match の then‑arm が Throw で終わる場合、PHI 入力と merge ジャンプを抑止(到達不能の入力を除外)。 - 受け入れ: `json_v0_match_throw_phi_vm.sh` を常時ON化し、Result: 7 を確認(else のみが PHI に来る)。 - Stage1JsonScannerBox の適用拡大(取りこぼし減) - 早期経路(Call/Method)で `extract_name_args` を使う軽量フォールバックを追加。微妙な JSON 差異にも耐性。 - Macro 子プロセスの隔離(テスト/開発) - 子に `NYASH_SKIP_TOML_ENV=1` / `NYASH_USING=0` を注入してプロジェクト TOML/using の影響を遮断。ガイドへ追記。 #### ✅ **既に実装済み(堅固な基盤)** - **Rustコンパイラ**: 完全実装・安定動作(Phase 1-14) - Parser(完全実装✅) - AST生成(完全✅) - MIRビルダー(完全✅) - 3バックエンド実装✅ - Rust VM(712行、開発・デバッグ用) - Python LLVM/llvmlite(1,456行、本番・最適化用) - PyVM(1,074行、JSON v0ブリッジ・using処理専用) - プラグインシステム(完全✅) #### 🔄 **実装中(Hakoruneコンパイラ)** - **場所**: `apps/selfhost-compiler/` - **現状**: - パーサーMVP ✅(Stage-2/3サポート) - MIR生成基本 ✅(const/binop/compare/branch/jump/ret) - JSON v0出力 ✅(最小動作確認済み) - **Pipeline V2 🔄(Box-First emit-only architecture)** - 📋 **[詳細設計](../../selfhosting/pipeline_v2.md)** - 全体像・Boxes・制約 - 📦 **[実装](../../../../selfhost/compiler/pipeline_v2/)** - ExecutionPipelineBox/BackendBox/MirBuilderBox - 🔧 **[契約](../../../../apps/selfhost-compiler/INTERFACES.md)** - インターフェース仕様 - 🧪 **[スモーク](../../selfhosting/pipeline_v2.md#smokes-quick)** - 受け入れテスト #### ❌ **未完成(Phase 15.7の目標)** 1. **branch/jump最小生成** ✅(完了) 2. **LocalSSA.ensure_cond** ✅(最終パスに統合) 3. **全構文サポート** 📝(match式、property、lambda等) 4. **最適化パス** 📝(デッドコード削除、インライン化等) 5. **完全なブートストラップ** 🎯(c0→c1→c1') ### 🤔 **VM層も一緒に作った方が楽?** → **YES!絶対YES!** #### 💡 **理由1: 相互検証が可能** ``` Hakoruneコンパイラ(apps/selfhost-compiler/compiler.hako|互換: .nyash) ↓ MIR生成 Hakorune-VM(apps/hakorune/vm/boxes/hakorune_vm_min.hako|互換: selfhost/vm/boxes/mir_vm_min.hako) ↓ 実行 Rust VM(src/backend/mir_interpreter/) ↓ 比較検証 差分があれば即座に発見! ``` #### 💡 **理由2: デバッグが容易** - **Hakoruneコンパイラのバグ**: Hakorune VMで実行 → エラー出る → MIRを見る → Rust VMと比較 - **Hakorune VMのバグ**: Rustコンパイラ生成MIRで実行 → Rust VMと比較 → 差分発見 #### 💡 **理由3: 完全な理解(教材として最高)** ``` Hakoruneでコンパイラ書く + Hakoruneで実行器書く = 完全な理解(世界一美しい自己参照システム) ``` ### 🎯 **Phase 15.7の正しい優先順位** #### **P0: Rust VM層の安定化(既存バグの点修正・回帰防止)** - 受け手推定・RouterPolicy・LocalSSA/材化・VarMapGuard 等の補強を優先 - quick/integration 常緑維持(既定の品質基準) - **理由**: Rust VMは比較検証の基準点として絶対的に安定している必要がある #### **P1: Hakorune‑VM 仕上げ(完了✅)** - M2/M3 の代表+エッジスモークを quick に追加 - 単一パス+厳密セグメントで緑維持 - **成果**: `apps/hakorune/vm/boxes/hakorune_vm_min.hako` 安定動作(旧パスとの互換ルート維持) 【2025-10-01 追記】 - Hakorune VM に call/boxcall/newbox の最小意味論(i64 引数の総和)を追加。代表スモーク(exec)を quick に追加: - `tools/smokes/v2/profiles/quick/selfhost/selfhost_pipeline_v2_call_exec_vm.sh` - `tools/smokes/v2/profiles/quick/selfhost/selfhost_pipeline_v2_method_exec_vm.sh` - `tools/smokes/v2/profiles/quick/selfhost/selfhost_pipeline_v2_newbox_exec_vm.sh` - Stage‑1 抽出器を負数/空白に寛容化。Emit 側は配列/文字列の両方から引数を正規化材化。 - Pipeline V2 に `LocalSSA.ensure_calls(...)` を導入(call/method/new の材化ポリシー集約)。 - v1 `mir_call` の shape スモーク(VM-only)を追加: - `tools/smokes/v2/profiles/quick/selfhost/selfhost_pipeline_v2_call_v1_shape_vm.sh` - `tools/smokes/v2/profiles/quick/selfhost/selfhost_pipeline_v2_method_v1_shape_vm.sh` - `tools/smokes/v2/profiles/quick/selfhost/selfhost_pipeline_v2_newbox_v1_shape_vm.sh` - LLVM ハーネス compile-only の PHI 形状スモークを追加(STRICT=1): - `tools/smokes/v2/profiles/quick/llvm/phi_if_merge_compile_ok.sh` - `tools/smokes/v2/profiles/quick/llvm/phi_loop_compile_ok.sh` - 返り値→終了コードの統一(VM/WASM/AOT): Rust VM はプログラムの戻り値をプロセス終了コードへ反映(0..255)。 【2025-10-02 追記】 - FlowEntryBox / FlowRunner(箱化・薄導線) - 追加: `selfhost/compiler/pipeline_v2/flow_entry.hako`(emit-only 入口) - 追加: `apps/selfhost/vm/flow_runner.hako`(Hakorune VM 実行薄箱) - 役割分離: emit は selfhost-compiler 配下、実行は selfhost/vm 配下(箱境界) - LocalSSA 材化ポリシーの統一 - `ensure_calls`(call/method/new)、`ensure_cond`(branch cond)ともに「PHI直後に copy 挿入」に統一 - JSONテキスト整形で挙動不変・Fail‑Fast(未対応形は無変更) - MirCall v1(統一呼出し) - 薄箱: `selfhost/compiler/pipeline_v2/mir_call_box.hako` を追加(emit-only) - ハーネス時の v1→v0 ダウングレード (`NYASH_LLVM_DOWNGRADE_V1=1`) を前提に shape/compile を安定化 - 未解決 Global は v0 extern へ降格(compile-only)、VM/AOT は未解決エラー(Fail‑Fast) - CLI: `--emit-mir-json` をグローバル早期ゲートに(バックエンド非依存) - どの backend 指定でも、パース→MIR→JSON 書き出し→即終了 - ベンチ/WASM パイプラインの自動化に利用 - 工具: WASM 一括スクリプトを追加 - `tools/build_and_run_wasm.sh`(.nyash → MIR(JSON) → WASM → 実行/exit code) - 依存: python3+llvmlite, node(wasm_runner.js) - LLVM ハーネス(PHI) - Φ生成=PhiHandler、配線=finalize の不変を明記 - 関数境界で `phi_wired`/`block_phi_incomings` をクリア(リーク防止) - ハーネス compile 前に IR をサニタイズ: 空PHI除去+ブロック先頭へのPHIグループ化(検証を安定化) 【2025-10-05 追記 — 小粒前進のまとめ】 【2025-10-11 追記 — M2/M3達成と盤石化】 - Selfhost M2/M3 達成(quick常時ONの小セットで緑) - M2: selfhost_rebuild_vm(EXEで自分自身を解析、ProgramヘッダOK) - M3: parity_q_*(VM↔LLVM最小パリティ)+ plugin identity 緑 - 追加パリティ: JSON stringify / <=, >= 境界 - Provider 起動ダイジェストを固定化(1行) - 形式: policy=… config=… loaded={…} anchors=ok|miss stage2=on|off - dlsym セルフチェック導入(nyash_array_new_h / nyrt_host_call_slot / nyash_host_from_plugin_handle) - policy=force では anchors miss 時に Fail‑Fast - plugins profile の最小LLVM交差を追加(軽量・常時ON) - plugin_parity_min_vm_llvm(VM/LLVM最小一致の検査) - WASM Phase‑A を開始(ベンチ準備の最小実装) - ArrayBox: len/get/set/push/clear をコード生成(固定cap=8、OOB=0) - WAT生成スモークを追加(auto‑SKIPつき): - wasm_compile_array_ops_wat(最小) 【2025-10-12 追記 — SSOT/診断/スモーク更新】 - SSOT 優先の Type 解決に切替(既定ON) - TypeBox の slot/arity/aliases 解決と Core の type_id を SSOT → config(hako/nyash.toml) → 既定 の順に統一。 - 一時無効化ゲート: `HAKO_REGISTRY_SSOT_DISABLE=1`(`NYASH_*` 互換)。 - 参照: `src/runtime/type_registry.rs:66`, `src/runtime/type_registry.rs:312`。 - 診断の一元化(arity/unknown‑slot 等) - ルーター側の直書き文言を `diagnostics::msg` に統合し、Fail‑Fast メッセージの安定性を向上。 - 参照: `src/runtime/method_router_box/mod.rs:16`, `map_callable.rs:44`, `method_ref.rs:29`。 - スモーク運用の指針(軽量・常緑) - M2 quick 代表を常時(rebuild は環境により自動SKIP)。 - 実行: `tools/smokes/v2/run.sh --profile quick --filter 'selfhost_*_vm'` - M3 integration‑core の小セット(5〜8本)を代表で常時、フル20本は任意。 - 実行: `tools/smokes/v2/run.sh --profile integration-core` - SSOT バリデータ(編集時に任意で実行) - `./tools/check_ssot_table.sh`(name→slot 多重割当/重複の検出) ## 🧭 MIR 生成ロードマップ(Phase 15.7) 目的 - Rust 側の MIR 生成(Builder/Emitter)を“箱言語側(selfhost compiler)”へ段階移行し、Rust 側は JSON 受け口に縮退。 - 既定の意味論は不変(Fail‑Fast 強化は可)。VM/LLVM のパリティを維持したまま、自己ホスト化の歩幅を刻む。 境界と原則(Box‑First) - 生成面(Builder/Emitter): selfhost/compiler/pipeline_v2/ 配下(EmitMirFlow/Map 等)。 - 実行面(VM/LLVM): 既存の Rust VM と llvmlite ハーネス。 - 意味論の確定点: - Eq/Ne は Extern("nyrt.ops.op_eq") に統一(Builder 正規化)。 - メソッド呼出は SSOT(specs/type_registry.toml)の slot/arity に依存。 - 失敗ポリシー: Fail‑Fast(静かなフォールバックは禁止)。 段階計画(P1→P5) - P1(最小ブート) - 対象: const/ret、compare→branch/jump→ret。 - 実装: EmitMirFlow(Map) を活用して 1関数1エントリ CFG を生成。Phi は不要(簡易ダイアモンド)。 - 受け入れ: - quick: selfhost_emit_mir_min_rc_vm(rc‑only)緑。 - integration‑core: 既存 parity セット(const_ret/compare/branch)緑。 - P2(式) - 対象: binop(+,-,*,/,%)と単項(neg,not,bitnot)最小。 - 受け入れ: integration‑core の算術代表がVM/LLVM一致。 - P3(呼出) - 対象: Call/Method/Extern の最小統一(Extern は registry/generated を参照)。 - 受け入れ: op_eq primitives/reflexive の代表が Builder→VM/LLVM で一致。 - P4(NewBox: Core Collections) - 対象: ArrayBox/StringBox/MapBox の最小 new(birth は Runner/VM 規約に従う)。 - 受け入れ: quick のコレクション最小ケース rc‑only 緑。 - P5(整形/材化) - 対象: LocalSSA ensure_cond/ensure_calls の最小適用(未定義形は Fail‑Fast)。 - 受け入れ: 既存の LocalSSA スモーク rc‑only 緑。 ゲート/フラグ(既存の活用) - NY 系(エイリアス受理: HAKO_*) - NYASH_USE_NY_COMPILER=1(自己ホスト子を使用) - NYASH_NY_COMPILER_MIN_JSON=1(最小 JSON) - NYASH_NY_COMPILER_CHILD_ARGS="--emit-mir"(MIR(JSON v0) 出力) - NYASH_JSON_ONLY=1(quiet 受理) - 既定はOFF。quick の代表は rc‑only で常時OK。 SSOT 連動 - slots/arity/aliases は specs/type_registry.toml を SSOT とし、Builder 参照は SSOT に統一(静的表は互換 fallback)。 - type_id も SSOT→config→既定の優先で参照(既に Runtime 実装済)。 テスト/スモーク方針 - quick: rc‑only を基本(本文依存を避ける)。 - integration‑core: VM/LLVM パリティは既存代表を利用(5〜8本)。段階追加は最小限。 - plugin‑on: 代表1本のみ常時(rc‑only)。広いE2Eは opt‑in。 ロールバック/安全策 - 生成経路の切替は環境フラグでいつでもOFFに戻せる構成を維持。 - Fail‑Fast は既定ON。問題時は quick を崩さずに段階差し戻しが可能。 完了定義(Phase 15.7 時点) - P1〜P3 が緑、P4 は最小 new が通る、P5 は ensure_cond の最小が効く。 - quick 全緑(rc‑only代表を含む)、integration‑core 全緑。 ### 進捗(2025‑10‑12 現在) - P1 完了(const/ret, compare diamond) - 共有箱を導入: `selfhost/shared/common/mir/{mir_schema_box.hako,block_builder_box.hako}` - emit 経路を薄アダプタ化(出力互換): - `selfhost/compiler/pipeline_v2/emit_mir_flow_map.hako` - `selfhost/compiler/pipeline_v2/emit_mir_flow.hako` - quick 代表(rc‑only): `selfhost_emit_mir_min_rc_vm` が常時緑 - P2 準備完了(binop/loop 最小) - BlockBuilder に `binop/loop_counter` を追加し、emit 経路から利用開始 - quick 代表(rc‑only): `selfhost_emit_mir_binop_min_rc_vm` を追加 - P3 最小導線(Extern op_eq) - CallEmit/MirJsonBuilderMin を拡張し、`mir_call callee=Extern("nyrt.ops.op_eq")` を生成 - emit 経路に `emit_op_eq(lhs,rhs)` を追加(出力互換) - quick 代表(rc‑only): `selfhost_pipeline_v2_op_eq_vm`(true)と `selfhost_pipeline_v2_op_eq_false_vm`(false)を追加 - P3 追加(Global/Method/Constructor E2E) - v1→v0 変換(`MirJsonV1Adapter.to_v0`)→ `--json-file` 実行のE2E代表を追加(rc‑only) - Global(print): `selfhost_mircall_global_print_e2e_vm`(副作用は無視。ret 0でrcのみ検証) - Constructor+Method(size): `selfhost_mircall_ctor_method_e2e_vm`(ArrayBox.size) - Global(JSON.stringify): `selfhost_mircall_global_json_stringify_e2e_vm`(`NYASH_JSON_STRINGIFY_DEV=1` で純関数化。ret 0でrcのみ) ### ENV ゲート(Builder Eq/Ne 正規化) - `NYASH_BUILDER_EQ_TO_OPEQ=1|0`(別名 `HAKO_BUILDER_EQ_TO_OPEQ`) - 1/true/on: Eq/Ne を Extern("nyrt.ops.op_eq") に降格(NeはNotで反転) - 0/未設定: 降格しない(Compareのまま) - 既定: OFF(Phase 15.7時点)。回帰が安定したらONに昇格可能。 - quick 代表(rc-only): `tools/smokes/v2/profiles/quick/core/builder_eq_gate_off_rc_vm.sh` 備考 - 出力 JSON 形状は既存の `{ functions:[...] }` に揃えており、Rust 側受け口の互換性を維持。 - SSOT は既定ON。slots/arity/aliases は specs/type_registry.toml を優先参照。Extern シグネチャは specs/externs/registry.toml 由来の生成物を利用。 - wasm_compile_bench_suite_wat(apps/benchmarks/wasm/basic/*.hako 一括) - ENV/プロファイルの整理(迷いの削減) - HAKO_PLUGIN_POLICY=auto を主。NYASH_* は互換 - Stage‑2(HostHandle Array)は profile 限定でON 受け入れ(更新) - quick: parity_* + M2代表 + plugin identity(1本)+ wasm WAT(1本)緑 - plugins: identity(2本)+ 最小LLVM交差(1本)緑 - provider digest が毎回表示、policy=forceは anchors=ok 必須 - Hakorune VM の箱化・安定化(自己ホスト向け) - HakoruneVmMin: InstructionScannerBox.next + OpHandlersBox.handle_* 経由に統一。無限ループ対策/観測の集約を反映。 - 共通箱の拡充: ProgramStateBox(bb/prev/steps), CfgNavigatorBox(index_of_from/head/tail), RetResolverBox(ret一元化), DiagnosticsBox(DEVでdebug)。 - using/[modules]: alias(hakorune.vm.mir_min)を追加し、flow_runner などの呼び先を段階的に新別名へ統一。 - JSON v0 Bridge の堅牢化 - 到達不能 pred(return/throw)を PHI incoming から除外する判定を unify(if/match両方)。 - 文字列/数値ヘルパの重複解消 - StringHelpers(to_i64/int_to_str/json_quote/read_digits)へ委譲。JsonFrag/JsonScan/Compiler 側の重複を削減。 - selfhost VM 補助の .nyash→.hako 統一(一部)。 - WASM ABI スケルトン(handoff 用) - docs/guides/wasm-abi.md に最小ABI(nykernel.malloc/load_i64/store_i64)と契約を記載。 - crates/nykernel-wasm(wasm32向けbump allocator + load/store)を追加(ワークスペース未接続)。 - hakorune-std/core/array.hako を追加(extern_call一本化)。VMでは NYASH_ENABLE_NYKERNEL_STUB=1 で開発スタブ稼働。 - スモーク整備 - noisy系は opt-in 化(ゲート環境変数で明示ON)。 - ArrayBox の最小E2E(push/get/resize)を quick に opt-in で追加(VMスタブ)。 次の小粒(Phase 15.7 継続) 1) Stage‑1/2 最小 E2E(Ny→JSON→MIR(JSON)→Hakorune VM)を代表3本で緑固定(const→ret/compare→ret/compare→branch→phi)。 2) UsingResolverBox/NamespaceBox を実装し、Pipeline V2 に統合(Callee::ModuleFunction 正規化を前段で完了)。 3) Hakorune VM:ProgramStateBox/CfgNavigatorBox の参照を全面 get 化(残差つぶし)+ 代表CFG(diamond/jump_chain)を1本ずつ追加。 4) (先送り)index_of_from の集約(JsonFrag/flow_runner/flow_debugger など)を CfgNavigatorBox へ段階移行(Phase 15.12)。 ## 🔁 Rust → Nyash 移植計画(Phase 15.7 拡張) 目的 - Hakorune Compiler/VM の“自己完結”を高め、Rust 実装への依存を段階的に縮小。 - Box‑First 原則に従い、移植点を小箱の境界に分解して安全に前進。 優先度P1(1–2週)— コンパイラ側(apps/selfhost-compiler) - Using/Namespace 解決(未完の中核) - 新規: `UsingResolverBox`(modules/symbols の登録・照会) - 新規: `NamespaceBox`("A.B" → Callee::ModuleFunction への正規化) - 統合: Pipeline V2 の compare/call/method 前段で using 解決を完了 - Emit/Builder の整流 - `emit_*_box.hako` 群を Map→to_json に統一(HeaderEmitBox 経由) - `CallEmitBox/NewBoxEmitBox` の API 統一(args_array/text の併設) - 署名検証(コンパイル時Fail‑Fastの拡張) - `SignatureVerifierBox` を全発行点に適用 - `MethodRegistryBox` のカバレッジ拡張(toJSON/length 別名整理, startsWith/endsWith 等) 優先度P2(1週)— VM 側(apps/selfhost/vm, apps/hakorune/vm) - Hakorune VM の箱化仕上げ - `InstructionScannerBox`/`OpHandlersBox` 採用の残差つぶし - `ProgramStateBox`(bb/prev/steps)利用の全面化 - `CfgNavigatorBox.index_of_from` への検索統一(残差) - PHI/Throw 周辺の最小意味論 - 非到達 Throw の PHI 除外(Bridge/Builder は済) - Throw は VM での最小 return 化(将来の例外伝播は別フェーズ) 優先度P3(1週)— 共有ユーティリティ - `JsonCursorBox` の採用拡大(minivm_probe/step_runner 等の直接スキャン撤去) - `StringStd.index_of_from` の横展開(ツール系・旧コードの2引数 indexOf 残差つぶし) - DEV リントを段階的に厳格化(`LINT_INDEXOF_FAIL=1`) マイルストーン(WBS 概算) - Week 1: UsingResolver/Namespace 実装→Pipeline V2 統合, Call/Method/New emit の to_json 仕上げ - Week 2: SignatureVerifier/MethodRegistry 拡張, Hakorune VM 箱化仕上げ(state/scanner/handlers) - Week 3: JsonCursor 置換の残差、2引数 indexOf の完全撤去、Throw/PHI スモーク常時ON化の可否判断 受け入れ(本セクション) - quick: 自己ホスト代表3本(const→ret / compare→ret / compare→branch→phi)常時緑 - Throwスモーク: if 非到達側に Throw を含むケースを常時ONで緑(実行側 Throw は別テストでゲート) - lint-ny: 2引数 `.indexOf(a,b)` のワークスペース内ゼロ(archive/互換/外部除外) #### **P2: Hakoruneコンパイラ MVP(次の主作業)** - **既存**: `apps/selfhost-compiler/compiler.hako` を軸に実装(.nyash は後方受理) - **目標**: Stage‑2/3 入力から JSON v0 を安定排出 - **直近TODO**: 1. branch/jump 最小生成(完了✅) 2. LocalSSA.ensure_cond 材化コピー(完了✅) 3. Hakorune VM 代表追加(If/Compare 代表、Loop カウンタ 代表 追加済み✅) 4. **🔥 UsingResolverBox実装(最優先・未着手)** - 詳細は下記「using解決の2つの側面」参照 #### **🔍 using解決の2つの側面(重要な洞察)** **結論**: usingなどの解決は**コンパイラー側のUsingResolverBox実装**が核心。Hakorune VM側は既に設計完了! ##### **A. Hakorune VM側 = 既に解決済み!✅** - MIR JSONには**解決済みのCallee::ModuleFunction**が入る - VM側は`BoxCall`/`ExternCall`を機械的に実行するだけ - using解決は**不要**(名前解決は事前完了) - **現状**: M2/M3で完全動作中、追加実装不要 ##### **B. コンパイラー側 = これが残課題!🔥** ```hako // これを解析してMIR生成する機能が未実装 using "apps/lib/timer" as Timer using "apps/lib/array_ops" as Arr flow main() { local t = Timer.now_ms() // ← シンボル解決が必要 local a = Arr.map(...) // ← モジュール関数解決が必要 } ``` **必要な実装(3段階)**: 1. **UsingResolverBox**(新規箱、優先度P2-A、見積もり1週間) ```hako static box UsingResolverBox { modules: MapBox // "Timer" -> "/abs/path/to/timer.hako" symbols: MapBox // "Timer.now_ms" -> Callee::ModuleFunction resolve_using(path, alias) { // using文を解析してmodules/symbolsに登録 } get_module_path(alias) { // "Timer" -> "/abs/path/to/timer.hako" } } ``` 2. **NamespaceBox**(新規箱、優先度P2-B、見積もり5日) ```hako static box NamespaceBox { resolve_call(namespace, method) { // "Timer.now_ms" -> Callee::ModuleFunction // UsingResolverBoxと連携 } resolve_static_access(namespace, field) { // "Config.VERSION" -> 静的フィールドアクセス } } ``` 3. **Pipeline V2統合**(優先度P2-C、見積もり3日) - CompareExtractBoxの前段階でusing解決 - 既存のLocalSSABoxと連携 - MIR生成時に`Callee::ModuleFunction`に変換 **関心の分離の完璧さ(設計の優秀さ)** ⭐ ``` ┌─────────────────┬──────────────────┐ │ コンパイラー側 │ Hakorune VM側 │ ├─────────────────┼──────────────────┤ │ using解決 │ 解決済みCallee │ │ 名前空間管理 │ 機械的実行 │ │ シンボル解決 │ 型情報不要 │ │ → 複雑 │ → シンプル │ └─────────────────┴──────────────────┘ ``` **これがPhase 15.7設計の真の優秀さ!** Quick smokes from using/new依存削減の真の意味: - Hakorune VM自体は**using不要で動く**(静的メソッド+extern_call) - using解決は**コンパイラー側の責務** - **関心の分離**が完璧に実現されている! #### **P3: Known/Rewrite 統合 Stage‑1 の仕上げ(dev観測)** - 仕様は不変のまま、観測(resolve.try/choose / ssa.phi)と関数化の一貫性を高める - **理由**: 開発者体験の向上(デバッグ情報の充実) #### **P4: NYABI Kernel 下地の維持(未配線・既定OFF)** - 将来の拡張性のための下地準備(Phase 16以降で本格化) 【2025-10-03 追記 — Core Kernel: TimerBox (P1)】 - ねらい: ベンチ/待機/パリティ検証のための「最小の時刻API」をコアBoxで提供する。 - Extern 仕様(最小): - nyrt.time.now_ms → i64(単調時刻; ms) - LLVM: src/llvm_py/instructions/externcall.py にバインドを追加 - VM(Rust): extern_call("nyrt","time.now_ms") を実装(std::time::Instant ベース) - WASM: JS の Date.now() で一時バインド(将来 Monotonic を検討) - Box 仕様(最小): - TimerBox.now_ms(): i64(上記 extern の薄ラップ) - modules 登録: selfhost.core.timer = "apps/core/timer/TimerBox.hako"(配置は後追い) - 受け入れ(quick 最小スモーク): - tools/smokes/v2/profiles/quick/core/timer_now_ms_vm.sh(2回の now_ms の差 ≥ 0) - tools/smokes/v2/profiles/quick/llvm/timer_now_ms_harness.sh(ハーネス時のみ; 無ければ SKIP) - 注意: - まずは now_ms のみ(sleep_ms/async は別フェーズ)。 - 壁時計と混在しないよう「単調時刻」を明記(壁時計は ClockBox として将来導入)。 【2025-10-03 実装完了メモ】 - 実装: - VM/LLVM/WASM へ `nyrt.time.now_ms` を配線。TimerBox は薄い導線(`apps/core/timer/TimerBox.hako`)。 - フロント(Builder)で `TimerBox.now_ms()`/`new TimerBox().now_ms()` を `ExternCall("nyrt.time","now_ms")` に正規化。 - テスト: - quick: `core/timer_now_ms_vm.sh` で Result 行を検証。 - quick/llvm: `llvm/timer_now_ms_harness.sh` はハーネス環境が無い場合 SKIP(Fail‑Fast設計)。 - 付記: - quick プロファイルでは LLVM/AOT の一部ケースを環境依存にしないため、ハーネス未検出・静的プラグイン未構成時は SKIP 方針に統一(詳細は各スモークスクリプト参照)。 【Core Kernel 候補(検討メモ)】 - ConsoleBox(既存): log/print の最小API。現状維持。 - TimerBox(本件 P1): now_ms のみ。sleep_ms は P2 以降(協調スケジューラ設計後)。 - RandomBox(候補): seed(u64)/next_u64() のみ(テスト再現性目的)。導入は CI/シード方針が固まってから。 - EnvBox(候補): get(name)/set(name,value) の最小。既定OFF; 影響範囲が広いので Box 境界で隔離。 - FSBox(候補): read_file(path)/write_file(path,data) の最小。Runner/サンドボックス方針の下で将来。 ## 📊 **進捗評価と残り作業(客観的評価・2025-10-03)** ### **現在位置: 80%完成、残り20%(見積もり3-4週間)** ``` Phase 15.7進捗: ████████░░ 80%完成 完了(80%): ✅ Hakorune VM M3基盤(6命令動作実証) - const, binop, compare, branch, jump, ret ✅ Pipeline V2基礎実装 - CompareExtractBox, EmitCompareBox - LocalSSABox導入済み - MirJsonBuilderMin(JSON v0生成) ✅ FlowRunner/JsonProgramBox - FlowEntryBox(emit-only入口) - Hakorune VM実行薄箱 ✅ Quick smokes 172/172 PASS - コア常在ルール達成 - プラグイン無効化対応 ✅ TimerBox実装完了 - nyrt.time.now_ms実装(VM/LLVM/WASM) ✅ EffectResolver一元化導線 残り20%(3-4週間): 🔲 UsingResolverBox実装(1週間) 🔲 NamespaceBox実装(5日) 🔲 Pipeline V2統合(using)(3日) 🔲 Hakorune VM命令拡張(2週間) - newbox(2日・最重要) - boxcall(2日・最重要) - phi(2日) - load/store(2日) - externcall(1日) - unaryop/typeop(2日) 🔲 セルフホストループE2E(1週間) ``` ### 📅 **進捗更新(2025-10-06)** #### ✅ **完了済み(予想より早期達成!)** **コンパイラー側(P2系)- 見積もり18日 → 実績2日!** - ✅ **P2-A UsingResolverBox実装**(1日で完了、見積もり7日 → **85%短縮!**) - 追加: `selfhost/compiler/pipeline_v2/using_resolver_box.hako` - 機能: alias→path/namespace マッピング、using/modules JSON読込 - スモーク: `quick/selfhost/selfhost_using_resolver_basic_vm.sh` - ✅ **P2-B NamespaceBox実装**(1日で完了、見積もり5日 → **80%短縮!**) - 追加: `selfhost/compiler/pipeline_v2/namespace_box.hako` - 機能: `Timer.now_ms` → `Callee::ModuleFunction` 正規化 - スモーク: `quick/selfhost/selfhost_namespace_box_basic_vm.sh` - ✅ **P2-C Pipeline V2統合(using)**(1日で完了、見積もり3日 → **67%短縮!**) - 追加: `PipelineV2.lower_stage1_to_mir_with_usings(...)` - 機能: using解決後のMIR生成パイプライン **品質強化(計画外の追加成果!)** - ✅ **SignatureVerifierBox**(コンパイル時型検証) - 追加: `selfhost/compiler/pipeline_v2/signature_verifier_box.hako` - 機能: ビルトインメソッドのarity検証(compile-time Fail-Fast) - ✅ **MethodRegistry拡大**(ビルトイン署名管理) - 追加: `apps/hakorune/vm/boxes/method_registry.hako` - 機能: String/Array/Map の toString/stringify/startsWith/endsWith 等を登録 - ✅ **JsonCursorBox採用**(JSONスキャン統一) - 機能: index_of_from/seek_array_end の一貫API化 - 影響: minivm_probe/step_runner等の直接スキャン箇所を委譲 - ✅ **Hakorune VM への改名**(2025-10-05完了) - Mini-VM → Hakorune VM(ブランディング統一) - ファイルパス: `apps/hakorune/vm/boxes/hakorune_vm_min.hako`(正式) - 互換パス: `selfhost/vm/boxes/mir_vm_min.nyash`(alias維持) #### 🔥 **現在の最優先タスク** **Hakorune VM命令拡張(P1系)- 残り10-15%の核心** - 🔥 **newbox実装**(2日・最重要)← **今ココ!** - ファイル: `apps/hakorune/vm/boxes/hakorune_vm_min.hako` - 目標: `new StringBox()`, `new ArrayBox()` の実行 - 依存: なし(最初に実装可能) - 🔥 **boxcall実装**(2日・最重要) - 目標: `x.length()`, `arr.push(42)` の実行 - 依存: newbox完了 - 📝 **phi実装**(2日) - 目標: if/loop のPHI合流点動作 - 依存: なし(並行実装可能) - 📝 **load/store実装**(2日) - 目標: フィールドアクセス(`me.field`, `obj.field`) - 依存: newbox完了 - 📝 **externcall実装**(1日) - 目標: `print()`, `console.log()` の実行 - 依存: なし(並行実装可能) #### 📊 **進捗率の再評価** ``` Phase 15.7進捗: █████████░ 85-90%完成(上方修正!) ✅ 完了(85-90%): ✅ P2-A/B/C(Using解決系)完全実装 ✅ SignatureVerifier/MethodRegistry(品質強化) ✅ Hakorune VM基盤(InstructionScannerBox/OpHandlersBox/ProgramStateBox等) ✅ FlowRunner/JsonProgramBox ✅ Pipeline V2基礎実装 ✅ Quick smokes 常緑(172/172 PASS) ✅ TimerBox実装完了 ✅ Hakorune VM への改名完了 ❌ 残り10-15%(1-2週間、下方修正!): 🔥 Hakorune VM命令拡張(最後の砦) - newbox(2日・最重要) - boxcall(2日・最重要) - phi(2日) - load/store(2日) - externcall(1日) 🔲 セルフホストループE2E(1週間) ``` **旧見積もり**: 80%完成、残り20%(3-4週間) **新見積もり**: **85-90%完成、残り10-15%(1-2週間)** #### 💡 **教訓(Lessons Learned)** 1. **Box-First設計の威力**: 新機能追加が予想の**9倍速** - UsingResolver/Namespace実装は1日ずつで完了 - Pipeline V2の強固な設計が成功の鍵 2. **見積もりの精度**: 初期見積もりは慎重すぎた - コンパイラー側: 見積もり18日 → 実績2日 - 基盤の成熟度を過小評価していた 3. **並行開発の難しさ**: 実際は順次開発が正解 - Using解決がモジュールシステムの基盤 - コンパイラー完成 → Hakorune VM拡張の順が合理的 4. **品質ファーストの重要性**: 計画外の成果が大きい - SignatureVerifier/MethodRegistry/JsonCursorBox - Fail-Fast文化の確立が開発速度を加速 #### 🎯 **次の具体的アクション(1-2週間)** **Week 1: Hakorune VM命令拡張** - Day 1-2: newbox実装(Box生成基盤) - Day 3-4: boxcall + phi 並行実装 - Day 5-6: load/store + externcall 並行実装 - Day 7: 統合テスト・スモークテスト **Week 2: セルフホストループE2E** - Day 1-2: .hakoソース→MIR JSON生成確認 - Day 3-4: MIR JSON→Hakorune VM実行確認 - Day 5-6: パリティテスト(Rust VM vs Hakorune VM) - Day 7: ブートストラップ達成!🎉 ### **作業分解(週別見積もり)** #### **Week 1: UsingResolver + Namespace実装** - Day 1-3: UsingResolverBox実装・テスト - Day 4-5: NamespaceBox実装・テスト - Day 6-7: Pipeline V2統合(using解決) #### **Week 2: Hakorune VM命令拡張(最重要)** - Day 1-2: newbox実装(Box生成) - Day 3-4: boxcall実装(メソッド呼び出し) - Day 5-6: phi実装(SSA合流) - Day 7: load/store実装開始 #### **Week 3: Hakorune VM命令拡張(完了)** - Day 1-2: load/store実装完了 - Day 3: externcall実装(print等) - Day 4-5: unaryop/typeop実装 - Day 6-7: 統合テスト・スモークテスト整備 #### **Week 4: セルフホストループE2E** - Day 1-2: .hakoソース→MIR JSON生成(コンパイラー) - Day 3-4: MIR JSON→実行(Hakorune VM) - Day 5-6: パリティテスト(Rust VM vs Hakorune VM) - Day 7: ブートストラップ達成!🎉 ### **達成基準(明確な終了条件)** ✅ **Phase 15.7完了 = 以下すべて満たす**: 1. UsingResolverBox/NamespaceBox動作 2. Hakorune VM 14命令すべて実装 3. .hakoソース→MIR JSON→Hakorune VM実行成功 4. c0(Rustコンパイラ)→c1(Hakoruneコンパイラ)動作 5. c1→c1'(自己コンパイル)成功 6. Quick smokes 全PASS維持 ## 🚀 **セルフホスティング実現への道筋** ### 🔄 **セルフホストループの具体的4ステップ(詳細化)** ``` ┌──────────────────────────────────────┐ │ Step 1: .hako ソース解析 │ │ ↓ │ │ Step 2: MIR JSON生成(コンパイラ) │ │ ↓ │ │ Step 3: MIR JSON実行(Hakorune VM) │ │ ↓ │ │ Step 4: 出力検証(パリティテスト) │ └──────────────────────────────────────┘ ``` #### **Step 1: .hakoソース解析(Rust VMで実行)** - **入力**: `apps/selfhost-compiler/compiler.hako` - **処理**: 1. using文解析(UsingResolverBox) 2. 名前空間解決(NamespaceBox) 3. AST構築 4. シンボルテーブル構築 - **出力**: 解決済みAST - **検証**: `HAKO_CLI_VERBOSE=1`で解決状況確認 #### **Step 2: MIR JSON生成(コンパイラ)** - **入力**: 解決済みAST - **処理**: 1. Pipeline V2実行 2. CompareExtractBox/EmitCompareBox適用 3. LocalSSABox適用(材化コピー) 4. MirJsonBuilderMin実行 - **出力**: `output.json`(JSON v0形式) - **検証**: ```bash ./target/release/hakorune --emit-mir-json output.json input.hkr cat output.json | jq . # 整形表示 ``` #### **Step 3: MIR JSON実行(Hakorune VM)** - **入力**: `output.json` - **処理**: 1. FlowEntryBox初期化 2. JsonProgramBox読み込み 3. FlowRunner実行 4. 命令順次実行(const/binop/compare/branch/jump/ret/newbox/boxcall/phi/load/store/externcall) - **出力**: 実行結果(標準出力/終了コード) - **検証**: ```bash HAKO_CLI_VERBOSE=1 ./target/release/hakorune \ apps/selfhost/vm/flow_runner.hako -- output.json echo $? # 終了コード確認 ``` #### **Step 4: 出力検証(パリティテスト)** - **比較対象**: 1. Rust VM実行結果 2. Hakorune VM実行結果 3. 期待値(テストケース) - **検証項目**: - 標準出力一致 - 終了コード一致 - 実行トレース一致(`HAKO_VM_DUMP_MIR=1`) - **自動化**: ```bash # パリティテストスクリプト tools/smokes/v2/run.sh --profile quick --filter "selfhost_parity_*" ``` ### 📅 **推奨実装順序(並行開発戦略)** #### **Week 1-2: Hakoruneコンパイラ MVP完成(P2優先)** - **Day 1-2**: branch/jump最小生成 ✅ - **Day 3**: LocalSSA.ensure_cond最終化 ✅ - **Day 4-7**: UsingResolverBox実装 🔥 - **Day 8-10**: NamespaceBox実装 🔥 - **Day 11-14**: Pipeline V2統合(using解決) 🔥 #### **Week 3: 統合+検証** - JSON v0完全出力 - Rust VM で実行確認 - スモークテスト整備 - **目標**: `tools/smokes/v2/profiles/quick/` 全緑維持 #### **Week 4: ブートストラップ達成** - Hakoruneコンパイラ + Hakorune VM統合 - セルフホスティング初期検証 - 基本プログラム実行成功 - **成果**: c0→c1→c1' 完全動作 ### 📊 **実装優先度マトリックス(2025-10-06更新)** | 項目 | 優先度 | ステータス | 理由 | 見積 | 実績 | 担当領域 | |----------------------|-------|-------|----------|------|------|------| | branch/jump生成 | 🔴 P2 | ✅完了 | 制御フロー必須 | 2日 | 2日 | コンパイラ | | LocalSSA.ensure_cond | 🔴 P2 | ✅完了 | 条件分岐安定化 | 1日 | 1日 | コンパイラ | | **UsingResolverBox実装** | 🔴 P2-A | ✅**完了** | **using解決の核心** | 1週間 | **1日**✨ | コンパイラ | | **NamespaceBox実装** | 🔴 P2-B | ✅**完了** | 名前空間解決 | 5日 | **1日**✨ | コンパイラ | | **Pipeline V2統合(using)** | 🔴 P2-C | ✅**完了** | using→MIR変換 | 3日 | **1日**✨ | コンパイラ | | **SignatureVerifier** | - | ✅**完了** | **計画外追加** | - | **1日** | コンパイラ | | **MethodRegistry拡大** | - | ✅**完了** | **計画外追加** | - | **1日** | コンパイラ | | **JsonCursorBox採用** | - | ✅**完了** | **計画外追加** | - | **1日** | 共通 | | **Hakorune VM改名** | - | ✅**完了** | **ブランディング統一** | - | **1日** | VM | | **Hakorune VM newbox実装** | 🟡 P1-A | 🔥**最優先** | **Box生成(最重要!)** | 2日 | **未着手** | Hakorune VM | | **Hakorune VM boxcall実装** | 🟡 P1-B | 🔥未着手 | **メソッド呼び出し** | 2日 | **未着手** | Hakorune VM | | Hakorune VM phi実装 | 🟡 P1-C | 📝計画 | SSA合流 | 2日 | 未着手 | Hakorune VM | | Hakorune VM load/store実装 | 🟡 P1-D | 📝計画 | メモリアクセス | 2日 | 未着手 | Hakorune VM | | Hakorune VM externcall実装 | 🟡 P1-E | 📝計画 | print等外部呼び出し | 1日 | 未着手 | Hakorune VM | | match式完全対応 | 🟡 P1-F | 📝計画 | 頻繁に使用 | 2日 | 未着手 | コンパイラ | | Hakorune VM unaryop/typeop | 🟢 P3-A | 📝計画 | 単項演算・型操作 | 2日 | 未着手 | Hakorune VM | | 最適化パス | 🟢 P3-B | 📝計画 | 性能向上 | 1週間 | 未着手 | コンパイラ | | エラーハンドリング | 🟢 P3-C | 📝計画 | UX向上 | 3日 | 未着手 | コンパイラ | **凡例**: - 🔴 P2: 最優先(セルフホスティング必須) - 🟡 P1: 高優先度(基本機能実装) - 🟢 P3: 中優先度(改善・UX向上) - ✅完了 / 🔥最優先 / 🔥未着手 / 📝計画 / ✨予想より早い達成 **達成状況**: - ✅ **P2系完全達成**(コンパイラー側:using解決・品質強化) - 🔥 **P1系が最優先**(Hakorune VM命令拡張:残り10-15%) **重要な優先順位**: 1. ~~**P2-A/B/C(using解決)**~~: ✅完了!(見積もりの9倍速) 2. **P1-A/B(newbox/boxcall)**: ← **今ココ!** これだけでほとんどの.hakoが動く 3. **P1-C/D/E(phi/load/store/externcall)**: 完全動作に必要 ### 🎯 **具体的な実装提案** #### **Option A: 並行開発(推奨✨)** **トラック1(Hakoruneコンパイラ)**: - 担当: ChatGPT + Claude - 期間: 3週間 - 成果: 完全なHakoruneコンパイラ - ファイル: `apps/selfhost-compiler/` **トラック2(Hakorune VM拡張)**: - 担当: ChatGPT + Claude - 期間: 2週間 - 成果: 完全な Hakorune VM(M4-M7) - ファイル: `selfhost/vm/boxes/mir_vm_min.nyash` **統合**: - 期間: 1週間 - 成果: セルフホスティング達成 **総期間**: 4週間 #### **Option B: 順次開発** 1. コンパイラ完成(3週間) 2. Hakorune VM完成(2週間) 3. 統合(1週間) **総期間**: 6週間 ### 💎 **Hakorune VM実装のメリット** #### **1. 教材として最高** ```hakorune // Hakorune で Hakorune VM を書く box MirVmMin { registers: MapBox blocks: MapBox execute(mir_json) { // MIR実行ロジック // これ自体が教材になる! } } ``` #### **2. デバッグの容易さ** - **Rust VM**: コンパイル必要、デバッグ困難 - **Hakorune VM**: 即座に修正、即座に実行 #### **3. 完全な制御** - **Rust VM**: 複雑、変更リスク大 - **Hakorune VM**: シンプル、実験容易 #### **4. セルフホスティングへの道** ``` Hakoruneコンパイラ(Hakorune実装) ↓ MIR生成 Hakorune VM(Hakorune実装) ↓ 実行 完全なセルフホスティング達成!🎉 ``` ### 🎯 **受け入れ条件(Acceptance Criteria)** #### **Phase 15.7完了基準** 1. **quick プロファイル**: 全緑維持(96/96 PASS) - Hakorune VM(M2/M3)代表スモーク緑 - const/binop/compare/branch/jump/ret 動作確認 - call/boxcall/newbox(最小意味論)実行スモーク緑 - v1 `mir_call` 形状スモーク(VM-only)緑 - LLVM/PHI compile-only スモーク緑(if-merge / loop) 2. **integration プロファイル**: 代表パリティ緑(llvmlite/ハーネス) - VM↔LLVM↔Ny のパリティ一致 ### 🔧 ENV クイックリファレンス(関連) - `NYASH_PIPELINE_V2=1` — Selfhost Pipeline V2 を有効化 - `NYASH_LLVM_USE_HARNESS=1` — LLVM llvmlite ハーネス経路 - `NYASH_LLVM_PHI_STRICT=1` — PHI: create-only(PhiHandler)/ wiring(finalize) - `NYASH_JSON_SCHEMA_V1=1` — JSON v1(mir_call)を有効化(shape 検証用) - `NYASH_LLVM_DOWNGRADE_V1=1` — ハーネス出力時に v1→v0 ダウングレード(compile-only 安定化) - `NYASH_VM_USE_PY=1` — PyVM 経路(開発/比較用) 3. **Builder観測**: resolve.try/choose と ssa.phi が dev‑only で取得可能 - 環境変数: `HAKO_DEBUG_*` 4. **表示API統一**: QuickRef/ガイドが `str()` に統一 - 実行挙動は従前と同じ(互換性維持) 5. **Selfhost Compiler(dev限定)**: ```bash HAKO_JSON_ONLY=1 ./target/release/hakorune \ apps/selfhost-compiler/compiler.hako -- --stage3 # 互換: compiler.nyash も受理 ``` → JSON ヘッダ(`{"version":…, "kind":…}`)を出力(非空) 6. **ブートストラップ成功**: ```bash # c0(Rustコンパイラ)→ c1(Hakoruneコンパイラ) ./target/release/hakorune apps/selfhost-compiler/compiler.hako \ -- input.hkr > output.json # c1 → c1'(自己コンパイル) ./target/release/hakorune selfhost/vm/boxes/mir_vm_min.nyash \ -- output.json ``` 補足(Branding/Flags の整理) - 設定ファイルは `hako.toml` を優先(互換: `nyash.toml`/`hakorune.toml`)。 - プラグイン仕様は `hako_box.toml` を優先(互換: `nyash_box.toml`)。 - 環境変数の公式前置詞は `HAKO_*`(互換: `HAKU_*`/`HRN_*`/`NYASH_*`)。 ## 📋 **実装タスクリスト(小粒・段階的)** ### **Phase 1: Hakoruneコンパイラ基本強化(Week 1-2)** 1. **branch/jump最小生成実装**(2日) - ファイル: `apps/selfhost-compiler/boxes/mir_emitter_box.nyash` - 目標: if/loop の制御フローを JSON v0 で正しく出力 - 検証: Rust VM で実行して期待値一致 2. **LocalSSA.ensure_cond最終化**(1日) - ファイル: `apps/selfhost-compiler/builder/ssa/local.nyash` - 目標: 条件分岐前の材化コピー完全動作 - 検証: compare/branch の組み合わせテスト 3. **基本構文完全対応**(4日) - if/else(完了✅) - loop(実装中🔄) - call/method(実装中🔄) - new/me(計画📝) ### **Phase 2: Hakorune VM拡張(Week 2-3、並行可能)** 4. **M4: ループサポート**(3日) - ファイル: `selfhost/vm/boxes/mir_vm_min.nyash` - 目標: loop命令の実行 - 検証: 累積計算テスト 5. **M5: Box操作サポート**(2日) - new/field access/method call - 検証: StringBox/ArrayBox基本操作 6. **M6-M7: プラグインBox対応**(2日) - FileBox/PathBox統合 - 検証: パリティテスト全PASS ### **Phase 3: 統合+ブートストラップ(Week 4)** 7. **統合テスト**(3日) - Hakoruneコンパイラ + Hakorune VM連携 - JSON v0 完全出力確認 - スモークテスト整備 8. **ブートストラップ達成**(4日) - c0→c1コンパイル成功 - c1→c1'自己コンパイル成功 - パリティテスト合格 ## 🔧 **開発環境・ツール** ### **スモークテスト実行** ```bash # quick プロファイル(全体) tools/smokes/v2/run.sh --profile quick # セルフホスティング関連のみ tools/smokes/v2/run.sh --profile quick --filter "selfhost_*" # Hakorune VM テスト tools/smokes/v2/run.sh --profile quick --filter "selfhost_mir_m*" ``` ### **手動テスト** ```bash # Hakoruneコンパイラ実行 ./target/release/hakorune apps/selfhost-compiler/compiler.hako \ -- --stage3 sample.hkr > output.json # Hakorune VM実行 ./target/release/hakorune selfhost/vm/boxes/mir_vm_min.nyash \ -- output.json # Rust VM比較 ./target/release/hakorune --backend vm sample.hkr ``` ### **デバッグ用環境変数** ```bash # 詳細診断 HAKO_CLI_VERBOSE=1 # MIR出力 HAKO_VM_DUMP_MIR=1 ./target/release/hakorune --dump-mir program.hkr # JSON IR出力 ./target/release/hakorune --emit-mir-json debug.json program.hkr # セルフホスト専用 HAKO_JSON_ONLY=1 # JSON のみ出力 HAKO_COMPILER_TRACK=1 # コンパイラトラック有効化 ``` ## 🎊 **Phase 15.7完了の意義** ### **技術的成果** 1. ✅ **完全なセルフホスティング達成** - Hakoruneで Hakorune をコンパイル - 外部コンパイラ依存からの完全解放 2. ✅ **教材として最高の価値** - コンパイラ実装: `apps/selfhost-compiler/` 全体 - Hakorune VM実装: `selfhost/vm/boxes/mir_vm_min.nyash` - 完全な理解が可能な規模 3. ✅ **保守性の革命** - Hakorune でコンパイラを書く → 誰でも改造可能 - MIR 13命令 → 究極のシンプルさ - Everything is Box哲学の完成 ### **次のマイルストーン(Phase 16)** - 最適化パス追加(デッドコード削除、インライン化) - エラーメッセージ改善 - LLVM バックエンド完全統合 - ネイティブバイナリ生成(EXE化) ## 📚 **関連ドキュメント** ### **Phase 15シリーズ** - [Phase 15: セルフホスティング全体計画](../phase-15/README.md) - [Phase 15.5: Core Box統一](../phase-15.5/README.md) - [Phase 15.6: MIR Call革新](../phase-15.6/README.md) ### **実装ガイド** - [セルフホスティング戦略 2025年9月版](../phase-15/implementation/self-hosting-strategy-2025-09.md) - [LLVM EXE生成戦略](../phase-15/implementation/llvm-exe-strategy.md) ### **言語リファレンス** - [Quick Reference](../../../../reference/language/quick-reference.md) - [完全言語仕様](../../../../reference/language/LANGUAGE_REFERENCE_2025.md) - [MIR命令セット](../../../../reference/mir/INSTRUCTION_SET.md) ## 🌟 **結論** **「VM層も一緒に作った方が楽」 = 絶対YES!✨** 理由: - ✅ 相互検証で品質向上 - ✅ デバッグ容易 - ✅ 完全な理解 - ✅ 教材として最高 - ✅ セルフホスティング直結 **推奨**: コンパイラとHakorune VMを並行開発!4週間でセルフホスティング達成! --- 背景(技術詳細) - Instance→Function 正規化の方針は既定ON。Known 経路は関数化し、VM側は単純化する。 - resolve.try/choose(Builder)と ssa.phi(Builder)の観測は dev‑only で導入済み(既定OFF)。 - Hakorune VM は M2/M3 の代表ケースを安定化(パス/境界厳密化)。 - VM Kernel の Ny 化は後段(観測・ポリシーから段階導入、既定OFF)。 優先順(2025‑09‑29 リバランス / 2025‑10‑04 反映) - P0: Rust VM 層の安定化(既存バグの点修正・回帰防止) - 受け手推定・RouterPolicy・LocalSSA/材化・VarMapGuard 等の補強を優先(quick/integration 常緑)。 - P1: Hakorune VM 仕上げ(完了) - M2/M3 の代表+エッジスモークを quick に追加し、単一パス+厳密セグメントで緑維持。 - P2: Nyash コンパイラ MVP(Phase 15.6)の前進(次の主作業) - 既存 `apps/selfhost-compiler/compiler.hako` を軸に、Stage‑2/3 入力から JSON v0 を安定排出(.nyash は後方受理)。 - 受け入れ(dev限定): `NYASH_JSON_ONLY=1` で `version/kind` を含む JSON ヘッダが非空であること。 - 既定挙動は不変。コンパイラは別アプリ(apps/)として進め、VM/LLVM 本線は影響最小。 - 直近 TODO: branch/jump 最小生成+LocalSSA.ensure_cond の材化コピー最終化、Hakorune VM 代表追加1件。 - P3: Known/Rewrite 統合 Stage‑1 の仕上げ(dev観測) - 仕様は不変のまま、観測(resolve.try/choose / ssa.phi)と関数化の一貫性を高める。 - P4: NYABI Kernel 下地の維持(未配線・既定OFF) Compiler Track(大規模変更の部分解禁 — apps/selfhost-compiler/ 限定) - 目的: Selfhost Compiler を段階的に実用化。Core(src/)は引き続き安定運用。 - ガード: - 既定OFFのフラグ/引数(例: `NYASH_COMPILER_TRACK=1`, `--min-json`, `--emit-mir`)。 - quick/integration 常緑を維持。影響は Selfhost 実行時に限定。 - 受け入れ(dev): - `NYASH_JSON_ONLY=1 ... --min-json` で JSON ヘッダ非空。 - `--emit-mir` で最小 MIR(JSON v0)(const→ret)を生成可能。 Unified Call(開発既定ON) - 呼び出しの統一判定は、環境変数 `NYASH_MIR_UNIFIED_CALL` が `0|false|off` でない限り有効(既定ON)。 - メソッド解決/関数化を `emit_unified_call` に集約し、以下の順序で決定: 1) 早期 toString/stringify→str 2) equals/1(Known 優先→一意候補; ユーザーBox限定) 3) Known→関数化(`obj.m → Class.m(me,…)`)/一意候補フォールバック(決定性確保) - レガシー側の関数化は dev ガードで抑止可能: `NYASH_DEV_DISABLE_LEGACY_METHOD_REWRITE=1`(移行期間の重複回避) スコープ(やること) 1) Builder: Known 化 + Rewrite 統合(Stage‑1) - P0: me 注入・Known 化(origin 付与/維持)— 軽量PHI補強(単一/一致時) - P1: Known 経路 100% 関数化(obj.m → Class.m(me,…))。special は `toString→str(互換:stringify)/equals` を統合 - 観測: resolve.try/choose / ssa.phi を dev‑only で JSONL 出力(既定OFF)。`resolve.choose` に `certainty` を付加し、KPI(Known率)を任意出力(`NYASH_DEBUG_KPI_KNOWN=1`, `NYASH_DEBUG_SAMPLE_EVERY=N`)。 2) 表示APIの統一(挙動不変) - 規範: `str()` / `x.str()`(同義)。`toString()` は早期に `str()` へ正規化 - 互換: `stringify()` は当面エイリアスとして許容 - QuickRef/ガイドの更新(plus混在の誘導も `str()` に統一) 3) Hakorune VM(MirVmMin)安定化(devのみ) - 厳密セグメントによる単一パス化、M2/M3 代表スモーク常緑(const/binop/compare/branch/jump/ret) - パリティ: VM↔LLVM↔Ny のミニ・パリティ 2〜3件 4) NYABI(VM Kernel Bridge)下地(未配線・既定OFF) - docs/abi/vm-kernel.md(関数: caps()/policy.*()/resolve_method_batch()) - スケルトン: selfhost/vm/boxes/vm_kernel_box.nyash(policy スタブ) - 既定OFFトグル予約: NYASH_VM_NY_KERNEL, *_TIMEOUT_MS, *_TRACE 非スコープ(やらない) - 既定挙動の変更(Rust VM/LLVMが主軸のまま) - PHI/SSAの一般化(Phase 16 で扱う) - VM Kernel の本配線(観測・ポリシーは dev‑only/未配線) リスクと軽減策 - 性能: 境界越えは後Phaseに限る(本Phaseは未配線)。Hakorune VMは開発補助で性能要件なし。 - 複雑性: 設計は最小APIに限定。拡張は追加のみ(後方互換維持)。 - 安全: すべて既定OFF。Fail‑Fast方針。再入禁止/タイムアウトを仕様に明記。 受け入れ条件(Acceptance) - quick: Hakorune VM(M2/M3)代表スモーク緑(const/binop/compare/branch/jump/ret) - integration: 代表パリティ緑(llvmlite/ハーネス) - Builder: resolve.try/choose と ssa.phi が dev‑only で取得可能(NYASH_DEBUG_*) - 表示API: QuickRef/ガイドが `str()` に統一(実行挙動は従前と同じ) - Unified Call は開発既定ONだが、`NYASH_MIR_UNIFIED_CALL=0|false|off` で即時オプトアウト可能(段階移行)。 - Selfhost Compiler(dev限定・任意ゲート): - `NYASH_JSON_ONLY=1 ./target/release/nyash apps/selfhost-compiler/compiler.hako -- --stage3` が JSON ヘッダ(`{"version":…, "kind":…}`)を出力(非空)。 実装タスク(小粒) 1. origin/observe/rewrite の分割方針を CURRENT_TASK に反映(ガイド/README付き) 2. Known fast‑path の一本化(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 ロールバック方針 - Hakorune VMの変更は 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 - Hakorune VM: selfhost/vm/boxes/mir_vm_min.nyash - スモーク: tools/smokes/v2/profiles/quick/core/ 更新履歴 - 2025‑10‑06 v3(本版): "Mini-VM" → "Hakorune VM" ブランディング統一、進捗反映(85-90%完成) - 2025‑09‑28 v2: Known 化+Rewrite 統合(dev観測)、表示API `str()` 統一、Hakorune VM 安定化へ焦点を再定義 - 2025‑09‑28 初版: Hakorune VM M3 + NYABI下地の計画 ## ステータス(2025‑09‑28 仕上げメモ) - M3(compare/branch/jump): Hakorune VM(MirVmMin)が厳密セグメントの単一パスで動作。代表 JSON 断片で compare(Eq)→ret、branch、jump を評価。 - 統合スモーク: integration プロファイル(LLVM/llvmlite)は PASS 17/17(全緑)。 - ルータ/順序ガード(仕様不変): - Router: 受信者クラスが Unknown のメソッド呼び出しは常にレガシー BoxCall にフォールバック(安定性優先・常時ON)。 - Router(補足): `InstanceBox × {length,len,substring,indexOf,lastIndexOf}` は Unified に固定し、`StringBox` 正規化へ導く(VM救済に依存しない)。 - BlockSchedule: φ→Copy(materialize)→本体(Call) の順序を dev‑only で検証(`NYASH_BLOCK_SCHEDULE_VERIFY=1`)。 - LocalSSA: 受信者・引数・条件・フィールド基底を emit 直前で「現在のブロック内」に必ず定義。 - VM 寛容フラグの方針: - `NYASH_VM_TOLERATE_VOID`: dev 時の救済専用(quick テストからは除去)。 - Router の Unknown→BoxCall は常時ON(仕様不変・安定化目的)。 ## 次のTODO(短期) - Rust VM 安定化(点補修の仕上げ) - 既知箇所の観測を最小ONで確認(必要時のみ)。 - json_query_vm(VM): LocalSSA/順序の取りこぼし補強(救済OFFで緑)。 - ループ PHI 搬送: header/合流の VarMapGuard 観測(break/continue を安定)。 - Hakorune VM M2/M3: 追加エッジ(複数compare/ret先頭/ゼロ除算/no‑retフォールバック)を quick で常緑(完了済)。 - Selfhost Compiler(dev): JSONヘッダ非空スモーク(任意ゲート)を準備。 ## Builder 小箱(Box 化)方針(仕様不変・段階導入) - S-tier(導入): - MetadataPropagationBox(型/起源伝播): `metadata/propagate.rs` - ConstantEmissionBox(Const発行): `emission/constant.rs` - TypeAnnotationBox(最小型注釈): `types/annotation.rs` - RouterPolicyBox(Unified vs BoxCall ルート): `router/policy.rs` - EmitGuardBox(emit直前の最終関所): `emit_guard/mod.rs` - NameConstBox(関数名Const生成): `name_const.rs` - A/B-tier(計画): - Compare/BranchEmissionBox、PhiWiringBox、EffectMask/TypeInferenceBox(Phase16以降) 採用順(小さく安全に) 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: loops(break/continue/loop_statement)→ PHI 搬送安定。 - P2: Hakorune VM(M2/M3)→ 代表4件 PASS、coarse 撤去・単一パス維持。 【2025-10-05 更新】Hakorune‑VM と箱の適用/WASM toolchain ゲート - Hakorune‑VM の配置と alias(段階移行) - 追加: `apps/hakorune/vm/boxes/hakorune_vm_min.hako` - `hako.toml` に `[modules] hakorune.vm.mir_min` を追加(旧 `selfhost.vm.mir_min` は1リリース alias 維持) - FlowRunner/dev サンプルの using を hakorune alias へ寄せ(印字は `run`、実行は `run_min`) - 箱(Box‑First)の導入と責務分解(薄い境界) - InstrDecoderBox: JSON v0 のオブジェクト走査(`InstructionScannerBox.next` 委譲) - ProgramStateBox: `regs/bb/prev_bb/steps` の状態管理(write 全面/read は段階導入中) - CfgNavigatorBox: ブロック head/tail と `index_of_from` を集約し、VM/Scanner から委譲 - RetResolverBox: `ret` 値決定を一本化(last_cmp 優先→regs→Fail‑Fast) - PhiWiringBox: Φ 適用の薄いラッパ(既存 apply に委譲) - DiagnosticsBox: 既定静音、`{"__dev__":1}` マーカーで `debug()` を有効化(将来 CLI→Box 橋渡し) - 実装ポイント(HakoruneVmMin) - `run_min` を標準入口に統一(`run` は印字付きアダプタ) - `ProgramStateBox` を regs/steps/bb/prev に導入(write 全面、read を段階拡大) - `CfgNavigatorBox` の head/tail、`index_of_from` へ呼び替え(重複排除) - `RetResolverBox.resolve` へ ret 判定を委譲(診断は Diagnostics に一元化) - スモーク(代表最小・増やしすぎ回避) - 追加: `hakorune_vm_m2_eq_true_vm.sh` - 追加: `hakorune_vm_m3_branch_true_vm.sh` / `..._branch_false_vm.sh` / `..._jump_vm.sh` / `..._jump_chain_vm.sh` / `..._phi_diamond_vm.sh` - Builder auto‑birth のクロスモジュール確認: `builder_autobirth_cross_module_{vm,alias}_vm.sh`(常時ONに寄せ) - using/[modules] の扱い - `hakorune.vm.mir_min` への alias 寄せを段階実施(selfhost.* は1リリース alias 維持) - E2E は代表1本に限定して確認(増やしすぎ回避) - WASM: llvmlite 制限の回避(オプトイン・フォールバック有) - `NYASH_LLVM_WASM_TOOLCHAIN=1` で `llc + wasm-ld` 経路を使用(既定OFF) - 追加エクスポートは `NYASH_WASM_EXPORTS="Main.main,main"`(既定で `ny_main`) - 失敗時は llvmlite `emit_object` にフォールバック(既定挙動は不変) - ドキュメント追記: `docs/guides/execution-modes-guide.md` にツールチェイン手順を追加 - 次の小粒 TODO(48h) - ProgramStateBox の read を残差2箇所で get 化(bb/prev_bb 一貫性) - CfgNavigatorBox への `index_of_from` 呼びを段階置換(VM 側の重複を削減) - CLI→DiagnosticsBox の DEV 橋渡し(起動時に dev マーカー注入) - hakorune_* の代表を1本だけ追加(compare→branch→phi entry の複合) 【2025-10-05 追記 2】DEV ブリッジと箱化の仕上げ(FlowRunner/CLI/スキャン統一/プラグイン検証) - DEV ブリッジ(CLI 主導) - CLI(Rust)で `NYASH_DEV_JSON_MARKER=1` の時、MIR JSON 出力に `{"__dev__":1}` を付与(`src/runner/mir_json_emit.rs`)。 - FlowRunner は注入を既定OFFにし、将来用の薄い導線 `_maybe_inject_dev_marker(j, ast_json)` を追加。 - AST JSON 側に `{"__cli_dev__":1}` が含まれる時のみ `{"__dev__":1}` に正規化(既定は未使用)。 - HakoruneVmMin は `{"__dev__":1}` を検出して DiagnosticsBox.debug を有効化(既定静音)。 - ProgramStateBox の read を debug/trace でも統一 - `bb/prev_bb` は ProgramStateBox から取得(write/read の一貫化)。 - 情報系ログは DiagnosticsBox.debug(DEVのみ)に寄せ、[ERROR]のみ従来出力。 - CfgNavigatorBox 委譲の仕上げ(ホットパス外から) - InstructionScannerBox に加え、MiniVmScan(selfhost/common)側でも `index_of_from` を委譲。 - JSON スキャン系の重複ロジックを段階的に削減(性能影響は最小)。 - プラグイン birth 仕様の固定(E2E) - 既存: `plugin_birth_e2e_vm.sh`(明示 birth の冪等)、`plugin_no_birth_nop_vm.sh`(no‑birth は no‑op)。 - 追加: `plugin_autobirth_e2e_vm.sh`(new→method の auto‑birth)。 - 追加(opt‑in): `userbox_birth_idempotent_vm.sh`(二回目 birth が no‑op、パーサ制約のためゲート付与)。 — この先(セルフホスティングに向けた大まかな計画) 1) コンパイラ最小ルートの完成(Ny→JSON v0→MIR(JSON v0)) - Stage‑1: AST→JSON v0 の出力見直し(UsingResolverBox の導入、prelude 安全)。 - Stage‑2: MIR(JSON v0) の最小命令(const/binop/compare/branch/jump/ret/phi)を安定排出。 - 代表ケース(const→ret/compare→ret/compare→branch→phi)で Hakorune‑VM 実行=緑。 2) VM/箱の仕上げ(薄い境界を維持) - ProgramStateBox: read 残差の完全移行(log/trace/観測点まで get 化)。 - CfgNavigatorBox: 依存箇所の委譲をもう一段だけ拡大(重複ロジックの排除)。 - RetResolverBox/DiagnosticsBox: 失敗系と観測の一元化(Fail‑Fast+DEV静音)。 3) DEV ブリッジの一本化 - 既定は CLI→MIR JSON emit で `{"__dev__":1}` を付与。 - FlowRunner の `_maybe_inject_dev_marker` は将来の AST 側からの橋渡し用(既定OFFのまま)。 4) スモーク/テスト(増やしすぎず代表性重視) - hakorune_*: m2/m3 の代表を1本ずつ(既存 eq_true / branch / jump / phi + 複合1本)。 - プラグイン系: auto/明示/no‑birth の3本で固定。userbox 冪等は opt‑in で補助。 5) ドキュメントとエコシステム - Phase‑15.7 の更新点を継続追記(箱の責務・導線・ゲート説明)。 - CI は quick 緑維持、重い/環境依存は opt‑in(ゲート付き運用)。 ## 2025-10-06 Update — 小粒前進(緑維持) 今回の着地(strict化+箱境界で安定化) - VM 再帰ガードの導入(tail fallback) - ModuleFunction の tail フォールバックで即時自己参照を Fail‑Fast(循環検出)。 - `NYASH_VM_REENTER_LIMIT` と併用して開発時の暴走を抑止。 - Wide フォールバックの停止(quick/integration/full) - `NYASH_VM_GLOBAL_TAIL_FALLBACK=0`、`NYASH_VM_MODULE_TAIL_WIDE=0` を各プロファイルの env に設定。 - strict 解決を既定に戻し、偶発的な再解決ループを構造的に遮断。 - EntryBox の導入と浸透(呼び名の安定化) - `selfhost.vm.entry` / `hakorune.vm.entry` を追加。スモークは EntryBox 経由に統一。 - 役割: 呼び名固定・解決バグ遮断・観測/契約の入口集約・差替え容易化。 - String/JSON スキャナの安定化(Ny 実装) - `StringScanBox.read_char` を自己再帰から正常実装へ修正、`find_quote` 追加。 - `JsonScanBox.seek_obj_end/seek_array_end` から文字列スキップに `find_quote` を使用。 - スモーク状況 - quick: selfhost m2/m3(eq_true/eq_false/branch/jump)・hakorune m2 eq true → PASS - integration: LLVM ハーネス 30/30 → PASS - full: suites/core(代表) → PASS 仕様/契約まわり(現状) - auto‑birth 既定(unbornのみ抑止)。instance.birth() 受理。birthは冪等。 - プラグイン birth 未定義は移行期 no‑op 合成(1リリース相当)。 - unborn Fail‑Fast(ユーザーBox)を既定ON(`NYASH_CHECK_CONTRACTS=1`)。 次アクション(Phase 15.7 継続・ブレークダウン) 1) VM: Throw terminator の最小対応とスモーク有効化(非到達側の PHI 除外は実装済み) 2) Resolver: [modules] もう1本 E2E 追加+ログ衛生(dev でのみ詳細) 3) Macro/call!: .hako 実装の堅牢化(ネスト・エスケープ)と自己ホストへの小規模導入拡張 4) Mini‑VM: binop/compare カバレッジ拡大と代表スモーク追加(ホットパスのログ抑制) 5) Lints: report→fail の段階移行(noise管理しつつ) 工数目安(合計 8〜16日) - Throw/PHI/LLVM/マクロ/Resolver 小粒を並列に、常に quick 緑を維持する方針。 参照 - EntryBox: `selfhost/vm/boxes/mini_vm_entry.hako`, `apps/hakorune/vm/boxes/hakorune_vm_entry.hako` - 環境: `tools/smokes/v2/configs/env/{quick,integration,full}.env` - スモーク: `tools/smokes/v2/profiles/quick/selfhost/*`, `tools/smokes/v2/profiles/integration/*`, `tools/smokes/v2/suites/core/*` 共通化(Compiler/VM 共有ポリシーの導入) - call_policy(Rust, `src/common/call_policy.rs`) - 即時循環判定(base名一致でFail‑Fast)と tail 候補生成を関数化。 - VM の Global/ModuleFunction の末尾一致系をこのポリシーで統一。 - 影響ファイル: `src/backend/mir_interpreter/handlers/calls/function.rs`(wide=OFF前提でも安定)。 - 次段(提案) - LifecycleContracts(birth/unbornの診断メッセージ・Fail‑Fast文言統一) - ExternCallRegistry(Timer.now_ms 等の外部呼び出し名→Externの一元化) - PhiCore(到達不能pred除外の判定を共有化、Bridge/VM/LLVM で共通ルールに) ### 2025-10-07 — Commonization (Lifecycle/Extern/Phi) - Added `src/common/lifecycle_contracts.rs`: unborn diagnostics + birth idempotence helpers. - Added `src/common/extern_registry.rs`: facade over MIR extern registry; builder routes check `exists()`. - Added `phi_core::common::is_unreachable_pred()` and routed builder to it. - VM now uses unified unborn guard/message and birth recording via common helpers. - Unit tests: unchanged count but quick run remains green. ## 🆕 Updates (2025-10-07) - CompareScanBox(v0/v1 正規化)を導入し、Hakorumne VM/自家製 Mini‑VM の compare 抽出を箱に一本化(残差も段階置換)。 - RetResolveSimpleBox を導入し、Mini‑VM の末尾フォールバック順を明示(last_cmp → ret解決 → first const)。 - with_usings E2E 緑化(dev / Module‑First): - VM 自動登録ブリッジ(NYASH_VM_AUTO_REGISTER_DIR_NS=1)を builder/ssa/.hako に拡張(Module‑First 時のみ)。 - UsingResolverBox に `upgrade_aliases()` を追加し、modules_map を使って alias→full ns に昇格(tail 一意)。 - PipelineV2.with_usings 入口で upgrade_aliases を呼び、NamespaceBox 正規化の前提を強化。 - Mini‑VM トレース導線(dev): - `__trace__=1` を JSON 先頭に置くと [DEBUG] を出力。`MiniVmEntryBox.run_trace(json)` が注入を補助。 - Docs: Namespace Quickstart に Mini‑VM Debugging を追記。 ### Next (small & safe) 1) Module‑First bridge の対象拡張(exports の広い拾い上げ)と失敗時診断(missing ModuleFunction)を1行で明示。 2) CompareScanBox の完全適用(Hakorumne 側 compare の残差置換)と最小スモークを1本追加。 3) with_usings の追加E2E(別 alias)を1本だけ quick に常設(過多回避)。 4) Mini‑VM Debug の独立ページ(docs/guides/mini-vm-debugging.md)を作成し、CLI/ENV/落とし穴(末尾数値の抽出)を記載。 ## Rust ↔ Selfhost Coverage (Gap Analysis) — 2025‑10‑12 What Rust has today (reference) vs What Selfhost has wired, and how we close the gaps in Phase 15.7. - MIR instruction coverage - Implemented (Selfhost Mini‑VM): const, binop(Add/Sub/Mul/Div/Mod), compare(Eq/Ne/Lt/Le/Gt/Ge), branch, jump, ret, copy, (early) phi apply/scan - Pending (Selfhost): load/store, typeop (is/cast), safepoint/barrier, throw/try, nop (no‑op semantics), unary (neg/not) — plan: P4/P5 small adapters, rc‑only smokes - Call shapes (builder/emitter → VM/LLVM) - Implemented: mir_call v1/v0 for Extern(Global op_eq), Constructor/Method (minimal), Global(print/JSON.stringify) E2E via v1→v0 adapter - Pending: BoxCall minimal parity, ModuleFunction tail normalize (strict), Method arities beyond size/indexOf/substring — plan: P4 thin adapters + SSOT arity table first - Registry/SSOT - Implemented: slots/arity/aliases SSOT at runtime (TypeRegistry), diagnostics unification - Pending: full SSOT for type resolution (type_id, box table), generator‑first flow — plan: promote SSOT to the sole source; keep static as fallback until green - Plugins (Provider/Handles) - Implemented: early provider load (nyash.toml), identity cache for PluginBox/HostHandle - Pending: full handle TLV coverage for map.values/keys in plugin impl, deterministic ordering policy (or tests made order‑agnostic) — plan: Stage‑2 host handle tests remain opt‑in - Using / Modules - Implemented: prelude merge, alias resolver, quick profile ON; opt‑in selfhost suite with gates - Pending: always‑on module aliases for selfhost.* in dev runner — plan: keep opt‑in to avoid CI drift; docs updated ### Next Steps (Phase 15.7 finalize) - P4 (adapters): wire NewBox/Call/Method helpers to shared MirSchema/BlockBuilder and keep output‑compatible; add 1–2 rc‑only smokes - P5 (LocalSSA): enable ensure_calls/ensure_cond mini; add 1 rc‑only smoke and un‑skip 1 M2/M3 target - SSOT: prefer SSOT for resolve_typebox_by_name everywhere; generate tables from specs at build time (static fallback remains) - Plugins: keep plugin‑on reps order‑agnostic; strict reps preflight build via plugin‑tester; keep SKIP on missing artifacts - Docs/Smokes: selfhost opt‑in env (SMOKES_SELFHOST_ENABLE / SMOKES_SELFHOST_M2M3_ENABLE) documented; CI defaults remain quick+integration‑core ## ✅ P4/P5 小結(2025‑10‑12) - P4(薄アダプタ直結) - emit_mir_flow(_map): extern/global/method/constructor を BlockBuilder 直結の薄アダプタに統一(出力互換) - emit_call/emit_method/emit_newbox(v0/v1): 内部を shared BlockBuilder 経由に寄せ、材化は LocalSSA に委譲 - 代表(rc-only): selfhost_pipeline_v2_p4_calls_rc_vm(Constructor/Method/Global/Extern の最小E2E) - P5(LocalSSA 最小) - ensure_materialize_last_ret(mod): ret 値の定義直後に copy を 1 本 - ensure_cond(mod): 全ブロック走査で branch の cond を検出→定義直後に copy を 1 本(If/Loop 両対応) - 代表(rc-only): selfhost_localssa_ensure_calls_rc_vm / _ensure_cond_rc_vm / _ensure_cond_if_loop_rc_vm - Pipeline(v1 経路) - MirCallBox 依存を Emit*(BlockBuilder 直結)に段階置換(差分最小) - plugin‑on の安定化 - quick の plugin_on_* を在庫プリチェック+preflight 失敗時 SKIP へ統一(常緑を維持) - SSOT(type/slot/arity/aliases) - specs/type_registry.toml を再スキャンし不足なしを確認。resolve_* は SSOT 優先(静的 fallback)で維持 - 状態: quick 288/288 PASS、integration‑core 20/20 PASS(環境依存は SKIP) ## 🧭 Backend と CLI 方針(単一 CLI, 複数バックエンド) - 単一 CLI: `hakorune` に集約し、`--backend {nyvm|rust|llvm}`(`HAKO_BACKEND`)で切替 - バックエンド実体: - `hakorune-vm`(Ny 製 Mini‑VM): MIR(JSON v0) 直実行、自己ホスト検証用 - `hakorune-rust`(Rust VM/Runtime): 既定の実用ライン(動的プラグイン/完全実行) - `hakorune-llvm`(LLVM ライン): llvmlite ハーネス / AOT(将来 `hako-llvmc`) - コンパイラーは分離: `hakorune-compiler`(selfhost/pipeline_v2)。dev ではバンドル起動を opt‑in で提供 - 互換: `NYASH_*` は `HAKO_*` のエイリアス受理(docs 表記は HAKO を第一) ## 🔧 ツール解決ポリシー(CLI→ツールのパス解決) - 優先順: dist/bin → workspace(tools/*, target/*)→ hako.toml [tools]/[backends] → ~/.config/hakorune/config.toml → ENV(HAKO_TOOL_PATHS, 個別変数)→ PATH →(任意)autobuild - オプション/ENV: - `--llvm-harness`/`HAKO_LLVM_HARNESS`, `--plugin-tester`/`HAKO_PLUGIN_TESTER`, `HAKO_TOOL_PATHS`, `--autobuild-tools` - 診断: `hakorune --which `(最終解決パス表示), `--doctor tools`(在庫レポート) - plugin‑on の代表は在庫なしで SKIP(前検あり)に統一 ## 🛣 次の段階(hakorune‑vm を Rust VM 同等へ) - Phase‑A(安定化小結) - JSON MIR v0 Reader の CLI 昇格(dev ゲート撤去) - LocalSSA: ensure_after_phis_copy の代表を 1 本追加(If/Loop) - Phase‑B(機能差分の吸収) - Stage‑3: break/continue/throw/try の最小実装(自己ホスト側 emit→VM) - Map plugin: 値の handle(PluginHandle/HostHandle)対応と identity スモーク - Phase‑C(仕上げ) - SSOT を型解決ホットパスに全面適用(静的は保険) - 診断の直書き掃除(helpers 統一) - 受け入れ基準(同等の目安) - quick 288/288 緑(在庫依存は SKIP) - integration‑core 20/20 緑 - selfhost M2/M3(opt‑in)代表緑 - plugin_on_*(在庫あり)代表 PASS、診断文言は安定 ## 🧱 nyvm の実体と Mini‑VM 凍結の方針(2025‑10‑12) - nyvm の実体 - CLI `--backend nyvm` は Hakorune VM(selfhost/hakorune‑vm/*)にマップする方針。 - Mini‑VM(selfhost/vm/*)は dev/教育用のサンドボックスとして温存(rc‑only/opt‑in)。 - Mini‑VM の扱い - selfhost/vm に DEPRECATED マーカーを追加(新機能追加を抑制)。 - スモークは rc‑only とし、既定は OFF。Hakorune VM の成長を阻害しない。 - 受け入れ(切替の前段) - quick/integration 緑維持、selfhost M2/M3 緑。 - plugin‑on(在庫あり)代表 PASS。診断は helpers 統一。 ## 【2025-10-12 追記】Mir IO 一本化と HostBridge 設計 - MirIoBox(Phase A) - Hako 側に `MirIoBox` を追加。`validate/functions/blocks/instructions/terminator` の最小 API を提供。 - nyvm ブリッジが function オブジェクトのみを渡す narrow JSON も許容(bridge 実用性優先)。 - VM コアは run() 先頭で `MirIoBox.validate` を呼び構造エラーを Fail‑Fast。 - スモーク: `terminator_whitespace_vm`(op 後空白差)、`entry_nonzero_vm`(entry≠0 開始)を quick-selfhost に追加。 - HostBridge(設計) - 目的: プラグイン(動的)と埋め込み(静的)を同じ ABI で呼び出す一本化レイヤ。 - 方針: `HostBridgeBox.{box_new,box_call,extern_call}` の3関数に最小化。TLV で引数/戻り値を統一。 - 解決: `UnifiedRegistry` にて Spec(hako_box.toml or 生成SSOT)と Invoker(PluginLoaderV2/Provider)を集約。 - ルート: `HAKO_PLUGIN_POLICY=off|auto|force`(auto=プラグイン優先→無ければ静的)。 - 最初の疎通: FileBox.open/read(両経路で同形に動作)。 - 次の実装 - run.sh の backend 正規化(空/"."/未知→vm)でスモークからノイズを根治。 - MirIoBox.validate に terminator 必須・参照妥当性の検証を集約(dev 緩和は ENV)。