Le générateur de liaisons polyglottes pour votre bibliothèque.
Écrivez une bibliothèque robuste dans Rust, accédez-y facilement à partir de votre deuxième langage préféré :
Concevez un seul .dll
/ .so
dans Rust, consommez-le de n'importe où.
Obtenez des fonctionnalités de qualité de vie (par exemple, classes, chaînes) dans les langages qui les possèdent.
Ayez toujours une API saine et compatible avec C.
Flux de travail indolore, aucun outil externe requis.
Prise en charge facile de plusieurs langues, backends entièrement découplés du projet principal.
Nous nous efforçons de rendre nos liaisons générées gratuites . Ils doivent être aussi idiomatiques que vous auriez raisonnablement pu les écrire vous-même, mais sans jamais faire de magie ni cacher l'interface que vous vouliez réellement exposer.
utilisez 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);}// Définir notre interface FFI comme `ffi_inventory` contenant// une seule fonction `ma_fonction`. Les types sont déduits.pub fn ffi_inventory() -> Inventory {InventoryBuilder::new().register(function!(my_function)).validate().inventory()}
Langue | Caisse | Exemple de sortie 1 |
---|---|---|
C# | interoptopus_backend_csharp | Interopérabilité.cs |
C | interoptopus_backend_c | mon_en-tête.h |
Python | interoptopus_backend_cpython | référence.py |
Autre | Écrivez votre propre backend 2 | - |
1 Pour le projet de référence.
2 Ajoutez la prise en charge d'une nouvelle langue en quelques heures seulement. Aucune demande de tirage n’est nécessaire. Pinkie, promis.
Si tu veux...
commencez à voir le monde bonjour ,
productifiez votre projet , voyez la présentation réelle du projet ,
comprendre ce qui est possible , voir le projet de référence ,
prend en charge une nouvelle langue , copiez le backend C.
Voir le projet de référence pour un aperçu :
fonctions (fonctions autonomes et délégués)
types (composites, énumérations, opaques, références, ...)
constantes (constantes primitives ; résultats de l'évaluation const)
modèles (pointeurs ASCII, options, tranches, classes, ...)
Les liaisons de bas niveau générées sont des liaisons artisanales à coût nul pour ce langage.
Cela dit, même les liaisons faites à la main rencontrent une surcharge spécifique à la cible à la limite FFI (par exemple, le regroupement ou l'épinglage dans les langages gérés). Pour C#, ce coût est souvent de quelques nanosecondes, pour Python CFFI, cela peut être de quelques microsecondes.
Bien qu'en fin de compte, vous ne puissiez rien faire sur les performances FFI d'un langage, être conscient des coûts d'appel peut vous aider à concevoir de meilleures API.
Les tableaux détaillés des coûts des appels peuvent être trouvés ici :
Surcharge d’appel C#
Surcharge d’appel Python
Pour un aperçu rapide, ce tableau répertorie les types d'appels les plus courants dans ns / call :
Construction | 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 |
Fermés derrière des indicateurs de fonctionnalité , ceux-ci permettent :
derive
- Macros Proc telles que ffi_type
, ...
serde
- Attributs Serde sur les types internes.
log
- Invoque le journal sur les erreurs FFI.
v0.15 - Nettoyage massif, correction de bugs, refonte UX (+syn2).
v0.14 - Meilleure UX d'inventaire.
v0.13 - Le backend Python utilise désormais ctypes
.
v0.12 - Meilleure compatibilité en utilisant #[ffi_service_method]
.
v0.11 - C# bascule les cteurs vers des méthodes statiques.
v0.10 - Versions C# DotNet
et Unity
(y compris Burst).
v0.9 - Tranches C# 150 fois plus rapides, astuces de type Python.
v0.8 - Fonctions de test déplacées vers les backends respectifs.
v0.7 - Créez des macros de procédure de modèles pour de meilleurs documents FFI.
v0.6 - Renommé et clarifié de nombreux modèles.
v0.5 - Utilisation plus ergonomique des tranches dans Rust et FFI.
v0.4 - Activer la prise en charge de la journalisation dans les appels FFI générés automatiquement.
v0.3 - Meilleure compatibilité avec les génériques.
v0.2 - Introduction des « modèles » ; interopérabilité fonctionnelle pour C#.
v0.1 - Première version.
Consultez également nos instructions de mise à niveau.
FAQ et guides de sécurité.
Les PR sont les bienvenus.
Soumettez directement les petites corrections de bugs. Les changements majeurs devraient être les premiers problèmes.
Tout ce qui fait que les liaisons qui fonctionnaient auparavant changent de comportement ou arrêtent la compilation est un changement majeur ;
Cela ne veut pas dire que nous sommes opposés au fait de casser des choses, mais simplement que nous aimerions en parler avant que cela n'arrive.
Les nouvelles fonctionnalités ou modèles doivent être matérialisés dans le projet de référence et accompagnés d'un test d'interopérabilité (c'est-à-dire un test backend exécutant C#/Python sur une DLL appelant ce code) dans au moins un backend inclus.