Files
hakorune/docs/private/roadmap/phases/phase-15.7

Phase 15.7: セルフホスティング実現への道筋 - Hakoruneコンパイラ完成計画

Branch Note (selfhost)

  • このブランチでは CLI バイナリ名は hako だよ。本文中の hakorune/nyashhako に読み替えて実行してね。
  • 環境変数は HAKO_*/HAKU_*/HRN_*NYASH_* と相互エイリアス自動マップなので、そのまま使ってOK。

🎯 Phase 15.7の真の目的

「Hakorune で Hakorune をコンパイルする」完全なセルフホスティングの実現

🎯 First GoalMilestone 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 — SelfRebuild

  • 目的: 生成した自己ホストコンパイラ EXE で compiler.hako を解析し、Stage1 JSON を出力できること
  • 受け入れ: EXE の標準出力1行目が "kind":"Program" を含む
  • スモーク: tools/smokes/v2/profiles/quick/selfhost/selfhost_rebuild_vm.shLLVM未導入時は自動SKIP

🎯 Milestone M3 — E2E ParityVM ↔ LLVM, selfhost compiler

  • 目的: ランナーから子プロセスに selfhost compiler を使い、VM/LLVM の結果が一致する
  • 受け入れ: 代表サンプルconst_ret 等)で Result: 行が一致
  • スモーク: tools/smokes/v2/profiles/quick/selfhost/selfhost_e2e_vm_llvm.shLLVM未導入時はVMのみ通過

🧱 Baseline → Selfhost → Legacy Removal段階

  • Baseline本ドキュメントの前段
    • デフォルト: 最小 Kernel 埋め込み、Plugins 既定OFFオプトイン
    • 解決順: User > Plugin > Kernel
    • ドキュメント: docs/guides/kernel-plugin-baseline.md, docs/guides/build-runtime-defaults.md
  • SelfhostM1 以降)
    • M2計画: 生成 EXE で compiler.hako を再ビルド → JSON ヘッダ/簡易 MIR を比較
    • M3計画: VM/LLVM の E2E 差分ゼロ(代表アプリ 1 本)
  • Legacy RemovalM*
    • 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 緑
  1. Stage1 JSON の早期経路固定quiet/--min-json
  • quiet/--min-json では AST プレリュードマージをスキップ容認(エラーにしない)
  • main(args) に CLI script args を渡す(-- の後を JSON 経由で注入)
  • 受け入れ: selfhost_min_json_header_vm PASS
  1. MIR ローアの段階実装(最小→分岐/PHI
  • Return/Const → BinOp → Compare → Branch/Jump → PHI の順に有効化
  • JSON v0 Bridge の到達不能 pred 除外を統一return/throw
  • 受け入れ: selfhost_mir_m2_*eq_true/eq_false/compareを順に UNSKIP→緑
  1. Hakorune VM 箱化ラインの安定化
  • InstructionScannerBox/OpHandlersBox に一本化(無限ループ対策・観測の集約)
  • Arithmetic/Compare の委譲(小さな共通箱へ移譲)
  • 受け入れ: m2/m3 代表branch/jump/phi
  1. using/[modules] のE2EAST OFFでも登録維持
  • modules 登録は quiet でも常時維持AST マージはスキップ可)
  • 受け入れ: using_modules_alias_vm / using_modules_rune_host_vm PASS
  1. LLVM 連結ラインの最小安定化AOT/ハーネス)
  • hako_kernel に最小シンボルを追加string.concat_{ss,si,is} / console.* / readline
  • 最小セマンティクスはフラグ NYASH_HAKO_MIN_SEM=1 でON既定OFF
  • 受け入れ: 代表ベンチのリンク成功・終了コード一致(ハーネス or AOT
  1. スモーク整備quick → integration
  • selfhost_min_json_header_vm / selfhost_mir_m2_* / pipeline_v2_* / json_native roundtrip を quick に集約
  • 受け入れ: quick 全緑、integration 代表緑
  1. 性能・回収(ホット箇所のみ)
  • 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} を表示。
    • ModuleFirst 運用時の意図が出力から一目で分かるようにしたdev UX
  • Strict 診断テンプレusing/modulesをガイド化

    • NYASH_USING_CHECKS_STRICT=1 時に 1 行で安定出力:
      • MissingDep: workspace missing dependency: <module> → <dep> (<req>)
      • Conflict: workspace namespace conflict: <ns> has multiple paths: <p1,p2,...>
    • 併せて JSON 診断({"kind":"modules_error",...})も出すが、テストは 1 行文字列で安定比較可能。
  • Throw/PHI の Builder 側の扱い修正JSON v0 経路)

    • Match の thenarm が Throw で終わる場合、PHI 入力と merge ジャンプを抑止(到達不能の入力を除外)。
    • 受け入れ: json_v0_match_throw_phi_vm.sh を常時ON化し、Result: 7 を確認else のみが PHI に来る)。
  • Stage1JsonScannerBox の適用拡大(取りこぼし減)

    • 早期経路Call/Methodextract_name_args を使う軽量フォールバックを追加。微妙な JSON 差異にも耐性。
  • Macro 子プロセスの隔離(テスト/開発)

    • 子に NYASH_SKIP_TOML_ENV=1 / NYASH_USING=0 を注入してプロジェクト TOML/using の影響を遮断。ガイドへ追記。

既に実装済み(堅固な基盤)

  • Rustコンパイラ: 完全実装・安定動作Phase 1-14
    • Parser完全実装
    • AST生成完全
    • MIRビルダー完全
    • 3バックエンド実装
      • Rust VM712行、開発・デバッグ用
      • Python LLVM/llvmlite1,456行、本番・最適化用
      • PyVM1,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
      • 📋 詳細設計 - 全体像・Boxes・制約
      • 📦 実装 - ExecutionPipelineBox/BackendBox/MirBuilderBox
      • 🔧 契約 - インターフェース仕様
      • 🧪 スモーク - 受け入れテスト

未完成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-VMapps/hakorune/vm/boxes/hakorune_vm_min.hako互換: selfhost/vm/boxes/mir_vm_min.hako
    ↓ 実行
Rust VMsrc/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: HakoruneVM 仕上げ(完了

  • 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
  • Stage1 抽出器を負数/空白に寛容化。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.hakoemit-only 入口)
    • 追加: apps/selfhost/vm/flow_runner.hakoHakorune VM 実行薄箱)
    • 役割分離: emit は selfhost-compiler 配下、実行は selfhost/vm 配下(箱境界)
  • LocalSSA 材化ポリシーの統一
    • ensure_callscall/method/newensure_condbranch condともに「PHI直後に copy 挿入」に統一
    • JSONテキスト整形で挙動不変・FailFast未対応形は無変更
  • 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 は未解決エラーFailFast
  • CLI: --emit-mir-json をグローバル早期ゲートに(バックエンド非依存)
    • どの backend 指定でも、パース→MIR→JSON 書き出し→即終了
    • ベンチWASM パイプラインの自動化に利用
  • 工具: WASM 一括スクリプトを追加
    • tools/build_and_run_wasm.sh.nyash → MIR(JSON) → WASM → 実行/exit code
    • 依存: python3+llvmlite, nodewasm_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_vmEXEで自分自身を解析、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 時に FailFast
  • plugins profile の最小LLVM交差を追加軽量・常時ON
    • plugin_parity_min_vm_llvmVM/LLVM最小一致の検査
  • WASM PhaseA を開始(ベンチ準備の最小実装)
    • ArrayBox: len/get/set/push/clear をコード生成固定cap=8、OOB=0
    • WAT生成スモークを追加autoSKIPつき:
      • 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=1NYASH_* 互換)。
    • 参照: src/runtime/type_registry.rs:66, src/runtime/type_registry.rs:312
  • 診断の一元化arity/unknownslot 等)
    • ルーター側の直書き文言を diagnostics::msg に統合し、FailFast メッセージの安定性を向上。
    • 参照: 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 integrationcore の小セット5〜8本を代表で常時、フル20本は任意。
      • 実行: tools/smokes/v2/run.sh --profile integration-core
    • SSOT バリデータ(編集時に任意で実行)
      • ./tools/check_ssot_table.shname→slot 多重割当/重複の検出)

🧭 MIR 生成ロードマップPhase 15.7

目的

  • Rust 側の MIR 生成Builder/Emitterを“箱言語側selfhost compiler”へ段階移行し、Rust 側は JSON 受け口に縮退。
  • 既定の意味論は不変FailFast 強化は可。VM/LLVM のパリティを維持したまま、自己ホスト化の歩幅を刻む。

境界と原則BoxFirst

  • 生成面Builder/Emitter: selfhost/compiler/pipeline_v2/ 配下EmitMirFlow/Map 等)。
  • 実行面VM/LLVM: 既存の Rust VM と llvmlite ハーネス。
  • 意味論の確定点:
    • Eq/Ne は Extern("nyrt.ops.op_eq") に統一Builder 正規化)。
    • メソッド呼出は SSOTspecs/type_registry.tomlの slot/arity に依存。
  • 失敗ポリシー: FailFast静かなフォールバックは禁止

段階計画P1→P5

  • P1最小ブート
    • 対象: const/ret、compare→branch/jump→ret。
    • 実装: EmitMirFlow(Map) を活用して 1関数1エントリ CFG を生成。Phi は不要(簡易ダイアモンド)。
    • 受け入れ:
      • quick: selfhost_emit_mir_min_rc_vmrconly緑。
      • integrationcore: 既存 parity セットconst_ret/compare/branch緑。
  • P2
    • 対象: binop+,-,*,/,%と単項neg,not,bitnot最小。
    • 受け入れ: integrationcore の算術代表がVM/LLVM一致。
  • P3呼出
    • 対象: Call/Method/Extern の最小統一Extern は registry/generated を参照)。
    • 受け入れ: op_eq primitives/reflexive の代表が Builder→VM/LLVM で一致。
  • P4NewBox: Core Collections
    • 対象: ArrayBox/StringBox/MapBox の最小 newbirth は Runner/VM 規約に従う)。
    • 受け入れ: quick のコレクション最小ケース rconly 緑。
  • P5整形/材化)
    • 対象: LocalSSA ensure_cond/ensure_calls の最小適用(未定義形は FailFast
    • 受け入れ: 既存の LocalSSA スモーク rconly 緑。

ゲート/フラグ(既存の活用)

  • 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=1quiet 受理)
    • 既定はOFF。quick の代表は rconly で常時OK。

SSOT 連動

  • slots/arity/aliases は specs/type_registry.toml を SSOT とし、Builder 参照は SSOT に統一(静的表は互換 fallback
  • type_id も SSOT→config→既定の優先で参照既に Runtime 実装済)。

テスト/スモーク方針

  • quick: rconly を基本(本文依存を避ける)。
  • integrationcore: VM/LLVM パリティは既存代表を利用5〜8本。段階追加は最小限。
  • pluginon: 代表1本のみ常時rconly。広いE2Eは optin。

ロールバック/安全策

  • 生成経路の切替は環境フラグでいつでもOFFに戻せる構成を維持。
  • FailFast は既定ON。問題時は quick を崩さずに段階差し戻しが可能。

完了定義Phase 15.7 時点)

  • P1〜P3 が緑、P4 は最小 new が通る、P5 は ensure_cond の最小が効く。
  • quick 全緑rconly代表を含む、integrationcore 全緑。

進捗20251012 現在)

  • 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 代表rconly: selfhost_emit_mir_min_rc_vm が常時緑
  • P2 準備完了binop/loop 最小)

    • BlockBuilder に binop/loop_counter を追加し、emit 経路から利用開始
    • quick 代表rconly: 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 代表rconly: selfhost_pipeline_v2_op_eq_vmtrueselfhost_pipeline_v2_op_eq_false_vmfalseを追加
  • P3 追加Global/Method/Constructor E2E

    • v1→v0 変換(MirJsonV1Adapter.to_v0)→ --json-file 実行のE2E代表を追加rconly
      • Global(print): selfhost_mircall_global_print_e2e_vm副作用は無視。ret 0でrcのみ検証
      • Constructor+Method(size): selfhost_mircall_ctor_method_e2e_vmArrayBox.size
      • Global(JSON.stringify): selfhost_mircall_global_json_stringify_e2e_vmNYASH_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のまま
    • 既定: OFFPhase 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_watapps/benchmarks/wasm/basic/*.hako 一括)
  • ENV/プロファイルの整理(迷いの削減)

    • HAKO_PLUGIN_POLICY=auto を主。NYASH_* は互換
    • Stage2HostHandle Arrayは profile 限定でON

受け入れ(更新)

  • quick: parity_* + M2代表 + plugin identity1本+ wasm WAT1本
  • plugins: identity2本+ 最小LLVM交差1本
  • provider digest が毎回表示、policy=forceは anchors=ok 必須
  • Hakorune VM の箱化・安定化(自己ホスト向け)
    • HakoruneVmMin: InstructionScannerBox.next + OpHandlersBox.handle_* 経由に統一。無限ループ対策/観測の集約を反映。
    • 共通箱の拡充: ProgramStateBoxbb/prev/steps, CfgNavigatorBoxindex_of_from/head/tail, RetResolverBoxret一元化, DiagnosticsBoxDEVでdebug
    • using/[modules]: aliashakorune.vm.mir_minを追加し、flow_runner などの呼び先を段階的に新別名へ統一。
  • JSON v0 Bridge の堅牢化
    • 到達不能 predreturn/throwを PHI incoming から除外する判定を unifyif/match両方
  • 文字列/数値ヘルパの重複解消
    • StringHelpersto_i64/int_to_str/json_quote/read_digitsへ委譲。JsonFrag/JsonScan/Compiler 側の重複を削減。
    • selfhost VM 補助の .nyash→.hako 統一(一部)。
  • WASM ABI スケルトンhandoff 用)
    • docs/guides/wasm-abi.md に最小ABInykernel.malloc/load_i64/store_i64と契約を記載。
    • crates/nykernel-wasmwasm32向けbump allocator + load/storeを追加ワークスペース未接続
    • hakorune-std/core/array.hako を追加extern_call一本化。VMでは NYASH_ENABLE_NYKERNEL_STUB=1 で開発スタブ稼働。
  • スモーク整備
    • noisy系は opt-in 化ゲート環境変数で明示ON
    • ArrayBox の最小E2Epush/get/resizeを quick に opt-in で追加VMスタブ

次の小粒Phase 15.7 継続)

  1. Stage1/2 最小 E2ENy→JSON→MIR(JSON)→Hakorune VMを代表3本で緑固定const→retcompare→retcompare→branch→phi
  2. UsingResolverBox/NamespaceBox を実装し、Pipeline V2 に統合Callee::ModuleFunction 正規化を前段で完了)。
  3. Hakorune VMProgramStateBox/CfgNavigatorBox の参照を全面 get 化(残差つぶし)+ 代表CFGdiamond/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 実装への依存を段階的に縮小。
  • BoxFirst 原則に従い、移植点を小箱の境界に分解して安全に前進。

優先度P112週— コンパイラ側apps/selfhost-compiler

  • Using/Namespace 解決(未完の中核)
    • 新規: UsingResolverBoxmodules/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 の併設)
  • 署名検証コンパイル時FailFastの拡張
    • SignatureVerifierBox を全発行点に適用
    • MethodRegistryBox のカバレッジ拡張toJSON/length 別名整理, startsWith/endsWith 等)

優先度P21週— VM 側apps/selfhost/vm, apps/hakorune/vm

  • Hakorune VM の箱化仕上げ
    • InstructionScannerBox/OpHandlersBox 採用の残差つぶし
    • ProgramStateBoxbb/prev/steps利用の全面化
    • CfgNavigatorBox.index_of_from への検索統一(残差)
  • PHI/Throw 周辺の最小意味論
    • 非到達 Throw の PHI 除外Bridge/Builder は済)
    • Throw は VM での最小 return 化(将来の例外伝播は別フェーズ)

優先度P31週— 共有ユーティリティ

  • 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 は後方受理)
  • 目標: Stage2/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. コンパイラー側 = これが残課題!🔥
// これを解析して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週間

    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日

    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 統合 Stage1 の仕上げ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.sh2回の 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)。
    • フロントBuilderTimerBox.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 はハーネス環境が無い場合 SKIPFailFast設計
  • 付記:
    • 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導入済み
  - MirJsonBuilderMinJSON v0生成
✅ FlowRunner/JsonProgramBox
  - FlowEntryBoxemit-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統合using3日
🔲 Hakorune VM命令拡張2週間
  - newbox2日・最重要
  - boxcall2日・最重要
  - phi2日
  - load/store2日
  - externcall1日
  - unaryop/typeop2日
🔲 セルフホストループE2E1週間

📅 進捗更新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_msCallee::ModuleFunction 正規化
    • スモーク: quick/selfhost/selfhost_namespace_box_basic_vm.sh
  • P2-C Pipeline V2統合using1日で完了、見積もり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.nyashalias維持

🔥 現在の最優先タスク

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/CUsing解決系完全実装
  ✅ 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命令拡張最後の砦
    - newbox2日・最重要
    - boxcall2日・最重要
    - phi2日
    - load/store2日
    - externcall1日
  🔲 セルフホストループE2E1週間

旧見積もり: 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. c0Rustコンパイラ→c1Hakoruneコンパイラ動作
  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.jsonJSON v0形式
  • 検証:
    ./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
  • 出力: 実行結果(標準出力/終了コード)
  • 検証:
    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
  • 自動化:
    # パリティテストスクリプト
    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/Cusing解決: 完了見積もりの9倍速
  2. P1-A/Bnewbox/boxcall: ← 今ココ! これだけでほとんどの.hakoが動く
  3. P1-C/D/Ephi/load/store/externcall: 完全動作に必要

🎯 具体的な実装提案

Option A: 並行開発(推奨

トラック1Hakoruneコンパイラ:

  • 担当: ChatGPT + Claude
  • 期間: 3週間
  • 成果: 完全なHakoruneコンパイラ
  • ファイル: apps/selfhost-compiler/

トラック2Hakorune VM拡張:

  • 担当: ChatGPT + Claude
  • 期間: 2週間
  • 成果: 完全な Hakorune VMM4-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 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 VMHakorune実装
    ↓ 実行
完全なセルフホスティング達成!🎉

🎯 受け入れ条件Acceptance Criteria

Phase 15.7完了基準

  1. quick プロファイル: 全緑維持96/96 PASS

    • Hakorune VMM2/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-onlyPhiHandler/ wiringfinalize
  • NYASH_JSON_SCHEMA_V1=1 — JSON v1mir_callを有効化shape 検証用)
  • NYASH_LLVM_DOWNGRADE_V1=1 — ハーネス出力時に v1→v0 ダウングレードcompile-only 安定化)
  • NYASH_VM_USE_PY=1 — PyVM 経路(開発/比較用)
  1. Builder観測: resolve.try/choose と ssa.phi が devonly で取得可能

    • 環境変数: HAKO_DEBUG_*
  2. 表示API統一: QuickRef/ガイドが str() に統一

    • 実行挙動は従前と同じ(互換性維持)
  3. Selfhost Compilerdev限定:

    HAKO_JSON_ONLY=1 ./target/release/hakorune \
      apps/selfhost-compiler/compiler.hako -- --stage3   # 互換: compiler.nyash も受理
    

    → JSON ヘッダ({"version":…, "kind":…})を出力(非空)

  4. ブートストラップ成功:

    # c0Rustコンパイラ→ c1Hakoruneコンパイラ
    ./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、並行可能

  1. M4: ループサポート3日

    • ファイル: selfhost/vm/boxes/mir_vm_min.nyash
    • 目標: loop命令の実行
    • 検証: 累積計算テスト
  2. M5: Box操作サポート2日

    • new/field access/method call
    • 検証: StringBox/ArrayBox基本操作
  3. M6-M7: プラグインBox対応2日

    • FileBox/PathBox統合
    • 検証: パリティテスト全PASS

Phase 3: 統合ブートストラップWeek 4

  1. 統合テスト3日

    • Hakoruneコンパイラ + Hakorune VM連携
    • JSON v0 完全出力確認
    • スモークテスト整備
  2. ブートストラップ達成4日

    • c0→c1コンパイル成功
    • c1→c1'自己コンパイル成功
    • パリティテスト合格

🔧 開発環境・ツール

スモークテスト実行

# 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*"

手動テスト

# 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

デバッグ用環境変数

# 詳細診断
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シリーズ

実装ガイド

言語リファレンス

🌟 結論

「VM層も一緒に作った方が楽」 = 絶対YES

理由:

  • 相互検証で品質向上
  • デバッグ容易
  • 完全な理解
  • 教材として最高
  • セルフホスティング直結

推奨: コンパイラとHakorune VMを並行開発4週間でセルフホスティング達成


背景(技術詳細)

  • Instance→Function 正規化の方針は既定ON。Known 経路は関数化し、VM側は単純化する。
  • resolve.try/chooseBuilderと ssa.phiBuilderの観測は devonly で導入済み既定OFF
  • Hakorune VM は M2/M3 の代表ケースを安定化(パス/境界厳密化)。
  • VM Kernel の Ny 化は後段観測・ポリシーから段階導入、既定OFF

優先順20250929 リバランス / 20251004 反映)

  • P0: Rust VM 層の安定化(既存バグの点修正・回帰防止)
    • 受け手推定・RouterPolicy・LocalSSA/材化・VarMapGuard 等の補強を優先quick/integration 常緑)。
  • P1: Hakorune VM 仕上げ(完了)
    • M2/M3 の代表+エッジスモークを quick に追加し、単一パス+厳密セグメントで緑維持。
  • P2: Nyash コンパイラ MVPPhase 15.6)の前進(次の主作業)
  • 既存 apps/selfhost-compiler/compiler.hako を軸に、Stage2/3 入力から JSON v0 を安定排出(.nyash は後方受理)。
    • 受け入れdev限定: NYASH_JSON_ONLY=1version/kind を含む JSON ヘッダが非空であること。
    • 既定挙動は不変。コンパイラは別アプリapps/として進め、VM/LLVM 本線は影響最小。
    • 直近 TODO: branch/jump 最小生成LocalSSA.ensure_cond の材化コピー最終化、Hakorune VM 代表追加1件。
  • P3: Known/Rewrite 統合 Stage1 の仕上げdev観測
    • 仕様は不変のまま、観測resolve.try/choose / ssa.phiと関数化の一貫性を高める。
  • P4: NYABI Kernel 下地の維持未配線・既定OFF

Compiler Track大規模変更の部分解禁 — apps/selfhost-compiler/ 限定)

  • 目的: Selfhost Compiler を段階的に実用化。Coresrc/)は引き続き安定運用。
  • ガード:
    • 既定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_CALL0|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 出力既定OFFresolve.choosecertainty を付加し、KPIKnown率を任意出力NYASH_DEBUG_KPI_KNOWN=1, NYASH_DEBUG_SAMPLE_EVERY=N)。
  2. 表示APIの統一挙動不変

    • 規範: str() / x.str()(同義)。toString() は早期に str() へ正規化
    • 互換: stringify() は当面エイリアスとして許容
    • QuickRef/ガイドの更新plus混在の誘導も str() に統一)
  3. Hakorune VMMirVmMin安定化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()
    • スケルトン: selfhost/vm/boxes/vm_kernel_box.nyashpolicy スタブ)
  • 既定OFFトグル予約: NYASH_VM_NY_KERNEL, *_TIMEOUT_MS, *_TRACE

非スコープ(やらない)

  • 既定挙動の変更Rust VM/LLVMが主軸のまま
  • PHI/SSAの一般化Phase 16 で扱う)
  • VM Kernel の本配線(観測・ポリシーは devonly/未配線)

リスクと軽減策

  • 性能: 境界越えは後Phaseに限る本Phaseは未配線。Hakorune VMは開発補助で性能要件なし。
  • 複雑性: 設計は最小APIに限定。拡張は追加のみ後方互換維持
  • 安全: すべて既定OFF。FailFast方針。再入禁止/タイムアウトを仕様に明記。

受け入れ条件Acceptance

  • quick: Hakorune VMM2/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 で即時オプトアウト可能(段階移行)。
  • Selfhost Compilerdev限定・任意ゲート:
  • 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 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

ロールバック方針

  • 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/

更新履歴

  • 20251006 v3本版: "Mini-VM" → "Hakorune VM" ブランディング統一、進捗反映85-90%完成)
  • 20250928 v2: Known 化Rewrite 統合dev観測、表示API str() 統一、Hakorune VM 安定化へ焦点を再定義
  • 20250928 初版: Hakorune VM M3 + NYABI下地の計画

ステータス20250928 仕上げメモ)

  • M3compare/branch/jump: Hakorune VMMirVmMinが厳密セグメントの単一パスで動作。代表 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) の順序を devonly で検証(NYASH_BLOCK_SCHEDULE_VERIFY=1)。
    • LocalSSA: 受信者・引数・条件・フィールド基底を emit 直前で「現在のブロック内」に必ず定義。
  • VM 寛容フラグの方針:
    • NYASH_VM_TOLERATE_VOID: dev 時の救済専用quick テストからは除去)。
    • Router の Unknown→BoxCall は常時ON仕様不変・安定化目的

次のTODO短期

  • Rust VM 安定化(点補修の仕上げ)
    • 既知箇所の観測を最小ONで確認必要時のみ
  • json_query_vmVM: LocalSSA/順序の取りこぼし補強救済OFFで緑
  • ループ PHI 搬送: header/合流の VarMapGuard 観測break/continue を安定)。
  • Hakorune VM M2/M3: 追加エッジ複数compare/ret先頭/ゼロ除算/noretフォールバックを quick で常緑(完了済)。
  • Selfhost Compilerdev: JSONヘッダ非空スモーク任意ゲートを準備。

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: Hakorune VMM2/M3→ 代表4件 PASS、coarse 撤去・単一パス維持。

【2025-10-05 更新】HakoruneVM と箱の適用WASM toolchain ゲート

  • HakoruneVM の配置と 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
  • BoxFirstの導入と責務分解薄い境界

    • 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→FailFast
    • 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 autobirth のクロスモジュール確認: 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=1llc + wasm-ld 経路を使用既定OFF
    • 追加エクスポートは NYASH_WASM_EXPORTS="Main.main,main"(既定で ny_main
    • 失敗時は llvmlite emit_object にフォールバック(既定挙動は不変)
    • ドキュメント追記: docs/guides/execution-modes-guide.md にツールチェイン手順を追加
  • 次の小粒 TODO48h

    • 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 主導)

    • CLIRustNYASH_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.debugDEVのみに寄せ、[ERROR]のみ従来出力。
  • CfgNavigatorBox 委譲の仕上げ(ホットパス外から)

    • InstructionScannerBox に加え、MiniVmScanselfhost/common側でも index_of_from を委譲。
    • JSON スキャン系の重複ロジックを段階的に削減(性能影響は最小)。
  • プラグイン birth 仕様の固定E2E

    • 既存: plugin_birth_e2e_vm.sh(明示 birth の冪等)、plugin_no_birth_nop_vm.shnobirth は noop
    • 追加: plugin_autobirth_e2e_vm.shnew→method の autobirth
    • 追加optin: userbox_birth_idempotent_vm.sh(二回目 birth が noop、パーサ制約のためゲート付与

この先(セルフホスティングに向けた大まかな計画)

  1. コンパイラ最小ルートの完成Ny→JSON v0→MIR(JSON v0)

    • Stage1: AST→JSON v0 の出力見直しUsingResolverBox の導入、prelude 安全)。
    • Stage2: MIR(JSON v0) の最小命令const/binop/compare/branch/jump/ret/phiを安定排出。
    • 代表ケースconst→retcompare→retcompare→branch→phiで HakoruneVM 実行=緑。
  2. VM/箱の仕上げ(薄い境界を維持)

    • ProgramStateBox: read 残差の完全移行log/trace/観測点まで get 化)。
    • CfgNavigatorBox: 依存箇所の委譲をもう一段だけ拡大(重複ロジックの排除)。
    • RetResolverBox/DiagnosticsBox: 失敗系と観測の一元化FailFastDEV静音
  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/明示/nobirth の3本で固定。userbox 冪等は optin で補助。
  5. ドキュメントとエコシステム

    • Phase15.7 の更新点を継続追記(箱の責務・導線・ゲート説明)。
    • CI は quick 緑維持、重い/環境依存は optinゲート付き運用

2025-10-06 Update — 小粒前進(緑維持)

今回の着地strict化箱境界で安定化

  • VM 再帰ガードの導入tail fallback
    • ModuleFunction の tail フォールバックで即時自己参照を FailFast循環検出
    • NYASH_VM_REENTER_LIMIT と併用して開発時の暴走を抑止。
  • Wide フォールバックの停止quick/integration/full
    • NYASH_VM_GLOBAL_TAIL_FALLBACK=0NYASH_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/m3eq_true/eq_false/branch/jump・hakorune m2 eq true → PASS
    • integration: LLVM ハーネス 30/30 → PASS
    • full: suites/core代表 → PASS

仕様/契約まわり(現状)

  • autobirth 既定unbornのみ抑止。instance.birth() 受理。birthは冪等。
  • プラグイン birth 未定義は移行期 noop 合成1リリース相当
  • unborn FailFastユーザーBoxを既定ONNYASH_CHECK_CONTRACTS=1)。

次アクションPhase 15.7 継続・ブレークダウン)

  1. VM: Throw terminator の最小対応とスモーク有効化(非到達側の PHI 除外は実装済み)
  2. Resolver: [modules] もう1本 E2E 追加ログ衛生dev でのみ詳細)
  3. Macro/call!: .hako 実装の堅牢化(ネスト・エスケープ)と自己ホストへの小規模導入拡張
  4. MiniVM: 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_policyRust, src/common/call_policy.rs
    • 即時循環判定base名一致でFailFastと tail 候補生成を関数化。
    • VM の Global/ModuleFunction の末尾一致系をこのポリシーで統一。
    • 影響ファイル: src/backend/mir_interpreter/handlers/calls/function.rswide=OFF前提でも安定
  • 次段(提案)
    • LifecycleContractsbirth/unbornの診断メッセージ・FailFast文言統一
    • ExternCallRegistryTimer.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)

  • CompareScanBoxv0/v1 正規化を導入し、Hakorumne VM/自家製 MiniVM の compare 抽出を箱に一本化(残差も段階置換)。
  • RetResolveSimpleBox を導入し、MiniVM の末尾フォールバック順を明示last_cmp → ret解決 → first const
  • with_usings E2E 緑化dev / ModuleFirst:
    • VM 自動登録ブリッジNYASH_VM_AUTO_REGISTER_DIR_NS=1を builder/ssa/.hako に拡張ModuleFirst 時のみ)。
    • UsingResolverBox に upgrade_aliases() を追加し、modules_map を使って alias→full ns に昇格tail 一意)。
    • PipelineV2.with_usings 入口で upgrade_aliases を呼び、NamespaceBox 正規化の前提を強化。
  • MiniVM トレース導線dev:
    • __trace__=1 を JSON 先頭に置くと [DEBUG] を出力。MiniVmEntryBox.run_trace(json) が注入を補助。
    • Docs: Namespace Quickstart に MiniVM Debugging を追記。

Next (small & safe)

  1. ModuleFirst bridge の対象拡張exports の広い拾い上げと失敗時診断missing ModuleFunctionを1行で明示。
  2. CompareScanBox の完全適用Hakorumne 側 compare の残差置換と最小スモークを1本追加。
  3. with_usings の追加E2E別 aliasを1本だけ quick に常設(過多回避)。
  4. MiniVM Debug の独立ページdocs/guides/mini-vm-debugging.mdを作成し、CLI/ENV/落とし穴(末尾数値の抽出)を記載。

Rust ↔ Selfhost Coverage (Gap Analysis) — 20251012

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 MiniVM): 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 (noop semantics), unary (neg/not) — plan: P4/P5 small adapters, rconly 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), generatorfirst 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 orderagnostic) — plan: Stage2 host handle tests remain optin
  • Using / Modules

    • Implemented: prelude merge, alias resolver, quick profile ON; optin selfhost suite with gates
    • Pending: alwayson module aliases for selfhost.* in dev runner — plan: keep optin 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 outputcompatible; add 12 rconly smokes
  • P5 (LocalSSA): enable ensure_calls/ensure_cond mini; add 1 rconly smoke and unskip 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 pluginon reps orderagnostic; strict reps preflight build via plugintester; keep SKIP on missing artifacts
  • Docs/Smokes: selfhost optin env (SMOKES_SELFHOST_ENABLE / SMOKES_SELFHOST_M2M3_ENABLE) documented; CI defaults remain quick+integrationcore

P4/P5 小結20251012

  • P4薄アダプタ直結
    • emit_mir_flow(_map): extern/global/method/constructor を BlockBuilder 直結の薄アダプタに統一(出力互換)
    • emit_call/emit_method/emit_newboxv0/v1: 内部を shared BlockBuilder 経由に寄せ、材化は LocalSSA に委譲
    • 代表rc-only: selfhost_pipeline_v2_p4_calls_rc_vmConstructor/Method/Global/Extern の最小E2E
  • P5LocalSSA 最小)
    • 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
  • Pipelinev1 経路)
    • MirCallBox 依存を Emit*BlockBuilder 直結)に段階置換(差分最小)
  • pluginon の安定化
    • quick の plugin_on_* を在庫プリチェックpreflight 失敗時 SKIP へ統一(常緑を維持)
  • SSOTtype/slot/arity/aliases
    • specs/type_registry.toml を再スキャンし不足なしを確認。resolve_* は SSOT 優先(静的 fallbackで維持
  • 状態: quick 288/288 PASS、integrationcore 20/20 PASS環境依存は SKIP

🧭 Backend と CLI 方針(単一 CLI, 複数バックエンド)

  • 単一 CLI: hakorune に集約し、--backend {nyvm|rust|llvm}HAKO_BACKEND)で切替
  • バックエンド実体:
    • hakorune-vmNy 製 MiniVM: MIR(JSON v0) 直実行、自己ホスト検証用
    • hakorune-rustRust VM/Runtime: 既定の実用ライン(動的プラグイン/完全実行)
    • hakorune-llvmLLVM ライン): llvmlite ハーネス / AOT将来 hako-llvmc
  • コンパイラーは分離: hakorune-compilerselfhost/pipeline_v2。dev ではバンドル起動を optin で提供
  • 互換: NYASH_*HAKO_* のエイリアス受理docs 表記は HAKO を第一)

🔧 ツール解決ポリシーCLI→ツールのパス解決

  • 優先順: dist/bin → workspacetools/, target/)→ hako.toml [tools]/[backends] → ~/.config/hakorune/config.toml → ENVHAKO_TOOL_PATHS, 個別変数)→ PATH →任意autobuild
  • オプション/ENV:
    • --llvm-harness/HAKO_LLVM_HARNESS, --plugin-tester/HAKO_PLUGIN_TESTER, HAKO_TOOL_PATHS, --autobuild-tools
    • 診断: hakorune --which <tool>(最終解決パス表示), --doctor tools(在庫レポート)
  • pluginon の代表は在庫なしで SKIP前検ありに統一

🛣 次の段階hakorunevm を Rust VM 同等へ)

  • PhaseA安定化小結
    • JSON MIR v0 Reader の CLI 昇格dev ゲート撤去)
    • LocalSSA: ensure_after_phis_copy の代表を 1 本追加If/Loop
  • PhaseB機能差分の吸収
    • Stage3: break/continue/throw/try の最小実装(自己ホスト側 emit→VM
    • Map plugin: 値の handlePluginHandle/HostHandle対応と identity スモーク
  • PhaseC仕上げ
    • SSOT を型解決ホットパスに全面適用(静的は保険)
    • 診断の直書き掃除helpers 統一)
  • 受け入れ基準(同等の目安)
    • quick 288/288 緑(在庫依存は SKIP
    • integrationcore 20/20 緑
    • selfhost M2/M3optin代表緑
    • plugin_on_*(在庫あり)代表 PASS、診断文言は安定

🧱 nyvm の実体と MiniVM 凍結の方針20251012

  • nyvm の実体
    • CLI --backend nyvm は Hakorune VMselfhost/hakorunevm/*)にマップする方針。
    • MiniVMselfhost/vm/*)は dev/教育用のサンドボックスとして温存rconly/optin
  • MiniVM の扱い
    • selfhost/vm に DEPRECATED マーカーを追加(新機能追加を抑制)。
    • スモークは rconly とし、既定は OFF。Hakorune VM の成長を阻害しない。
  • 受け入れ(切替の前段)
    • quick/integration 緑維持、selfhost M2/M3 緑。
    • pluginon在庫あり代表 PASS。診断は helpers 統一。

【2025-10-12 追記】Mir IO 一本化と HostBridge 設計

  • MirIoBoxPhase A

    • Hako 側に MirIoBox を追加。validate/functions/blocks/instructions/terminator の最小 API を提供。
    • nyvm ブリッジが function オブジェクトのみを渡す narrow JSON も許容bridge 実用性優先)。
    • VM コアは run() 先頭で MirIoBox.validate を呼び構造エラーを FailFast。
    • スモーク: terminator_whitespace_vmop 後空白差)、entry_nonzero_vmentry≠0 開始)を quick-selfhost に追加。
  • HostBridge設計

    • 目的: プラグイン(動的)と埋め込み(静的)を同じ ABI で呼び出す一本化レイヤ。
    • 方針: HostBridgeBox.{box_new,box_call,extern_call} の3関数に最小化。TLV で引数/戻り値を統一。
    • 解決: UnifiedRegistry にて Spechako_box.toml or 生成SSOTと InvokerPluginLoaderV2/Providerを集約。
    • ルート: HAKO_PLUGIN_POLICY=off|auto|forceauto=プラグイン優先→無ければ静的)。
    • 最初の疎通: FileBox.open/read両経路で同形に動作
  • 次の実装

    • run.sh の backend 正規化(空/"."/未知→vmでスモークからイズを根治。
    • MirIoBox.validate に terminator 必須・参照妥当性の検証を集約dev 緩和は ENV