Files
hakorune/docs/archive/consultations/plugin_interface_design_discussion_2025-08-17.md
Moe Charm cc2a820af7 feat(plugin): Fix plugin BoxRef return and Box argument support
- Fixed deadlock in FileBox plugin copyFrom implementation (single lock)
- Added TLV Handle (tag=8) parsing in calls.rs for returned BoxRefs
- Improved plugin loader with config path consistency and detailed logging
- Fixed loader routing for proper Handle type_id/fini_method_id resolution
- Added detailed logging for TLV encoding/decoding in plugin_loader_v2

Test docs/examples/plugin_boxref_return.nyash now works correctly:
- cloneSelf() returns FileBox Handle properly
- copyFrom(Box) accepts plugin Box arguments
- Both FileBox instances close and fini correctly

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

Co-Authored-By: Claude <noreply@anthropic.com>
2025-08-21 00:41:26 +09:00

3.3 KiB
Raw Blame History

プラグインインターフェース設計討論 (2025-08-17)

🎯 議題BID-FFIプラグインシステムの設計

背景

  • ビルトインFileBoxが既に存在
  • BID-FFIプラグイン版FileBoxで置き換えたい
  • ビルド時間短縮とプラグインアーキテクチャの実証が目的

主な論点

  1. ビルトインBox → プラグインBoxの透過的な置き換え
  2. FileBox.open() のような静的メソッドの結びつけ方
  3. プラグインインターフェース定義の外部化方式

💡 検討した案

案1: 汎用ラッパー

// 呼び出しが汚い
local file = Plugin.call("FileBox", "open", ["test.txt", "r"])

案2: 専用ラッパー

// きれいでも各Boxごとに手書きが必要
local file = FileBox.open("test.txt")

案3: BoxDispatcher透過的ディスパッチ

pub enum BoxImpl {
    Builtin(Box<dyn NyashBox>),     // ビルトイン実装
    Plugin(BidHandle, PluginRef),    // プラグイン実装
}

案4: Unified Box Factory

pub struct BoxFactory {
    providers: HashMap<String, Box<dyn BoxProvider>>,
}

🎉 最終解YAML/JSON + 署名DSL

Codex先生の推奨設計

# filebox.plugin.yaml
schema: 1
plugin:
  name: filebox
  version: 1
  
apis:
  # 静的メソッド(::
  - sig: "FileBox::open(path: string, mode?: string) -> FileBox"
    doc: "Open a file"
    
  # インスタンスメソッド(#
  - sig: "FileBox#read(size?: int) -> string"
    doc: "Read file content"

利点

  1. 記号で静的/インスタンスを区別

    • :: = 静的メソッドC++風)
    • # = インスタンスメソッドRuby風
  2. フラット構造

    • apis 配列にすべて並べる
    • 階層が深くならない
  3. 署名DSL

    • 型情報を1行で表現
    • パーサーも簡単
  4. YAML → JSON変換

    • 開発時YAML人間に優しい
    • 実行時JSONマシンに優しい

🤔 Gemini先生への質問事項

  1. 透過的な置き換え

    • 既存のNyashコードを一切変更せずに、ビルトインBoxをプラグインBoxに置き換える最良の方法は
    • パフォーマンスインパクトをどう最小化するか?
  2. 署名DSLの設計

    • Type::method() vs Type.method() の選択理由
    • オーバーロードの表現方法
    • ジェネリクスの将来的な拡張性
  3. 実装戦略

    • インタープリター実行時のディスパッチ最適化
    • プラグインの遅延ロード実装
    • エラーハンドリングのベストプラクティス
  4. Everything is Box哲学との整合性

    • プラグインBoxもビルトインBoxも「同じBox」として扱う方法
    • Box型の統一インターフェースの維持
  5. 実用性

    • 他の言語Python、Ruby、JavaScriptの成功例から学べること
    • プラグイン作者にとっての開発体験
    • デバッグ・プロファイリングの考慮事項

📚 参考情報

  • 現在のFileBox実装: src/boxes/file/mod.rs
  • BID-FFIプラグインFileBox: src/bid/plugins/filebox/mod.rs
  • Everything is Box哲学: すべての値がBoxオブジェクト
  • Nyashの目標: シンプル、分かりやすい、階層が深くならない