Skip to content

バインディング

バインディングはホスト環境にワークブック操作を公開し、計算はコアに残します。それぞれのバインディングは片側でホスト言語の慣用、もう片側で C ABI を扱います。

用語: binding(バインディング)

ホスト型(Uint8Array / bytes / bytearray / std::span など)をエンジン入力に、エンジン出力をホスト型に変換する薄い層です。バインディングは数式の意味論を実装せず、データの形を整え、ライフタイムを管理します。

担当すること

  • ホストのバッファを C ABI が受け取れるワークブックバイトに変換する。
  • ワークブックハンドルとライフタイムを管理する(WASM の delete()、Python の context manager、Native Node の GC 紐付け、CLI / MCP のプロセス寿命)。
  • スプレッドシート値をホスト値に変換し、ValueKind を保つ(セルエラーが例外ではなく値であり続けるように)。
  • 計算エラーと IO エラーを公開する(スプレッドシート error 値を失わない形で)。
  • 各ホスト用の API を公開する。

担当しないこと

バインディングは次のことを しません

  • 数式の意味論を実装する(パーサ / 評価器はコア)
  • ワークブックのパースを重複実装する(OOXML / XLSB のリーダーはコア)
  • プロファイル固有挙動を追加する(プロファイルはワークブック状態であり、C ABI 経由で設定される)
  • 独自の dirty 集合・依存関係グラフ・再計算スケジューラを導入する(すべてコア側)

binding で Excel を再実装しないこと

ある関数結果を特別扱いしたい、ある値をコアと違う形で変換したい。そう思ったら正解はコア側にあります。評価器にケースを追加し、Oracle ゴールデンデータを追加すれば、全バインディングが同時にその挙動を取り込めます。バインディングごとに修正するとずれが早く広がります。

実例

バインディング扱うホスト慣用触らない領域
WASMUint8Array、ステータス envelope、ValueKind enum、非同期モジュールファクトリ関数意味論・ファイルパース・計算グラフ
Native NodeN-API Buffer、同期 API、GC 紐付けハンドル関数意味論・ファイルパース・計算グラフ
Pythonbytes、context manager、FormulonErrorValue.to_python()関数意味論・ファイルパース・計算グラフ
CLIargv、stdin / stdout / stderr、終了コード関数意味論・ファイルパース・計算グラフ
MCPJSON 入出力、セッションマップ、許可リストに基づく呼び出し関数意味論・ファイルパース・計算グラフ

次に読むもの