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

1576 lines
83 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

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

# Phase 15.7: セルフホスティング実現への道筋 - Hakoruneコンパイラ完成計画
Branch Note (selfhost)
- このブランチでは CLI バイナリ名は `hako` だよ。本文中の `hakorune`/`nyash``hako` に読み替えて実行してね。
- 環境変数は `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.sh`LLVM未導入時は自動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.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`
- 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 緑
2) Stage1 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を順に UNSKIP→緑
4) Hakorune VM 箱化ラインの安定化
- InstructionScannerBox/OpHandlersBox に一本化(無限ループ対策・観測の集約)
- Arithmetic/Compare の委譲(小さな共通箱へ移譲)
- 受け入れ: m2/m3 代表branch/jump/phi
5) using/[modules] のE2EAST 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}` を表示。
- 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/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 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**
- 📋 **[詳細設計](../../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-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.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テキスト整形で挙動不変・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=1``NYASH_*` 互換)。
- 参照: `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.sh`name→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_vm`true`selfhost_pipeline_v2_op_eq_false_vm`falseを追加
- 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_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のまま
- 既定: 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 解決(未完の中核)
- 新規: `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 の併設)
- 署名検証コンパイル時FailFastの拡張
- `SignatureVerifierBox` を全発行点に適用
- `MethodRegistryBox` のカバレッジ拡張toJSON/length 別名整理, startsWith/endsWith 等)
優先度P21週— 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 化(将来の例外伝播は別フェーズ)
優先度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. コンパイラー側 = これが残課題!🔥**
```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 統合 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`)。
- フロント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` はハーネス環境が無い場合 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_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/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.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/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 で 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 経路(開発/比較用)
3. **Builder観測**: resolve.try/choose と ssa.phi が devonly で取得可能
- 環境変数: `HAKO_DEBUG_*`
4. **表示API統一**: QuickRef/ガイドが `str()` に統一
- 実行挙動は従前と同じ(互換性維持)
5. **Selfhost Compilerdev限定**:
```bash
HAKO_JSON_ONLY=1 ./target/release/hakorune \
apps/selfhost-compiler/compiler.hako -- --stage3 # 互換: compiler.nyash も受理
```
→ JSON ヘッダ(`{"version":…, "kind":…}`)を出力(非空)
6. **ブートストラップ成功**:
```bash
# 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、並行可能**
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/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=1` で `version/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_CALL` が `0|false|off` でない限り有効既定ON
- メソッド解決/関数化を `emit_unified_call` に集約し、以下の順序で決定:
1) 早期 toString/stringify→str
2) equals/1Known 優先→一意候補; ユーザーBox限定
3) Known→関数化`obj.m → Class.m(me,…)`)/一意候補フォールバック(決定性確保)
- レガシー側の関数化は dev ガードで抑止可能: `NYASH_DEV_DISABLE_LEGACY_METHOD_REWRITE=1`(移行期間の重複回避)
スコープ(やること)
1) Builder: Known 化 + Rewrite 統合Stage1
- P0: me 注入・Known 化origin 付与/維持)— 軽量PHI補強単一/一致時)
- P1: Known 経路 100% 関数化obj.m → Class.m(me,…)。special は `toString→str互換:stringify/equals` を統合
- 観測: resolve.try/choose / ssa.phi を devonly で JSONL 出力既定OFF。`resolve.choose` に `certainty` を付加し、KPIKnown率を任意出力`NYASH_DEBUG_KPI_KNOWN=1`, `NYASH_DEBUG_SAMPLE_EVERY=N`)。
2) 表示APIの統一挙動不変
- 規範: `str()` / `x.str()`(同義)。`toString()` は早期に `str()` へ正規化
- 互換: `stringify()` は当面エイリアスとして許容
- QuickRef/ガイドの更新plus混在の誘導も `str()` に統一)
3) 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=1` で `llc + 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 主導)
- CLIRustで `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.debugDEVのみに寄せ、[ERROR]のみ従来出力。
- CfgNavigatorBox 委譲の仕上げ(ホットパス外から)
- InstructionScannerBox に加え、MiniVmScanselfhost/common側でも `index_of_from` を委譲。
- JSON スキャン系の重複ロジックを段階的に削減(性能影響は最小)。
- プラグイン birth 仕様の固定E2E
- 既存: `plugin_birth_e2e_vm.sh`(明示 birth の冪等)、`plugin_no_birth_nop_vm.sh`nobirth は noop
- 追加: `plugin_autobirth_e2e_vm.sh`new→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=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/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を既定ON`NYASH_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.rs`wide=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-vm`Ny 製 MiniVM: MIR(JSON v0) 直実行、自己ホスト検証用
- `hakorune-rust`Rust VM/Runtime: 既定の実用ライン(動的プラグイン/完全実行)
- `hakorune-llvm`LLVM ライン): llvmlite ハーネス / AOT将来 `hako-llvmc`
- コンパイラーは分離: `hakorune-compiler`selfhost/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_vm`op 後空白差)、`entry_nonzero_vm`entry≠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|force`auto=プラグイン優先→無ければ静的)。
- 最初の疎通: FileBox.open/read両経路で同形に動作
- 次の実装
- run.sh の backend 正規化(空/"."/未知→vmでスモークからイズを根治。
- MirIoBox.validate に terminator 必須・参照妥当性の検証を集約dev 緩和は ENV