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

Phase 20.7: Collections in Hakorune

期間: 8週間 (2026-05-25 → 2026-07-19) 前提Phase: Phase 20.6 (VM Core Complete + Dispatch Unification) 完了Phase: Phase D (Collections - MapBox/ArrayBox in Pure Hakorune)


🎯 概要

Phase 20.7では、HakoruneコアのコレクションライブラリMapBox/ArrayBoxCABI 経由の単一起点に切り替え、Rust VM と Hakorune VM の両実行線で同一実装を叩けるようにします。WASM/embedded プロファイルでは「内蔵プラグイン(静的リンク/LTO」、既定サーバ/CLIでは動的プラグインで運用します。必要に応じて Pure Hakorune 実装(研究/自己ホスト)を併用し、パリティと移植性を両立します。

重要原則:

  • CABI SSOT: Basic 箱は CABI で単一実装Rust/Hako で共有。TwoLayer ExportStable ABI + Inlinable API
  • 決定的動作: キー順序が予測可能Symbol < Int < String
  • FailFast: 不明メソッド/権限違反は即エラー(フォールバック禁止)
  • ValueBox/DataBox 境界: ValueBox は境界のみに限定、箱内部は DataBox のみ

🔄 現状(進捗スナップショット)

  • Router: ABI 基本フックNYASH_ABI_BASIC_ON=1を導入済み。
    • Week1quick: String.length/len/size0引数をフラグ配下で導通挙動は従来同値
    • Week2quick: Array.length/len/size0引数、Array.push/1 をフラグ配下で導通quick スモーク PASS
  • Mappilot: size/get/set を導通。quick のスモークで PASS。
  • Builder/VM: NYASH_NORMALIZE_CORE_EXTERN既定ONで String/Array/Map の Method/ModuleFunction を Extern("nyrt.*") に強制統一。gate=0 で従来経路へロールバック可。
  • Verifier: NYASH_VERIFY_CORE_EXTERN=1 で strict チェックMethod/ModuleFunction 残存時に FailFast。smoke 追加済み。
  • 弱凍結: Rust 線は Router/配線/診断/障害修正のみ許可。意味論の追加は selfhost 側で継続。
  • ロールバック: NYASH_ABI_BASIC_ON=0 で即時戻す。
  • 観測メモ: quick の String パイロットは一部環境で plugin 優先StringBox が plugin provider 経路により経路が揺れる。ABI hook を Method/Module/Extern の3入口に配置し、スモーク側で macro/using/TOML-env をOFFにして安定化する。
  • Boot/Lock: LockOnly--frozen経路は導入済み。ABI 導入後も lock.graph.order に従ってロードし決定性を維持する。
  • 文字列長の意味論: bytes 基準(length_bytesで統一。AOT 側の実装は VM と同値に揃える(パリティ項目)。

進捗(締め処理)

  • quick: ABI Basic 既定ON で安定診断既定OFF
  • integration: first waveString/Array既定ON。代表ケースExtern len / ModuleFunction canonical / Box equalsで緑を確認。
  • perf: 目安≥70% の観測を 48h 窓で継続(問題あれば NYASH_ABI_BASIC_ON=0 に即時ロールバック)。

📊 実装範囲

Week 1-4: MapBox実装

MapBoxは、キー・バリューペアを格納するハッシュマップです。

実装メソッド:

  • set(key, value): キー・バリューペアを設定
  • get(key): キーから値を取得
  • has(key): キーの存在確認
  • remove(key): キーを削除
  • size(): 要素数を返す
  • keys(): すべてのキーを返す(決定的順序)
  • values(): すべての値を返す(決定的順序)

技術要件:

  1. ハッシュマップ実装: チェイン法またはオープンアドレス法
  2. 決定的ハッシュ/等価性: 同じキーは常に同じバケットに配置
  3. キー正規化: Symbol/Int/String型を統一的に扱う
  4. Provenance Tracking: plugin_id, versionを記録

Week 5-8: ArrayBox実装

ArrayBoxは、動的配列リストです。

実装メソッド:

  • push(value): 末尾に要素を追加
  • pop(): 末尾から要素を削除して返す
  • get(index): インデックスで要素を取得
  • set(index, value): インデックスに値を設定
  • size(): 要素数を返す
  • slice(start, end): 部分配列を返す
  • concat(other): 別の配列と結合

技術要件:

  1. 動的配列実装: 容量拡張戦略2倍拡張など
  2. 境界チェック: インデックス範囲外は即座にエラー
  3. 参照カウント: GC準備Phase 20.8)のための追跡
  4. Fail-Fast: 不正な操作は即座にpanicではなくエラー返却

🔑 キー比較順序(決定的動作の核心)

MapBoxのキー順序は以下のルールで決定されます:

Symbol < Int < String

:

local map = new MapBox()
map.set(:foo, 1)      // Symbol
map.set(42, 2)        // Int
map.set("bar", 3)     // String

// keys() の返り値は必ず [:foo, 42, "bar"] の順序
local keys = map.keys()
// Output: [:foo, 42, "bar"]

実装詳細:

  • 同じ型内では、自然順序Symbol: 辞書順、Int: 数値順、String: 辞書順)
  • 異なる型間では、上記の型優先順位に従う
  • ハッシュ衝突時も、この順序で解決

🏗️ ValueBox/DataBox境界

設計原則 (Phase 20.5で確立):

  • ValueBox: 一時的な値(パイプライン境界のみ)
  • DataBox: 永続的な値(長期保存)
  • Fail-Fast: Entry/ExitポイントでValueBoxをUnpack

Collections適用:

// ❌ BAD: ValueBoxをMapに直接格納
map.set(key, ValueBox.wrap(data))

// ✅ GOOD: DataBoxに変換してから格納
local databox = ValueBox.unpack(data)
map.set(key, databox)

実装要件:

  1. MapBox/ArrayBoxはDataBoxのみを受け入れる
  2. ValueBoxが渡された場合、即座にエラー
  3. Pipeline境界でUnpackを強制

🧪 成功基準

必須条件 ( すべて達成必須)

  1. MapBox/ArrayBox完全実装:

    • すべてのメソッドがPure Hakoruneで動作
    • Rustコードへの依存なしHostBridge以外
  2. Golden Tests通過:

    • Rust-Collections vs Hako-Collections パリティ
    • 100+テストケースで完全一致
    • 決定的動作の検証(同じ入力→同じ出力)
  3. 決定的動作:

    • キー順序が予測可能
    • イテレーション順序が安定
    • Provenance Tracking動作
  4. パフォーマンス:

    • Hako-Collections ≥ 70% of Rust-Collections速度
    • 基本操作set/get/push/popはO(1)平均時間
    • 大規模データ10,000要素でも実用的速度

除外項目 (⚠️ Phase 20.7では扱わない)

  • GC (Garbage Collection): Phase 20.8で実装
  • 最適化: 基本実装のみ(プロファイリングは後回し)
  • 並行処理: シングルスレッドのみ
  • 永続化: メモリ内のみ(ディスク保存なし)

📚 関連ドキュメント


📝 ドキュメント構造

  • README.md (このファイル): Phase 20.7概要(日本語)
  • PLAN.md: 詳細実装計画(英語)
  • CHECKLIST.md: 週次チェックリスト
  • INDEX.md: ドキュメント索引

Status: PLANNED Dependencies: Phase 20.6 (VM Core + Dispatch) Delivers: Phase D (Collections in Pure Hakorune) Timeline: 8 weeks (2026-05-25 → 2026-07-19)