El generador de enlaces políglotas para su biblioteca.
Escriba una biblioteca sólida en Rust, acceda fácilmente a ella desde su segundo idioma favorito:
Diseña un único .dll
/ .so
en Rust, consúmelo desde cualquier lugar.
Obtenga funciones de calidad de vida (por ejemplo, clases, cadenas) en idiomas que las tengan.
Tenga siempre una API sensata y compatible con C.
Flujo de trabajo sencillo, no se requieren herramientas externas.
Fácil de admitir más idiomas, backends completamente desacoplados del proyecto principal.
Nos esforzamos para que nuestras encuadernaciones generadas sean de coste cero . Deben ser tan idiomáticos como podrías haberlos escrito tú mismo, pero nunca mágicos ni ocultar la interfaz que realmente querías exponer.
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(entrada: Vec2) {println! ("{}", input.x);}// Definimos nuestra interfaz FFI como `ffi_inventory` que contiene// una sola función `mi_función`. Los tipos son inferidos.pub fn ffi_inventory() -> Inventory {InventoryBuilder::new().register(function!(my_function)).validate().inventory()}
Idioma | Caja | Resultado de muestra 1 |
---|---|---|
DO# | interoptopus_backend_csharp | Interop.cs |
do | interoptopus_backend_c | mi_encabezado.h |
Pitón | interoptopus_backend_cpython | referencia.py |
Otro | Escribe tu propio backend 2 | - |
1 Para el proyecto de referencia.
2 Agregue soporte para un nuevo idioma en solo unas horas. No se necesita solicitud de extracción. Promesa de Pinkie.
Si quieres...
empezar a ver el hola mundo ,
Productifique su proyecto , vea el diseño real del proyecto ,
comprender lo que es posible , ver el proyecto de referencia ,
Admite un nuevo idioma , copia el backend C.
Consulte el proyecto de referencia para obtener una descripción general:
funciones (funciones independientes y delegados)
tipos (compuestos, enumeraciones, opacos, referencias, ...)
constantes (constantes primitivas; resultados de la evaluación constante)
patrones (punteros ASCII, opciones, sectores, clases, ...)
Los enlaces de bajo nivel generados son enlaces de costo cero que están hechos a mano para ese idioma.
Dicho esto, incluso los enlaces hechos a mano encuentran cierta sobrecarga específica del objetivo en el límite de FFI (por ejemplo, clasificación o fijación en lenguajes administrados). Para C#, ese costo suele ser de nanosegundos, para Python CFFI puede ser de microsegundos.
Si bien, en última instancia, no hay nada que pueda hacer con respecto al rendimiento FFI de un idioma, conocer los costos de las llamadas puede ayudarlo a diseñar mejores API.
Las tablas detalladas de costos de llamadas se pueden encontrar aquí:
sobrecarga de llamadas de C#
sobrecarga de llamadas de Python
Para obtener una descripción general rápida, esta tabla enumera los tipos de llamadas más comunes en ns/call :
Construir | DO# | Pitón |
---|---|---|
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 |
Cerradas detrás de indicadores de funciones , estas permiten:
derive
: macros de proceso como ffi_type
, ...
serde
: atributos de Serde en tipos internos.
log
: invoca el registro en errores de FFI.
v0.15 : limpieza masiva, corrección de errores, revisión de UX (+syn2).
v0.14 - Mejor UX de inventario.
v0.13 : el backend de Python ahora usa ctypes
.
v0.12 - Mejor compatibilidad usando #[ffi_service_method]
.
v0.11 : C# cambia los ctors a métodos estáticos.
v0.10 - Versiones de C# DotNet
y Unity
(incluido Burst).
v0.9 : cortes de C# 150 veces más rápidos, sugerencias de tipo Python.
v0.8 : funciones de prueba movidas a los respectivos backends.
v0.7 : cree macros de proceso de patrones para obtener mejores documentos de FFI.
v0.6 : se cambió el nombre y se aclararon muchos patrones.
v0.5 : uso de cortes más ergonómico en Rust y FFI.
v0.4 : habilite el soporte de registro en llamadas FFI generadas automáticamente.
v0.3 - Mejor compatibilidad con genéricos.
v0.2 - "Patrones" introducidos; Interoperabilidad de trabajo para C#.
v0.1 - Primera versión.
Consulte también nuestras instrucciones de actualización.
Preguntas frecuentes y guías de seguridad.
Los RP son bienvenidos.
Envíe pequeñas correcciones de errores directamente. Los cambios importantes deberían ser cuestiones primero.
Cualquier cosa que haga que los enlaces que funcionaban anteriormente cambien su comportamiento o dejen de compilarse es un cambio importante;
Esto no significa que nos opongamos a romper cosas, sólo que nos gustaría hablar de ello antes de que suceda.
Las nuevas características o patrones deben materializarse en el proyecto de referencia y acompañarse de una prueba de interoperabilidad (es decir, una prueba de backend que ejecute C#/Python contra una DLL que invoque ese código) en al menos un backend incluido.