Der polyglotte Bindungsgenerator für Ihre Bibliothek.
Schreiben Sie eine robuste Bibliothek in Rust und greifen Sie problemlos von Ihrer zweiten Lieblingssprache aus darauf zu:
Entwerfen Sie eine einzelne .dll
/ .so
in Rust und nutzen Sie sie von überall aus.
Erhalten Sie QoL-Funktionen (z. B. Klassen, Zeichenfolgen) in Sprachen, die diese enthalten.
Verfügen Sie immer über eine vernünftige, C-kompatible API.
Problemloser Arbeitsablauf, keine externen Werkzeuge erforderlich.
Einfache Unterstützung weiterer Sprachen, Backends vollständig vom Hauptprojekt entkoppelt.
Wir sind bestrebt, unsere generierten Bindungen zum Nulltarif zu machen. Sie sollten so idiomatisch sein, wie Sie sie vernünftigerweise selbst hätten schreiben können, aber niemals Magie oder das Verstecken der Benutzeroberfläche, die Sie eigentlich offenlegen wollten.
use 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);}// Definieren Sie unsere FFI-Schnittstelle als „ffi_inventory“, das// eine einzelne Funktion enthält „meine_Funktion“. Typen werden abgeleitet.pub fn ffi_inventory() -> Inventory {InventoryBuilder::new().register(function!(my_function)).validate().inventory()}
Sprache | Kiste | Beispielausgabe 1 |
---|---|---|
C# | interoptopus_backend_csharp | Interop.cs |
C | interoptopus_backend_c | my_header.h |
Python | interoptopus_backend_cpython | reference.py |
Andere | Schreiben Sie Ihr eigenes Backend 2 | - |
1 Für das Referenzprojekt.
2 Fügen Sie in nur wenigen Stunden Unterstützung für eine neue Sprache hinzu. Keine Pull-Anfrage erforderlich. Pinkie, versprochen.
Wenn Sie wollen ...
Fangen Sie an und sehen Sie sich die „Hallo Welt“ an.
Verwirklichen Sie Ihr Projekt , sehen Sie sich das tatsächliche Projektlayout an ,
verstehen, was möglich ist , sehen Sie sich das Referenzprojekt an,
Um eine neue Sprache zu unterstützen , kopieren Sie das C-Backend .
Einen Überblick finden Sie im Referenzprojekt :
Funktionen (freistehende Funktionen und Delegierte)
Typen (Composites, Enums, Opaques, Referenzen, ...)
Konstanten (primitive Konstanten; Ergebnisse der Konstantenauswertung)
Muster (ASCII-Zeiger, Optionen, Slices, Klassen, ...)
Generierte Low-Level-Bindungen sind im Vergleich zu handgefertigten Bindungen für diese Sprache kostenlos .
Allerdings kommt es auch bei manuell erstellten Bindungen zu einem gewissen zielspezifischen Overhead an der FFI-Grenze (z. B. Marshalling oder Pinning in verwalteten Sprachen). Bei C# betragen diese Kosten oft Nanosekunden, bei Python CFFI können es Mikrosekunden sein.
Auch wenn Sie letztendlich nichts an der FFI-Leistung einer Sprache ändern können, kann Ihnen die Kenntnis der Aufrufkosten beim Entwerfen besserer APIs helfen.
Detaillierte Gesprächskostentabellen finden Sie hier:
C#-Aufrufaufwand
Overhead des Python-Aufrufs
Für einen schnellen Überblick listet diese Tabelle die häufigsten Anruftypen in ns / call auf:
Konstrukt | C# | Python |
---|---|---|
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 |
Diese sind hinter Feature-Flags verborgen und ermöglichen Folgendes:
derive
– Proc-Makros wie ffi_type
, ...
serde
– Serde-Attribute für interne Typen.
log
– Protokollierung bei FFI-Fehlern aufrufen.
v0.15 – Umfangreiche Bereinigung, Bugfix, UX-Überarbeitung (+syn2).
v0.14 – Bessere Inventar-UX.
v0.13 – Das Python-Backend verwendet jetzt ctypes
.
v0.12 – Bessere Kompatibilität mit #[ffi_service_method]
.
v0.11 – C#-Umstellung auf statische Methoden.
v0.10 – C#-Varianten DotNet
und Unity
(inkl. Burst).
v0.9 – 150-mal schnellere C#-Slices, Hinweise zum Python-Typ.
v0.8 – Testfunktionen in die jeweiligen Backends verschoben.
v0.7 – Erstellen Sie Muster-Proc-Makros für bessere FFI-Dokumente.
v0.6 – Viele Muster umbenannt und präzisiert.
v0.5 – Ergonomischere Slice-Nutzung in Rust und FFI.
v0.4 – Aktivieren Sie die Protokollierungsunterstützung in automatisch generierten FFI-Aufrufen.
v0.3 – Bessere Kompatibilität mit Generika.
v0.2 – „Muster“ eingeführt; funktionierendes Interop für C#.
v0.1 – Erste Version.
Beachten Sie auch unsere Upgrade-Anleitung.
FAQ und Sicherheitshinweise.
PRs sind willkommen.
Reichen Sie kleine Fehlerbehebungen direkt ein. Größere Änderungen sollten zuerst Probleme bereiten.
Alles, was dazu führt, dass zuvor funktionierende Bindungen ihr Verhalten ändern oder die Kompilierung stoppen, ist eine große Änderung.
Das bedeutet nicht, dass wir etwas dagegen haben, Dinge kaputt zu machen, sondern nur, dass wir darüber reden möchten, bevor es passiert.
Neue Funktionen oder Muster müssen im Referenzprojekt materialisiert und von einem Interop-Test (d. h. einem Backend-Test, bei dem C#/Python gegen eine DLL ausgeführt wird, die diesen Code aufruft) in mindestens einem enthaltenen Backend begleitet werden.