Phase 12: 統一TypeBox ABI実装開始 - ChatGPT5による極小コアABI基盤構築

- TypeBox ABI雛形: メソッドスロット管理システム追加
- Type Registry: Array/Map/StringBoxの基本メソッド定義
- Host API: C ABI逆呼び出しシステム実装
- Phase 12ドキュメント整理: 設計文書統合・アーカイブ化
- MIR Builder: クリーンアップと分離実装完了

🤖 Generated with [Claude Code](https://claude.ai/code)

Co-Authored-By: Claude <noreply@anthropic.com>
This commit is contained in:
Moe Charm
2025-09-03 05:04:56 +09:00
parent e2e25f6615
commit 53d88157aa
84 changed files with 4739 additions and 2750 deletions

View File

@ -0,0 +1,69 @@
# Nyash ABI Minimal Core and Evolution Strategy
目的
- 極小コアのみABI凍結し、将来拡張は交渉予約フォールバックで吸収する。
- VM/JIT/プラグインを同じ枠組みTypeBox + vtable + NyrtValueに統一する。
最小コア(凍結対象)
- NyrtValue: 16B固定 `#[repr(C)]``tag:u32 | reserved:u32 | payload:u64`
- InstanceHeader: 先頭に `vtbl:*const NyVTable, refcnt:u32, flags:u32`(実体は不透明)
- NyMethodFn: `fn(ctx:*mut VmCtx, recv:*mut InstanceHeader, args:*const NyrtValue, argc:u32, out:*mut NyrtValue) -> NyStatus`
- NyVTable: `abi_version:u32, type_id:u128, methods:*const NyVEntry, methods_len:u32, /*reserved*/`
- NyVEntry: `NyMethodSig + NyMethodFn`
- Selector: `selector_id:u64`xxh3_64推奨。衝突時は文字列による二段判定。
エボリューション・ハッチ(逃げ道)
- struct_size: すべての公開構造体先頭に `struct_size:u32` を置く。
- Feature bits: `RuntimeApi``feature_bits:u128` を返し機能交渉。
- 予約領域: `selector_id` の上位レンジ(例: `0xF000...`)は内部/拡張に予約。
- フォールバック: vtable未解決 → PIC → 汎用ディスパッチへ必ず落ちる。
- VmCtxは不透明: `get_ctx_api(version)` で関数テーブルを取得(中身は自由)。
互換ポリシー
- SemVer+ABI: 例 `nyash 0.13.0 / ABI 1`。破壊的変更は ABI++、非破壊は feature_bits++。
- 既存selectorの意味は変えない/削除しない非推奨→2リリース猶予
- vtable項目の順序非依存二分探索前提
- ランタイムは ABI(現行, 現行-1) をサポート。
安全ルール
- 例外横断禁止: 例外/パニックは NyStatus に畳み込むunwind禁止
- 所有権: 越境は基本 own。borrowは同期フレーム内のみ。handleはHostHandle経由。
- メモリ規約: retain/release か refcnt を明文化。ヘッダに将来予約フラグ。
- 実装前提: LE/64bit固定flagsにも宣言
性能レール
- ディスパッチ順: vtable直行 → PIC(最大4) → 汎用。
- AOT/JIT: `len()` hoist、境界チェック併合、純関数/no_throw の軽量inline。
- メトリクス: ICヒット率/ガード失敗率/レイテンシを収集(`NYASH_ABI_TRACE=1`)。
“全部Box”統一ポイント
- ユーザー/プラグイン/内蔵 = 同じ `InstanceHeader + NyVTable`
- TypeRegistry に `register(Arc<NyVTable>)``NYASH_ABI_STRICT=1` で未登録/不一致は即エラー。
最小ヘッダC向けスケッチ
```c
typedef struct { uint32_t struct_size, tag, reserved; uint64_t payload; } NyrtValue; // 16B
typedef struct InstanceHeader InstanceHeader; // opaque
typedef int32_t NyStatus;
typedef NyStatus (*NyMethodFn)(void* ctx, InstanceHeader* recv,
const NyrtValue* args, uint32_t argc, NyrtValue* out);
typedef struct { uint32_t struct_size, abi_version; unsigned __int128 type_id; const char* type_name;
void (*drop_fn)(InstanceHeader*); InstanceHeader* (*clone_fn)(const InstanceHeader*);
const struct NyVEntry* methods; uint32_t methods_len; /* reserved */ } NyVTable;
typedef struct { uint32_t struct_size, abi_version; uint64_t selector_id; uint16_t arity, flags, reserved; } NyMethodSig;
typedef struct NyVEntry { NyMethodSig sig; NyMethodFn fn_ptr; } NyVEntry;
```
テストとツール
- ABI Compliance: C/C++/Rust雛形を自動生成→ロード→全selector呼出で比較。
- ワイヤ互換: 現行/前ABIの双方でロード→結果一致をCIで検証。
- ヘッダ自動生成: `cbindgen/abi-dumper` で差分チェック。
- 同一実行: VM/JIT の二重実行で戻り値/副作用/ログの一致を比較。
即実行チェックリスト
- [ ] `nyash_abi.{rs,h}` に最小コア定義struct_size/feature_bits付き
- [ ] `RuntimeApi` と feature_bits 交渉の雛形。
- [ ] `execute_boxcall`: vtable直行→PIC→汎用の三段整備STRICTガード
- [ ] TypeRegistry: Array/Map/String の "get/set/len" を登録→vtable優先呼び出し。
- [ ] ABIコンプライアンステストと同一実行テストの設計をdocsに反映。