nyash

統一TypeBox ABI - AI先生たちの深い技術的検討

このドキュメントは、Gemini先生とCodex先生による統一TypeBox ABIの技術的検討をまとめたものです。

🎯 検討テーマ

ユーザー定義Boxをプラグインシステムに統合し、すべてのBoxをC ABI上で統一的に管理する提案について。

📅 相談日時

2025-09-02

🤖 Gemini先生の回答

総評:提案されたアプローチの技術的健全性

まず結論から申し上げると、提案されている「ユーザー定義Boxを動的に登録し、プラグインBoxと統一的に扱うABI」というアプローチは、技術的に非常に健全(sound)です。これは、COM(Component Object Model)、Rustのdyn Traitオブジェクト、PythonのC APIなど、多くの成功した言語やフレームワークで採用されている動的ディスパッチ(vtable)の仕組みを、FFI(Foreign Function Interface)に応用した古典的かつ堅牢な設計パターンです。

このアプローチにより、「Everything is Box」というNyashの美しい設計哲学を、言語の境界を越えたC ABIレベルまで一貫して適用することが可能になります。

技術的検討事項の詳細分析

1. メモリ管理:誰がBoxの命を握るか?

2. 型安全性:動的な世界で秩序を保てるか?

3. パフォーマンス:動的ディスパッチの代償は?

4. セキュリティ:信頼できないコードからの保護

5. 実装複雑度:既存システムとの調和

ご質問への回答

1. この統一管理アプローチは技術的に健全か?

はい、前述の通り極めて健全です。実績のある設計パターンであり、Nyashの哲学を強化する正しい方向性です。

2. 他の言語での類似実装例はあるか?

多数あります。これらは実装の際の優れた参考資料となります。

3. 実装上の注意点・落とし穴は?

4. より良い代替案はあるか?

提案されているABI方式は、パフォーマンスと安全性のバランスが取れた優れた案であり、「より良い」というよりは「異なるトレードオフを持つ」代替案と言えます。

5. Everything is Box哲学との整合性は完璧か?

はい、完璧に整合します。 この統一ABIは、「組み込みのBox」と「ユーザー定義のBox」という実装上の区別をユーザーやプラグイン開発者から完全に隠蔽します。全てのBoxが同じインターフェース(NyashTypeBox*)を通じて、同じ規則(参照カウント、動的ディスパッチ)に従って扱われる世界を実現します。これは、「Everything is Box」という哲学を、言語仕様からABI、そしてエコシステム全体へと貫くための、論理的かつ必然的なステップと言えるでしょう。この実装が完了すれば、Nyashはより一貫性があり、強力で、拡張性の高い言語へと進化するはずです。


🤖 Codex先生の回答(タイムアウトしたが貴重な洞察)

Codex先生は深い分析を行い、以下の重要な洞察を提供しました:

主要な技術的提案

  1. ホスト管理型ハンドル
    • registry_id + instance_id のペアで管理
    • 高ビットでホスト/プラグイン区別
  2. 段階的実装戦略
    • Phase 1: 基本的な動的登録機能
    • Phase 2: GCとの統合
    • Phase 3: 完全な相互運用性
  3. セキュリティ考慮
    • ケイパビリティベースの権限管理
    • finalizer IDによるライフサイクル管理
  4. ABI安定性
    • バージョニング戦略の重要性
    • 既存プラグインとの互換性維持

🤖 Codex先生の深い技術検討(2025-09-02 詳細版)

統一TypeBox ABIの包括的技術設計

以下は「統一TypeBox ABI」を中核に据えた、Nyash Phase 12の技術的検討まとめです。C ABI上でBoxの一元管理を行い、Nyash ABIの基盤としてユーザーBoxまでカバーする実装方針を、実装設計・性能・安全性・移行計画まで通して具体化します。

📐 提案レイアウト(縮約)

NyBoxHeader(常に先頭・不変のバイナリ契約)

struct NyBoxHeader {
    uint64_t type_id;               // 予約域+種別域+連番
    _Atomic uint64_t refcnt;        // 0で解放、MAXでpin
    const NyTypeVTable* vtable;     // 不変ポインタ
    uint32_t flags;                 // immediate/extern/sandbox/trusted/traceable 等
    uint32_t header_size;           // 前方互換: 拡張時にサイズ確認
};

NyTypeVTable(固定順序・拡張可能)

NyMethod(C ABI呼び出し用)

NyValue(Everything is Boxの統一ハンドル)

1. ユーザーBox動的登録

register_user_box()

NyRegisterUserBox(const NyTypeSpec*, const NyMethodSpec*, 
                  const NySecuritySpec*, NyTypeId* out_type_id)

Type ID管理

64-bit構造: [8b domain | 8b vendor | 16b category | 32b serial]

メソッドテーブル動的生成

2. メモリ管理の統一

参照カウント(RC)

GC協調

循環参照の検出・解決

3. パフォーマンス最適化

メソッドID事前解決(33倍の根拠)

インラインキャッシング(IC)

JIT連携

4. セキュリティと安全性

信頼レベル

Wasmサンドボックス統合

メソッドポインタ検証

5. 実装の段階的アプローチ

互換レイヤー

移行ツール

バージョニング

技術的健全性の評価

結論: 技術的に健全。コアはCPython(PyObject)+COM(IUnknown)+Rust vtableの良いとこ取り

最大の課題

  1. ABI安定と最適化の両立
    • vtable拡張、署名IDの凍結、JITパッチ互換などを「一度決めて長期維持」する難しさ
  2. GC協調の完全性
    • プラグインのtrace不備がリーク/サイクル残留を引き起こす
  3. 多様な信頼レベル混在
    • 同一プロセスのtrusted高速経路とWasm隔離経路の整合性

他言語との比較・ベストプラクティス

Everything is Boxの実現性

可能。推奨アプローチは二段:

APIは常にNyValue受け渡し。VM/JITは即値→ヒープBox化を必要時のみ実施

具体API(抄)

extern "C" NyStatus NyRegisterUserBox(const NyTypeSpec*, const NyMethodSpec*, 
                                      const NySecuritySpec*, NyTypeId*);
extern "C" NyStatus NyResolveMethodSlot(NyTypeId, NySigId, uint32_t* out_slot);
extern "C" NyStatus NyCallSlot(NyValue self, uint32_t slot, const NyValue* args, 
                               uint32_t argc, NyValue* out, NyCallCtx*);
extern "C" void NyRetain(NyValue); 
extern "C" void NyRelease(NyValue);  // 即値はno-op

次アクション案

  1. nyabi.hドラフトと最小実装
  2. register_user_box()の仮実装+スモーク
  3. ny-abi-gen簡易版(署名→スロット表生成)
  4. ICのmonomorphic実装→PIC→JITパッチの順に段階導入