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

190 lines
7.8 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 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/ArrayBoxを**CABI 経由の単一起点**に切り替え、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
```
**例**:
```hakorune
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適用**:
```hakorune
// ❌ 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で実装
- **最適化**: 基本実装のみプロファイリングは後回し
- **並行処理**: シングルスレッドのみ
- **永続化**: メモリ内のみディスク保存なし
---
## 📚 関連ドキュメント
- **Phase 20.6**: [VM Core Complete + Dispatch Unification](../phase-20.6/)
- **Phase 20.8**: [GC v0 + Rust Deprecation](../phase-20.8/)
- **Pure Hakorune Roadmap**: [PURE_HAKORUNE_ROADMAP.md](../phase-20.5/PURE_HAKORUNE_ROADMAP.md)
- **Box-First原則**: [CLAUDE.md](../../../../CLAUDE.md#🧱-先頭原則-箱理論box-first)
- **Golden Testing Strategy**: [PURE_HAKORUNE_ROADMAP.md#🧪-golden-testing-strategy](../phase-20.5/PURE_HAKORUNE_ROADMAP.md#-golden-testing-strategy)
---
## 📝 ドキュメント構造
- **[README.md](README.md)** (このファイル): Phase 20.7概要日本語
- **[PLAN.md](PLAN.md)**: 詳細実装計画英語
- **[CHECKLIST.md](CHECKLIST.md)**: 週次チェックリスト
- **[INDEX.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)