394 lines
14 KiB
Markdown
394 lines
14 KiB
Markdown
|
|
# Phase 20.7: Collections in Hakorune - Implementation Checklist(2025‑10 反映)
|
|||
|
|
|
|||
|
|
**Duration**: 8 weeks (2026-05-25 → 2026-07-19)
|
|||
|
|
**Status**: PLANNED(Router/正規化/BootLock は先行導入済み)
|
|||
|
|
|
|||
|
|
## 進捗スナップショット(2025‑10)
|
|||
|
|
- [x] Router: ABI 基本フック `NYASH_ABI_BASIC_ON` を導入(既定OFF)
|
|||
|
|
- [x] Core Extern 正規化: `NYASH_NORMALIZE_CORE_EXTERN=1` 既定ON
|
|||
|
|
- [x] Verifier: `NYASH_VERIFY_CORE_EXTERN=1` で strict チェック(Fail‑Fast)
|
|||
|
|
- [x] Boot/Lock: LockOnly/Auto で決定性維持(order/libraries に基づくロード)
|
|||
|
|
> 観測メモ: quick=既定ON、integration=first wave 既定ON。integration 部分実行(Extern len/ModuleFunction canonical/Box equals)で緑確認。残りは48h観測窓でノイズ監視(perf目安≥70%)。
|
|||
|
|
|
|||
|
|
## 段階ON(Pilot → Rollout)
|
|||
|
|
1) quick(pilot)
|
|||
|
|
- [x] `NYASH_ABI_BASIC_ON=1` で String.length/len/size → Array.size/push → Map.size/has/get/set の順に導通(quick/env 既定ON)
|
|||
|
|
- [x] スモーク緑化(VM/LLVM):parity 変化なし(pilot 緑)
|
|||
|
|
2) integration(rollout)
|
|||
|
|
- [x] 同順で段階ON(first wave: String/Array 反映。env 既定ON)
|
|||
|
|
- [ ] perf ≥ 70% / 回帰無し確認(観測継続)
|
|||
|
|
3) AOT(任意検証)
|
|||
|
|
- [ ] 文字列長の意味論(bytes)でパリティ(VM=bytes)。AOT 実装差を吸収
|
|||
|
|
- [ ] FFI dynamic の前提満たす場合のみ実行
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
## Week 1: MapBox Foundation
|
|||
|
|
|
|||
|
|
### Data Structures
|
|||
|
|
- [ ] Design bucket storage (chaining or open addressing)
|
|||
|
|
- [ ] Implement hash function for Symbol type
|
|||
|
|
- [ ] Implement hash function for Int type
|
|||
|
|
- [ ] Implement hash function for String type (FNV-1a or similar)
|
|||
|
|
- [ ] Design collision resolution strategy
|
|||
|
|
|
|||
|
|
### Core Operations
|
|||
|
|
- [ ] Implement `MapBox._hash(key)` internal method
|
|||
|
|
- [ ] Implement `MapBox.set(key, value)` method
|
|||
|
|
- [ ] Implement `MapBox.get(key)` method
|
|||
|
|
- [ ] Implement basic resizing logic (load factor > 0.75)
|
|||
|
|
- [ ] Implement bucket allocation/deallocation
|
|||
|
|
|
|||
|
|
### Tests
|
|||
|
|
- [ ] Test basic set operation (10 test cases)
|
|||
|
|
- [ ] Test basic get operation (10 test cases)
|
|||
|
|
- [ ] Test hash collision handling (5 test cases)
|
|||
|
|
- [ ] Test resizing behavior (3 test cases)
|
|||
|
|
- [ ] Test empty map edge cases (3 test cases)
|
|||
|
|
|
|||
|
|
### Documentation
|
|||
|
|
- [ ] Document bucket storage design
|
|||
|
|
- [ ] Document hash functions (Symbol/Int/String)
|
|||
|
|
- [ ] Document collision resolution strategy
|
|||
|
|
- [ ] Document resizing algorithm
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
## Week 2: Deterministic Hashing & Key Order
|
|||
|
|
|
|||
|
|
### Hash Strategy
|
|||
|
|
- [ ] Implement deterministic Symbol hash (use symbol ID)
|
|||
|
|
- [ ] Implement deterministic Int hash (use integer value)
|
|||
|
|
- [ ] Implement deterministic String hash (stable UTF-8 algorithm)
|
|||
|
|
- [ ] Test hash stability (same key → same bucket, 100 runs)
|
|||
|
|
|
|||
|
|
### Key Normalization
|
|||
|
|
- [ ] Implement type detection (Symbol vs Int vs String)
|
|||
|
|
- [ ] Implement unified comparison function (`compare_keys`)
|
|||
|
|
- [ ] Implement stable sort for mixed-type keys
|
|||
|
|
- [ ] Verify key comparison order: Symbol < Int < String
|
|||
|
|
|
|||
|
|
### Deterministic Iteration
|
|||
|
|
- [ ] Implement `MapBox.keys()` method (returns sorted keys)
|
|||
|
|
- [ ] Implement `MapBox.values()` method (returns values in key order)
|
|||
|
|
- [ ] Implement provenance tracking (plugin_id, version)
|
|||
|
|
- [ ] Verify iteration order stability (same input → same output, 10 runs)
|
|||
|
|
|
|||
|
|
### Tests
|
|||
|
|
- [ ] Test mixed-type key insertion (Symbol, Int, String) (10 test cases)
|
|||
|
|
- [ ] Test deterministic iteration order (20 test cases)
|
|||
|
|
- [ ] Test key order: Symbol < Int < String (5 test cases)
|
|||
|
|
- [ ] Test hash stability across runs (10 test cases)
|
|||
|
|
- [ ] Test provenance tracking (3 test cases)
|
|||
|
|
|
|||
|
|
### Documentation
|
|||
|
|
- [ ] Document deterministic hash strategy
|
|||
|
|
- [ ] Document key comparison order (Symbol < Int < String)
|
|||
|
|
- [ ] Document provenance tracking design
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
## Week 3: Advanced MapBox Operations
|
|||
|
|
|
|||
|
|
### Remove Operation
|
|||
|
|
- [ ] Implement `MapBox.remove(key)` method
|
|||
|
|
- [ ] Implement bucket chain repair (if using chaining)
|
|||
|
|
- [ ] Implement size decrement logic
|
|||
|
|
- [ ] Handle remove of non-existent key (return NullBox)
|
|||
|
|
|
|||
|
|
### Query Operations
|
|||
|
|
- [ ] Implement `MapBox.has(key)` method
|
|||
|
|
- [ ] Implement `MapBox.size()` method
|
|||
|
|
- [ ] Handle edge cases (empty map, single element)
|
|||
|
|
- [ ] Verify O(1) average time complexity
|
|||
|
|
|
|||
|
|
### Boundary Checks (Fail-Fast)
|
|||
|
|
- [ ] Reject ValueBox keys (panic with clear message)
|
|||
|
|
- [ ] Reject ValueBox values (panic with clear message)
|
|||
|
|
- [ ] Ensure DataBox-only inputs
|
|||
|
|
- [ ] Implement entry point unpack logic
|
|||
|
|
|
|||
|
|
### Tests
|
|||
|
|
- [ ] Test remove operation (15 test cases)
|
|||
|
|
- [ ] Test remove non-existent key (5 test cases)
|
|||
|
|
- [ ] Test has operation (10 test cases)
|
|||
|
|
- [ ] Test size operation (10 test cases)
|
|||
|
|
- [ ] Test edge cases (empty map, single element) (5 test cases)
|
|||
|
|
- [ ] Test ValueBox rejection (Fail-Fast) (5 test cases)
|
|||
|
|
|
|||
|
|
### Documentation
|
|||
|
|
- [ ] Document remove operation design
|
|||
|
|
- [ ] Document ValueBox/DataBox boundary enforcement
|
|||
|
|
- [ ] Document Fail-Fast error messages
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
## Week 4: MapBox Golden Tests & Performance
|
|||
|
|
|
|||
|
|
### Golden Test Suite
|
|||
|
|
- [ ] Create 50+ test cases for MapBox
|
|||
|
|
- [ ] Compare Rust-MapBox vs Hako-MapBox output
|
|||
|
|
- [ ] Verify identical output for all test cases
|
|||
|
|
- [ ] Test deterministic behavior (same input → same output, 10 runs per test)
|
|||
|
|
- [ ] Test key order stability (Symbol < Int < String)
|
|||
|
|
|
|||
|
|
### Deterministic Verification
|
|||
|
|
- [ ] Run each test 10 times, verify identical output
|
|||
|
|
- [ ] Test with 1,000+ keys (mixed types)
|
|||
|
|
- [ ] Verify provenance tracking in golden tests
|
|||
|
|
- [ ] Verify iteration order matches Rust-MapBox
|
|||
|
|
|
|||
|
|
### Performance Baseline
|
|||
|
|
- [ ] Measure set operation time (per 1,000 operations)
|
|||
|
|
- [ ] Measure get operation time (per 1,000 operations)
|
|||
|
|
- [ ] Measure remove operation time (per 1,000 operations)
|
|||
|
|
- [ ] Compare against Rust-MapBox
|
|||
|
|
- [ ] Verify performance ≥ 70% of Rust-MapBox
|
|||
|
|
- [ ] Profile hot paths (hash function, collision resolution)
|
|||
|
|
|
|||
|
|
### Documentation
|
|||
|
|
- [ ] Document MapBox API reference
|
|||
|
|
- [ ] Document usage examples (basic, advanced)
|
|||
|
|
- [ ] Document performance characteristics (O(1) average, O(n) worst case)
|
|||
|
|
- [ ] Document golden test results
|
|||
|
|
- [ ] Document performance benchmarks
|
|||
|
|
|
|||
|
|
### Week 4 Milestone Review
|
|||
|
|
- [ ] All MapBox methods implemented in Pure Hakorune
|
|||
|
|
- [ ] Golden tests: 50+ test cases PASS
|
|||
|
|
- [ ] Deterministic key order verified
|
|||
|
|
- [ ] Performance ≥ 70% of Rust-MapBox
|
|||
|
|
- [ ] Ready to proceed to ArrayBox implementation
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
## Week 5: ArrayBox Foundation
|
|||
|
|
|
|||
|
|
### Data Structures
|
|||
|
|
- [ ] Design RawBufferBox for storage
|
|||
|
|
- [ ] Implement capacity expansion strategy (2x growth)
|
|||
|
|
- [ ] Implement bounds checking logic
|
|||
|
|
- [ ] Design element addressing (index → buffer offset)
|
|||
|
|
|
|||
|
|
### Core Operations
|
|||
|
|
- [ ] Implement `ArrayBox.push(value)` method
|
|||
|
|
- [ ] Implement `ArrayBox.pop()` method
|
|||
|
|
- [ ] Implement capacity doubling logic
|
|||
|
|
- [ ] Handle empty array edge cases
|
|||
|
|
|
|||
|
|
### Tests
|
|||
|
|
- [ ] Test basic push operation (10 test cases)
|
|||
|
|
- [ ] Test basic pop operation (10 test cases)
|
|||
|
|
- [ ] Test capacity expansion (grow from 0 → 1 → 2 → 4 → 8) (5 test cases)
|
|||
|
|
- [ ] Test empty array edge cases (5 test cases)
|
|||
|
|
- [ ] Test push/pop sequence (10 test cases)
|
|||
|
|
|
|||
|
|
### Documentation
|
|||
|
|
- [ ] Document RawBufferBox design
|
|||
|
|
- [ ] Document capacity expansion strategy
|
|||
|
|
- [ ] Document push/pop algorithms
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
## Week 6: Index Operations & Fail-Fast
|
|||
|
|
|
|||
|
|
### Index Access
|
|||
|
|
- [ ] Implement `ArrayBox.get(index)` method
|
|||
|
|
- [ ] Implement `ArrayBox.set(index, value)` method
|
|||
|
|
- [ ] Implement bounds checking (index < 0 or index ≥ size)
|
|||
|
|
- [ ] Verify O(1) time complexity
|
|||
|
|
|
|||
|
|
### Fail-Fast Boundaries
|
|||
|
|
- [ ] Out-of-bounds access → RuntimeError (not panic)
|
|||
|
|
- [ ] Negative index → RuntimeError with clear message
|
|||
|
|
- [ ] Reject ValueBox elements (panic with clear message)
|
|||
|
|
- [ ] Ensure DataBox-only inputs
|
|||
|
|
|
|||
|
|
### Tests
|
|||
|
|
- [ ] Test valid index access (20 test cases)
|
|||
|
|
- [ ] Test out-of-bounds access (10 test cases)
|
|||
|
|
- [ ] Test negative index handling (5 test cases)
|
|||
|
|
- [ ] Test get/set sequence (10 test cases)
|
|||
|
|
- [ ] Test ValueBox rejection (Fail-Fast) (5 test cases)
|
|||
|
|
|
|||
|
|
### Documentation
|
|||
|
|
- [ ] Document index access design
|
|||
|
|
- [ ] Document bounds checking strategy
|
|||
|
|
- [ ] Document Fail-Fast error messages
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
## Week 7: Advanced ArrayBox Operations
|
|||
|
|
|
|||
|
|
### Slice Operation
|
|||
|
|
- [ ] Implement `ArrayBox.slice(start, end)` method
|
|||
|
|
- [ ] Return new ArrayBox with elements [start, end)
|
|||
|
|
- [ ] Handle edge cases (start > end, negative indices)
|
|||
|
|
- [ ] Handle out-of-bounds start/end (clamp or error)
|
|||
|
|
|
|||
|
|
### Concat Operation
|
|||
|
|
- [ ] Implement `ArrayBox.concat(other)` method
|
|||
|
|
- [ ] Create new ArrayBox with combined elements
|
|||
|
|
- [ ] Efficient memory allocation (pre-allocate total size)
|
|||
|
|
- [ ] Handle empty array concatenation
|
|||
|
|
|
|||
|
|
### ValueBox/DataBox Boundaries
|
|||
|
|
- [ ] Reject ValueBox elements in push/set (Fail-Fast)
|
|||
|
|
- [ ] Ensure DataBox-only inputs
|
|||
|
|
- [ ] Implement entry/exit point unpack logic
|
|||
|
|
- [ ] Clear error messages for boundary violations
|
|||
|
|
|
|||
|
|
### Tests
|
|||
|
|
- [ ] Test slice operation (15 test cases)
|
|||
|
|
- [ ] Test slice edge cases (start > end, out-of-bounds) (5 test cases)
|
|||
|
|
- [ ] Test concat operation (10 test cases)
|
|||
|
|
- [ ] Test concat empty arrays (3 test cases)
|
|||
|
|
- [ ] Test ValueBox/DataBox boundaries (5 test cases)
|
|||
|
|
|
|||
|
|
### Documentation
|
|||
|
|
- [ ] Document slice operation design
|
|||
|
|
- [ ] Document concat operation design
|
|||
|
|
- [ ] Document ValueBox/DataBox boundary enforcement
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
## Week 8: ArrayBox Golden Tests & Performance
|
|||
|
|
|
|||
|
|
### Golden Test Suite
|
|||
|
|
- [ ] Create 50+ test cases for ArrayBox
|
|||
|
|
- [ ] Compare Rust-ArrayBox vs Hako-ArrayBox output
|
|||
|
|
- [ ] Verify identical output for all test cases
|
|||
|
|
- [ ] Test bounds checking Fail-Fast behavior
|
|||
|
|
- [ ] Test slice/concat operations
|
|||
|
|
|
|||
|
|
### Performance Baseline
|
|||
|
|
- [ ] Measure push operation time (per 1,000 operations)
|
|||
|
|
- [ ] Measure pop operation time (per 1,000 operations)
|
|||
|
|
- [ ] Measure get operation time (per 1,000 operations)
|
|||
|
|
- [ ] Measure set operation time (per 1,000 operations)
|
|||
|
|
- [ ] Compare against Rust-ArrayBox
|
|||
|
|
- [ ] Verify performance ≥ 70% of Rust-ArrayBox
|
|||
|
|
- [ ] Profile hot paths (bounds checks, capacity expansion)
|
|||
|
|
|
|||
|
|
### Large-Scale Tests
|
|||
|
|
- [ ] Test 10,000 element array (push all, get all)
|
|||
|
|
- [ ] Stress test capacity expansion (0 → 10,000)
|
|||
|
|
- [ ] Measure memory usage (verify no leaks)
|
|||
|
|
- [ ] Test slice on large array (10,000 elements)
|
|||
|
|
- [ ] Test concat on large arrays (5,000 + 5,000)
|
|||
|
|
|
|||
|
|
### Documentation
|
|||
|
|
- [ ] Document ArrayBox API reference
|
|||
|
|
- [ ] Document usage examples (basic, advanced)
|
|||
|
|
- [ ] Document performance characteristics (O(1) amortized, O(n) worst case)
|
|||
|
|
- [ ] Document golden test results
|
|||
|
|
- [ ] Document performance benchmarks
|
|||
|
|
|
|||
|
|
### Week 8 Milestone Review
|
|||
|
|
- [ ] All ArrayBox methods implemented in Pure Hakorune
|
|||
|
|
- [ ] Golden tests: 50+ test cases PASS
|
|||
|
|
- [ ] Bounds checking Fail-Fast verified
|
|||
|
|
- [ ] Performance ≥ 70% of Rust-ArrayBox
|
|||
|
|
- [ ] Large-scale tests (10,000 elements) PASS
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
## Phase 20.7 Final Verification
|
|||
|
|
|
|||
|
|
### Combined Golden Tests
|
|||
|
|
- [ ] Run all MapBox golden tests (50+ cases)
|
|||
|
|
- [ ] Run all ArrayBox golden tests (50+ cases)
|
|||
|
|
- [ ] Verify 100+ total test cases PASS
|
|||
|
|
- [ ] Verify deterministic behavior across all tests
|
|||
|
|
- [ ] Verify ValueBox/DataBox boundaries enforced
|
|||
|
|
|
|||
|
|
### Performance Validation
|
|||
|
|
- [ ] MapBox performance ≥ 70% of Rust-MapBox
|
|||
|
|
- [ ] ArrayBox performance ≥ 70% of Rust-ArrayBox
|
|||
|
|
- [ ] Large-scale tests (10,000 elements) practical speed
|
|||
|
|
- [ ] No memory leaks detected
|
|||
|
|
|
|||
|
|
### Integration Tests
|
|||
|
|
- [ ] Test MapBox with ArrayBox values
|
|||
|
|
- [ ] Test ArrayBox with MapBox elements
|
|||
|
|
- [ ] Test nested collections (Map of Arrays, Array of Maps)
|
|||
|
|
- [ ] Test with selfhost compiler (use collections in compiler code)
|
|||
|
|
|
|||
|
|
### Documentation Complete
|
|||
|
|
- [ ] README.md finalized (Phase 20.7 overview)
|
|||
|
|
- [ ] PLAN.md finalized (implementation details)
|
|||
|
|
- [ ] INDEX.md updated (all references correct)
|
|||
|
|
- [ ] CHECKLIST.md completed (this file)
|
|||
|
|
- [ ] API reference complete (MapBox, ArrayBox)
|
|||
|
|
- [ ] Performance benchmarks documented
|
|||
|
|
|
|||
|
|
### Readiness for Phase 20.8
|
|||
|
|
- [ ] Collections ready for GC root scanning
|
|||
|
|
- [ ] Reference tracking infrastructure in place
|
|||
|
|
- [ ] Deterministic iteration verified (for mark phase)
|
|||
|
|
- [ ] No Rust dependencies (except HostBridge)
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
## Phase 20.7 Success Criteria (Final)
|
|||
|
|
|
|||
|
|
### Mandatory (✅ All must be checked)
|
|||
|
|
- [ ] MapBox/ArrayBox fully in Pure Hakorune
|
|||
|
|
- [ ] No Rust dependencies (except HostBridge)
|
|||
|
|
- [ ] Golden tests: 100+ test cases PASS
|
|||
|
|
- [ ] Rust-Collections vs Hako-Collections: 100% parity
|
|||
|
|
- [ ] Deterministic behavior verified (Symbol < Int < String)
|
|||
|
|
- [ ] Iteration order stable
|
|||
|
|
- [ ] Provenance tracking works
|
|||
|
|
- [ ] Performance ≥ 70% of Rust-Collections
|
|||
|
|
- [ ] Basic operations (set/get/push/pop) O(1) average time
|
|||
|
|
- [ ] Large-scale data (10,000 elements) practical speed
|
|||
|
|
|
|||
|
|
### Excluded (⚠️ NOT in Phase 20.7)
|
|||
|
|
- [ ] Confirmed: GC not implemented (deferred to Phase 20.8)
|
|||
|
|
- [ ] Confirmed: No optimization beyond basic implementation
|
|||
|
|
- [ ] Confirmed: Single-threaded only (no concurrency)
|
|||
|
|
- [ ] Confirmed: In-memory only (no persistence)
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
**Status**: PLANNED
|
|||
|
|
**All Checkboxes**: Uncompleted ([ ])
|
|||
|
|
**Review Date**: Week 4 (2026-06-22), Week 8 (2026-07-19)
|
|||
|
|
**Phase End Date**: 2026-07-19
|
|||
|
|
## C‑ABI Bridge (Basic boxes)
|
|||
|
|
|
|||
|
|
### Flags & Wiring
|
|||
|
|
- [ ] Add and document flags: `NYASH_ABI_BASIC_ON`, `NYASH_ABI_BUILTIN_LINK`
|
|||
|
|
- [ ] Router: MirCall(Constructor/Method) → rt_boxcall → ABI dispatch(flag gate)
|
|||
|
|
- [ ] Built‑in preset: enable static link + LTO(Two‑Layer Exportで inline)
|
|||
|
|
|
|||
|
|
### Parity Tests (VM/LLVM/Hako)
|
|||
|
|
- [ ] String.length/indexOf/substring parity(3×3 cases)
|
|||
|
|
- [ ] Array.push/size/get/set/slice parity(5×3 cases)
|
|||
|
|
- [ ] Map.set/get/keys/values/size parity(5×3 cases)
|
|||
|
|
- [ ] Unknown Box / Capability violation → Fail‑Fast diagnostic fixed
|
|||
|
|
|
|||
|
|
### Performance
|
|||
|
|
- [ ] Benchmark ABI path vs Rust path(≥ 70% target)
|
|||
|
|
- [ ] Collect baseline for quick/integration presets
|
|||
|
|
|
|||
|
|
### Pilot Rollout(段階ON)
|
|||
|
|
- [ ] Week 1(quick): String.length → ABI ON(48h 観測)
|
|||
|
|
- [ ] Week 2(quick): Array.size/push → 追加 ON(48h 観測)
|
|||
|
|
- [ ] Week 3‑4(quick): Map.set/get → 追加 ON(観測)
|
|||
|
|
- [ ] Week 5: integration へ横展開(String/Array/Map)
|
|||
|
|
- [ ] Week 6‑7: 性能/診断の最終調整
|
|||
|
|
- [ ] Week 8: 既定ON 判定/またはロールバック継続
|
|||
|
|
|
|||
|
|
### Diagnostics / Safety
|
|||
|
|
- [ ] `NYASH_ABI_BASIC_DIAG=1` の実装(既定OFF)とログ整形
|
|||
|
|
- [ ] retain/release リーク・ガード(テスト専用)
|
|||
|
|
- [ ] ロールバック手順の docs 固定(flags=0)
|
|||
|
|
|
|||
|
|
### CI Matrix(最小拡張)
|
|||
|
|
- [ ] quick(ABI ON)ジョブ追加
|
|||
|
|
- [ ] 既存 quick/integration(ABI OFF)緑維持
|
|||
|
|
|
|||
|
|
---
|