Files
hakorune/docs/private/roadmap/phases/phase-15.75/TODO.md

14 KiB
Raw Blame History

Phase 15.75 — 脱Rust 大作戦 TODO (P1/P2 入口)

📚 ← INDEX.md に戻る | 🎯 今すぐやること1-2週間 | 🗂️ 長期バックログは TODO_ROADMAP.md


目的

  • Rust 実装を薄い橋(HostBridge/Router/ABI)に縮退し、Hakorune(.hako) 側へ段階移譲。
  • すべて段階導入・スモーク緑維持・実行時 capability で進める。

優先タスクP1 スコープ / 次の1〜2週間

  1. VM シュガー: Map.call P1同期のみ — [DONE]

    • 仕様: docs/guides/map-callable.md
    • 実装: VM ルーターに薄い分岐get→call。プラグイン変更なし。
    • スモーク: 成功/欠損/非Callable の3本
    • ゲート: HAKO_MAP_CALL_ENABLE=1devオン、既定OFF
  2. Fallback アダプタの箱化keysS/valuesS — [DONE]

    • 目的: Rust 内のフォールバック文字列→配列化を .hako 側に移設HostBridge 呼び出しの一本化)
    • 実装: adapter.hakoString→Array変換 Runner 側の軽接続
    • スモーク: 既存 fallback/stage2/identity の3本で緑維持
  3. HostHandleRouter 段階移設(薄いリダイレクト) — [P1: stub DONE]

    • 現状: host_api.rs 内の分岐
    • 目標: src/runtime/host_handle_router へ委譲、router内で Box 種別毎の slot に分散
    • スモーク: stage2(keys/values) の緑維持で Accept
  4. Parser/Tokenizer 小片の先行移行(純関数領域)

    • 方針: Token utils/小スキャナ等の純関数を .hako へ移し、Rust 側は Adapter 経由に縮退
    • スモーク: JSON/文字列/mini-parser の軽ケースquick

受け入れ基準

  • quick/full スイート緑(新規/既存スモークふくめ)。
  • 新機能は実行時 capability で既定OFFdevでON
  • docsguides/proposalsに仕様/使い方/戻し方が明記されていること。

参考

  • 仕様草案: docs/guides/map-callable.md
  • 統一API: docs/guides/collections-api.md
  • 脱Rust計画群: docs/development/proposals/phase-15.75/

2025-10-14 追記(実行ラインの名称統一・導線整備)

  • bin ラッパー追加(名称は hakorune 系で統一、実体は nyash
    • bin/hakorunetarget/release/nyash ラッパー
    • bin/hakorune-stage0 → Rust VM ラインnyash デフォルト)
    • bin/hakorune-stage1 → LLVM ライン(nyash --backend llvm
  • ドキュメント整合
    • TOOLCHAIN_REQUIREMENTS.md に alias/ラッパー対応を追記
    • BOOTSTRAP_STRATEGY_MIR_ROLLBACK.md に bin 構成・備考を追記
  • mod.rsrouterのコメント化ブロックを物理削除差分衝突回避後の小パッチ
  • Phase 1MirCall着手準備必要時のみ extern_adapter.rs/vm_types.rs に最小ガード(可逆)

2025-10-15 追記Phase 0-mini 仕上げ)

  • extern_adapter 分割とハブ化core/future を分割登録)
    • core: extern_adapter/extern_core.rs
    • future: extern_adapter/extern_future_legacy.rs
  • extern_adapter のインライン重複ハンドラを物理削除hub最小化
    • 削除: nyrt.time.now_ms, nyrt.string.*, nyrt.array.size, nyrt.map.{size,keys,values}, env.future.*
    • 残置: 分割モジュールの register(..) のみhubは登録呼び出しとその他最小機能
  • array_flatten_helper の二分割builtin/pluginとファサード委譲
    • builtin: array_flatten_helper_builtin.rs / plugin: array_flatten_helper_plugin.rs
    • 呼び出し箇所に README 参照コメントを最小付与
  • 正規化の拡充Extern→Method: nyrt.map.{keys,values} / string系を Method に降格

今後1週間詳細タスク / 明確化)

  • Router README の最小追記HostHandle slot/ENV 一覧と責務)
    • src/runtime/method_router_box/README.md
  • Quick ロールアウト Step3観測拡大
    • quick.envNYASH_MAP_GET_FORCE_HOST=1, NYASH_MAP_SET_FORCE_HOST=1 を導入観測ON
    • 代表スモークを quick に昇格get_missing / set_effect / size_has→ 緑確認
  • Pluginonly CI 枠buildonlyを docs に定義
    • docs/guides/plugin-only-build.md に minimal CI サンプル追記build 緑のみ)
  • Extern disabled 診断の安定化メモ
    • docs/reference/vm/call-unification.md に「pluginonly で Extern は明示エラー」の注記を補足(定数化: DIAG_EXTERN_DISABLED
  • 既知の軽警告の後始末(機会があれば)
    • host_api_anchors/mod.rs の属性整列、未使用 import の整理

2025-10-16 追記Stage3: boxes 剥がしの完了条件と現在地)

Stage3 DoDDefinition of Done

  • 参照ゼロ(外縁): crate::boxes::*src/boxes/**#[cfg(feature="legacy-boxes")] ガード配下以外に存在しない
  • ビルド緑:
    • Legacy既定ON: cargo build --release
    • Pluginonly検証線: cargo build --release --no-default-features -F cli,plugins,host-anchors
    • スモーク: quick と pluginsbuildonlyが PASS
  • 実行経路の分離: Routerbuiltin/pluginと extern_adaptercore/futurelegacyの二分体制が成立
  • ドキュメント/CI: CURRENT_TASK と guides を更新、CIに pluginonly buildbuildonlyを追加最小

現在地20251016

  • refs 棚卸し: 外縁の直参照は #[cfg(feature="legacy-boxes")] で封じ込め済みruntime/backend/tests
    • 代表: runner/dispatch の FloatBox、box_operators の FloatBox、result_conv の FloatBox、ast の Float は cfg 下で分岐。
    • messaging/transport はファイル/モジュール単位で legacyonly。
  • 検証: plugins プロファイルの buildonly スモーク(個別タイムアウト導入)→ PASS を継続確認。
  • 追加作業(継続): tests で legacy 直参照するファイルは先頭に #![cfg(feature="legacy-boxes")] を寄せて統一。

次の一手Stage3 締め)

  • bydir 上位から crate::boxes::* 参照を再確認helper: tools/dev/list_boxes_refs.sh --by-dir)。
  • 参照ゼロ化が確認できたら、CIに pluginonly buildbuildonlyジョブを追加docsのサンプルどおり
  • 既定フラグOFF/src/boxes/ 物理撤去は、観測安定後の独立PRで可逆運用を優先

Phase 2 — Parser/Resolver構造→導線→段階移設

目的

  • 既存実装の挙動を変えずに“箱と境界”を先に整える。薄いFacadeで導線を用意し、ミニスモークで観測可能にする。

状態2025-10-15

  • Interfaces: src/layers/interfaces.rsParserOutput/ResolverInput/FrontendError
  • Guards: src/front/{parser_layer,resolver_layer}/LAYER_GUARD.rs
  • Facades: front::parser_layer::facade::parse_source_to_ast, front::resolver_layer::facade::resolve_passthrough
  • Impl適合: ast::ASTNodeParserOutput/ResolverInput に適合
  • Doc: docs/reference/frontend-layers.md
  • Opt-in導線: Runner で HAKO_FRONT_USE_FACADE=1 のとき Facade 経由でパース
  • Smoke最小: quick-selfhost/parser_facade_min_vm.sh

次アクションP2-1

  1. README強化I/O例・最小AST例
    • src/front/parser_layer/README.md / src/front/resolver_layer/README.md
  2. 追加スモーク(必要なら)
    • 空プログラム/単一関数などの極小ケースを1本
  3. Facade採用の範囲拡大任意・段階
    • ランナーの他経路(例: demos/jitでも dev-flag 下で Facade を採用
  4. 本移設(別タスク)
    • 純関数ヘルパから段階移設。既存APIは薄い委譲に変更挙動不変

受け入れ基準

  • quick/quick-selfhost 緑。既定挙動は不変dev-flagのみ影響
  • 仕様/契約が docs/reference/frontend-layers.md と README に明記されている。

Phase 3 — Boxes Migrationレガシー撤退の実務

目的

  • src/boxes/ の参照を段階的に削減し、plugin/HostHandleRouter 経路に一本化する。

現状2025-10-15

  • plugin-only build は build-only 緑警告あり。refs は残っている(tools/dev/list_boxes_refs.sh 参照)。
  • type_registry の core factory は legacy-OFF で plugin 優先Array/Map/String
  • router/extern/array helper は分割済みbuiltin/plugin

次アクションP3-1

  1. 参照の棚卸しと優先順位付けfanout 高→低)
    • runner/extern/MIR handlers を先に cfg で囲い、plugin-only ビルドの阻害要因を解消
  2. plugins プロファイルの代表スモークを必要に応じて追加(経路変更時)
  3. plugin-only build を定期確認build-only
  4. refs が 0 に近づいたら、短期ブランチで legacy-boxes 既定OFF→ src/boxes/ 削除

受け入れ基準

  • legacyデフォルト+ quick: 緑維持
  • plugin-only: build-only 緑
  • plugins プロファイル代表スモーク: 緑

ドキュメント

  • 詳細計画: PHASE_3_BOXES_MIGRATION.md

Phase 4 — Dual Parser Harness入口の一本化・観測の強化

目的

  • Rust ラインと Hakorune 自己ホストラインの両方で同じスモークを回し、最小同等性を段階保証する。

範囲(最小)

  • ハーネス: SMOKES_PARSER_MODE=rust|hako|both(既定=rust
  • 仕様: 最小 JSON v0 ヘッダ({"version":"0","kind":"Program","stats":{"stmts":N}}
  • 判定: version/kind/stats.stmts の比較のみAST 完全一致は要求しない)

受け入れ基準

  • both で PhaseA スモーク(セミコロン受理/ifelse/ブロック終端/using 最小)が緑
  • 既定rustの速度・安定は不変

備考

  • セミコロンは既定受理Rust/ハコ双方)。無効化は NYASH_PARSER_ALLOW_SEMICOLON=0(開発用)

進捗メモ2025-10-15 P3-5〜P3-9 抜粋)

  • WASM v2 backend を legacy 前提にゲートplugin-only との交差を回避)
  • LLVM interpreter の Float/Null を cfg 分岐plugin-only は String/Void 代替)
  • tests の legacy 直参照に軽ガードbuild-with-tests 互換)
    • box_tests/refcell_assignment_test/vm_functionbox_call/policy_mutdeny などを legacy 前提に
    • host_reverse_slot は plugin-only で PluginBox 経路に切替

2025-10-16 追記Stage4 完了ライン TODO

  • CABI ハーネス2関数配置feature parser-c-abi 配下)
  • Rust 薄層ヘッダ出力・C文字列ユーティリティ実装
  • both モード最小スモーク追加(ヘッダ一致/ビルド失敗時は SKIP
  • hako ヘッダは当面 Rust パーサを再利用して parity を確保(後に Hako Parser に差替)
  • Docs 整理Start Here/DoD/Status と 15.76 への導線)
  • ランナー導線(任意):SMOKES_PARSER_MODE=both|hako の時に CABI を呼ぶ薄い分岐bin 依存を解消)
  • CI任意parser-c-abi を buildonly で1本だけ回す軽量ジョブ既定 OFF

Next — Phase 1MirCall 小粒・箱化方針で進行)

  • 安全メソッドの whitelist を箱化(一元化)
    • 実装: normalize.rsis_safe_core_method(&str,&str) を追加し、ModuleFunction/BoxCall 降格の両方から参照
  • Callable(argv 再構成) のパリティ確認(軽スモーク)
    • quick-selfhost に arity>0 の methodRef.call(argv) 正常系を1本追加Extern無効でも緑
  • HostHandleRouter 境界スモーク(-14: 返却型不一致)
    • plugins プロファイルに1本追加型不一致を明示検出。ENVフック HAKO_HOSTHANDLE_TEST_RET_MISMATCH=1 で再現
  • 正規化の安全拡張(必要時のみ)
    • 既存正常系Array.slice/join、Map.delete/clearを維持。追加が必要なら is_safe_core_method にのみ追記(箱化原則)
    • 2025-10-15: StringBox.replace を安全リストに追加済みExtern/ModuleFunction → Method 降格)。
  • ドキュメントの参照強化(設計の導線統一)
    • docs/reference/vm/call-unification.mdis_safe_core_method(安全判定の箱)への短い言及を追加
  • plugin-only 警告のスポット掃除(任意)
    • 未使用変数/関数に限定して抑制(機能差なし)

Status Notes (20251013)

  • plugins: keys()/values() は Stage2 既定ONHostHandle(Array)。values 要素は PluginHandle(Array) 直返し可能。
  • Router: keysS/valuesS→Array の文字列シムは撤退済み。
  • Map.call P1 実装&スモーク完了。

次アクション(確定 / 短期)

  1. Map.call P1 最終確定VMシュガー
  • selfhost/hakorune-vm/method_call_handler.hako の call/1, call/2 ルートを最終確認(存在確認済)
  • 既存スモーク3本成功/欠損/非Callableを再実行し緑確認
  • 境界スモークを1本追加例: 欠損キー非Callableの混在ケースで診断メッセージ確認
  1. plugin-on スモーク拡充Stage2: HostHandle Array
  • Map.keys/Map.values の Stage2HostHandle Array検証を2本追加
    • keys: 配列長・要素内容の最小確認
    • values: 型Handle/Boxの期待形状とアクセス可否
  • identity ケース追加: arr -> map.set -> get -> 同一 の最小確認
  1. 段階撤退の次ステップ(便宜ハンドラの縮退)
  • VM 便宜ハンドラの次候補を順にドキュメント/ガード更新String → Map → Array の順)
  • BoxCall fastpath の段階停止フラグをテストプロファイルでONにして緑確認既定はOFFを維持
  1. HostHandleRouter の段階移設(小粒・安全)
  • 既存関数を1つだけ router に委譲して緑維持(小ステップで進める)

整備タスク(短時間で高効果)

  • JSON抽出の残り indexOf を JsonFieldExtractor/JsonCursor に寄せる1015分×数箇所
  • boxcall_builder に build_method を使う呼び出しを1箇所適用再利用性向上・差分小