ライブラリのポリグロット バインディング ジェネレーター。
Rust で堅牢なライブラリを作成し、2 番目に好きな言語から簡単にアクセスします。
Rust で単一の.dll
/ .so
を設計し、どこからでも利用できます。
QoL 機能 (クラス、文字列など) を備えた言語でそれらを取得します。
常に適切な C 互換 API を用意してください。
痛みのないワークフロー、外部ツールは必要ありません。
より多くの言語をサポートしやすく、バックエンドはメインプロジェクトから完全に分離されています。
私たちは生成されたバインディングをゼロコストにするよう努めています。これらは、自分で合理的に作成できる限り慣用的なものである必要がありますが、実際に公開したいインターフェイスを魔法で隠したり、隠したりすることは決してしないでください。
interoptopus::{ffi_function, ffi_type, Inventory, InventoryBuilder, function};#[ffi_type]pub struct Vec2 {pub x: f32,pub y: f32,}#[ffi_function]pub fn my_function(input: Vec2) {println! を使用します。 ("{}", input.x);}// FFI インターフェースを次のように定義します。 // 単一関数 `my_function` を含む `ffi_inventory`。タイプは推論されます。pub fn ffi_inventory() -> Inventory {InventoryBuilder::new().register(function!(my_function)).validate().inventory()}
言語 | 木箱 | サンプル出力1 |
---|---|---|
C# | interoptopus_backend_csharp | 相互運用機能 |
C | interoptopus_backend_c | my_header.h |
パイソン | interoptopus_backend_cpython | 参照.py |
他の | 独自のバックエンドを作成する2 | - |
1参照プロジェクトの場合。
2わずか数時間で新しい言語のサポートを追加します。プルリクエストは必要ありません。ピンキーの約束。
あなたがしたい場合は ...
始めましょう、 Hello World を見てください、
プロジェクトを製品化し、実際のプロジェクトのレイアウトを確認し、
何が可能なのかを理解してください。参照プロジェクトを参照してください。
新しい言語をサポートするには、 C バックエンドをコピーします。
概要については、参照プロジェクトを参照してください。
関数 (独立した関数とデリゲート)
タイプ (コンポジット、列挙型、不透明、参照など)
定数 (プリミティブ定数、const 評価の結果)
パターン (ASCII ポインター、オプション、スライス、クラスなど)
生成された低レベルのバインディングは、その言語用に手作りされたバインディングに関してはコストがかかりません。
とはいえ、手動で作成されたバインディングでも、FFI 境界でターゲット固有のオーバーヘッドが発生します (マネージド言語でのマーシャリングやピン留めなど)。 C# の場合、コストは多くの場合ナノ秒ですが、Python CFFI の場合はマイクロ秒になる場合があります。
最終的には言語の FFI パフォーマンスについてできることは何もありませんが、呼び出しコストを意識することは、より良い API を設計するのに役立ちます。
詳細な通話料金表は次の場所にあります。
C# 呼び出しのオーバーヘッド
Python 呼び出しのオーバーヘッド
簡単に概要を説明するために、次の表にns / callの最も一般的なコール タイプを示します。
構築する | C# | パイソン |
---|---|---|
primitive_void() | 7 | 272 |
primitive_u32(0) | 8 | 392 |
many_args_5(0, 0, 0, 0, 0) | 10 | 786 |
callback(x => x, 0) | 43 | 1168 |
機能フラグの背後にあるゲートにより、以下が可能になります。
derive
- ffi_type
などの Proc マクロ
serde
- 内部型の Serde 属性。
log
- FFI エラー時にログを呼び出します。
v0.15 - 大規模なクリーンアップ、バグ修正、UX のオーバーホール (+syn2)。
v0.14 - インベントリの UX が向上しました。
v0.13 - Python バックエンドはctypes
使用するようになりました。
v0.12 - #[ffi_service_method]
を使用した互換性の向上。
v0.11 - C# はクターを静的メソッドに切り替えます。
v0.10 - C# フレーバーDotNet
およびUnity
(バーストを含む)。
v0.9 - 150 倍高速な C# スライス、Python の型ヒント。
v0.8 - テスト機能をそれぞれのバックエンドに移動しました。
v0.7 - より良い FFI ドキュメントのためにパターン proc マクロを作成します。
v0.6 - 名前を変更し、多くのパターンを明確にしました。
v0.5 - Rust および FFI でのより人間工学に基づいたスライスの使用。
v0.4 - 自動生成された FFI 呼び出しでのログ記録サポートを有効にします。
v0.3 - ジェネリックとの互換性が向上しました。
v0.2 - 「パターン」を導入しました。 C# の相互運用性が機能します。
v0.1 - 最初のバージョン。
アップグレード手順も参照してください。
よくある質問と安全ガイド。
PRの方も大歓迎です。
小さなバグ修正を直接送信してください。大きな変更が最初に問題になるはずです。
以前に動作していたバインディングの動作が変わったり、コンパイルが停止したりするものはすべて、大きな変更です。
これは、何かを壊すことに反対しているという意味ではなく、それが起こる前にそれについて話しておきたいというだけです。
新しい機能またはパターンは参照プロジェクトで具体化され、少なくとも 1 つの含まれるバックエンドでの相互運用テスト (つまり、そのコードを呼び出す DLL に対して C# / Python を実行するバックエンド テスト) を伴う必要があります。