- Create comprehensive type definitions for all future features - Adopt FFI ABI v0 compliance with platform-aware pointers (usize) - Implement 8-byte alignment for cross-platform compatibility - Design single entry point: nyash_plugin_invoke - Target Linux x86-64 for initial implementation - Use unimplemented!() for gradual feature addition Key decisions from AI review: - Pointer width: platform-dependent (not fixed 32-bit) - Early addition of Option/Result types - Clear ownership rules for strings/arrays - Extensible BoxHeader with magic number Phase 9.75g-0: Build it simple, make it work, then extend!
6.8 KiB
6.8 KiB
BID設計 AI大会議記録 (2025-08-17)
参加者
- Gemini先生
- ChatGPT先生(GPT-5)
- Claude(司会・まとめ)
議題
Nyashプログラミング言語のBID(Box Interface Definition)設計について
Gemini先生の回答
1. 複雑性について
回答: 過度な複雑性とは思いません。むしろ、Rustのトレイトを用いた抽象化は、このようなシナリオで非常にうまく機能します。
推奨アプローチ:
UniversalConnectorトレイトのAPIを設計します。- 最初の具体的な実装として
DynamicLibraryConnectorのみを実装します。 - 他のコネクター(
GrpcConnectorなど)は、構造体だけ定義しておくか、todo!()マクロで未実装を示す形にしておきます。
2. 型システムについて
回答: MirValue(Nyashの内部値表現)のような中間表現に一度変換するアプローチは、FFIやRPCにおいて非常に現実的かつ一般的な解決策です。
推奨アプローチ:
- サポートする型を限定することから始めます。 まずは数値、文字列、真偽値、そして「ハンドル(不透明ポインタやID)」のような基本的な型に絞ります。
- 複雑な型(Nyashのオブジェクトや配列など)は、シリアライズ(JSONやMessagePackなど)して文字列やバイト配列として渡す、というルールを設けることも有効です。
3. 性能について
結論として、UniversalConnector トレイトによる抽象化自体の性能への影響は軽微です。 パフォーマンスが重要な場合は、一度の呼び出しで多くの作業を行うような粒度の大きいAPI(例: process_batch(data)) をBIDで定義することが効果的です。
4. エラー処理について
回答: はい、可能です。これは統一抽象化レイヤーの大きな利点の一つです。Rustの enum を使って統一的なエラー型を定義することを強く推奨します。
#[derive(Debug, thiserror::Error)]
pub enum BidError {
#[error("Transport layer error: {0}")]
Transport(#[from] Box<dyn std::error::Error + Send + Sync>),
#[error("Interface error: {0}")]
Interface(String),
#[error("Connection setup failed: {0}")]
Connection(String),
#[error("Remote execution error: {0}")]
Remote(String),
}
5. 段階的実装について
回答: 提案されている実装順序は非常に合理的で、リスクを最小限に抑えつつ着実に進められる優れたロードマップです。
6. 既存システムとの比較について
BIDの独自価値は、「Everything is a Box」というNyashのコア哲学を、言語の境界を越えて外部世界にまで拡張する点に尽きます。
7. セキュリティについて
回答: 現段階では過剰設計の可能性が高いです。
推奨アプローチ:
- 今は実装しない。
- ただし、将来の拡張ポイントとしてBID定義に
permissionsのようなオプショナルなセクションを設けることだけは念頭に置いておくと良いでしょう。
まとめ
最適なバランスを取るための鍵は、「抽象(インターフェース)と具象(実装)の分離」です。
ChatGPT先生の回答
結論と全体方針
- 二層化コア: BIDは「型/意味」レイヤー、コネクタは「バインディング/トランスポート」レイヤーに厳密分離
- 最小中核の固定化: まずC ABI動的ライブラリ+同期単発呼び出し(unary)+最小型集合+統一エラーの4点を固める
- コード生成前提: YAML BIDからRust/他言語のスタブ/スケルトンを自動生成
- 場所透過の現実解: API設計で「粗粒度・バッチ・ストリーミング」を促す
Transport/Connectorの設計
- 二経路最適化:
- 同一プロセス(C ABI/
*.so): 直関数ポインタ呼び出し(ゼロコピー)=最速経路 - 遠隔/ブリッジ: 仕様化した「カノニカルエンコーディング(NCE)」で
invoke
- 同一プロセス(C ABI/
型システム(MirValueの現実解)
- 最小型集合:
bool,i32/i64,f64,string(utf8),bytes,list<T>,map<string,T>,record{...},variant{...},option<T>,result<Ok,Err>,resource<T>(ハンドル),opaque<T> - Resource/Handle:
resource<File>のように"ホスト所有でクローズを要する"型を明示
性能指針
- ホットパス確保: C ABI経路は関数ポインタ直叩き(
#[repr(C)]vtable) - N回呼び出し禁止: tight loop/粒度の細かいRPCは不可
- バッチ/ストリーミング: 将来の
client_stream/server_stream/bidiを型で表現
エラー処理(統一モデル)
- BoxErrorコア:
code(u32),category(enum),transport(enum),message,data(optional record),retryable(bool),idempotent_safe(bool)
YAML BIDの拡張例
version: 1
transport:
type: dynamic_library
location: ./libnyash_file.so
interfaces:
- namespace: nyash
name: file
uuid: "c1b9...-..." # 安定ID
version: "1.0.0"
types:
- name: Handle
type: resource<File>
methods:
- name: open
shape: unary
params:
- { name: path, type: string }
- { name: mode, type: string }
returns: { type: resource<File> }
effects: [fs, io]
errors: [NotFound, Permission, Invalid]
idempotent: false
既存システムとの比較
- WASM Component Model (WIT): 強力なIDL/型・言語間互換が成熟。Nyashは「同プロセスC ABI最速+後でWASM追加」を差別化軸に
- gRPC(Protobuf): ネットワークRPCの王道。Nyashは"ハンドルと効果"の第一級概念で優位
- COM/CORBA: 位置透過・IFace/VTable思想は近いが、現代的DX/ツールが乏しい
セキュリティ指針
- ケーパビリティ必須(段階導入): メソッド/リソース単位の権限をBIDで宣言
- 信頼境界で実行形態を変える:
- 信頼済み: C ABI
*.so(最速) - 準信頼/第三者: 別プロセス+gRPC/REST
- 非信頼: WASMサンドボックス
- 信頼済み: C ABI
共通見解まとめ
- 抽象化は適切 - UniversalConnectorトレイトは良い設計
- MirValue統一は現実的 - 型変換は各Connector実装が担当
- 性能への影響は軽微 - 抽象化レイヤー自体のオーバーヘッドは無視できる
- 段階的実装が鍵 - Phase 1: C ABI動的ライブラリのみ
- セキュリティは後回し - 現段階では過剰設計
結論
BIDの設計は健全で将来性がある。シンプルに始めて段階的に拡張する方針で進める。