Generator binding poliglot untuk perpustakaan Anda.
Tulis perpustakaan yang kuat di Rust, akses dengan mudah dari bahasa favorit kedua Anda:
Rancang satu .dll
/ .so
di Rust, gunakan dari mana saja.
Dapatkan fitur kualitas hidup (misalnya, kelas, string) dalam bahasa yang memilikinya.
Selalu miliki API yang waras dan kompatibel dengan C.
Alur kerja tanpa rasa sakit, tidak memerlukan peralatan eksternal.
Mudah untuk mendukung lebih banyak bahasa, backend sepenuhnya dipisahkan dari proyek utama.
Kami berusaha keras untuk membuat pengikatan yang kami hasilkan tanpa biaya . Mereka harus idiomatis seperti yang Anda bisa tuliskan sendiri, tetapi jangan pernah menyihir atau menyembunyikan antarmuka yang sebenarnya ingin Anda tampilkan.
gunakan 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);}// Definisikan antarmuka FFI kami sebagai `ffi_inventory` yang berisi// satu fungsi `fungsi_saya`. Jenisnya disimpulkan.pub fn ffi_inventory() -> Inventory {InventoryBuilder::new().register(function!(my_function)).validate().inventory()}
Bahasa | Peti | Contoh Keluaran 1 |
---|---|---|
C# | interoptopus_backend_csharp | Interop.cs |
C | interoptopus_backend_c | my_header.h |
ular piton | interoptopus_backend_cpython | referensi.py |
Lainnya | Tulis backend Anda sendiri 2 | - |
1 Untuk proyek referensi.
2 Tambahkan dukungan untuk bahasa baru hanya dalam beberapa jam. Tidak diperlukan permintaan penarikan. Janji kelingking.
Jika Anda ingin...
mulailah melihat halo dunia ,
produktifkan proyek Anda , lihat tata letak proyek sebenarnya ,
memahami apa yang mungkin , lihat proyek referensi ,
mendukung bahasa baru , salin backend C.
Lihat proyek referensi untuk gambaran umum:
fungsi (fungsi berdiri bebas dan delegasi)
jenis (komposit, enum, buram, referensi, ...)
konstanta (konstanta primitif; hasil evaluasi const)
pola (pointer ASCII, opsi, irisan, kelas, ...)
Binding tingkat rendah yang dihasilkan adalah binding buatan tangan tanpa biaya untuk bahasa tersebut.
Meskipun demikian, bahkan penjilidan buatan tangan pun menghadapi overhead spesifik target di batas FFI (misalnya, penyusunan atau penyematan dalam bahasa yang dikelola). Untuk C# biayanya sering kali nanodetik, untuk Python CFFI bisa jadi mikrodetik.
Meskipun pada akhirnya tidak ada yang dapat Anda lakukan terhadap kinerja FFI suatu bahasa, menyadari biaya panggilan dapat membantu Anda merancang API yang lebih baik.
Tabel detail biaya panggilan dapat ditemukan di sini:
C# panggilan overhead
Panggilan Python di atas kepala
Untuk gambaran singkatnya, tabel ini mencantumkan jenis panggilan paling umum di ns / call :
Membangun | C# | ular piton |
---|---|---|
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 |
Berpagar di balik tanda fitur , ini memungkinkan:
derive
- Proc makro seperti ffi_type
, ...
serde
- Atribut serde pada tipe internal.
log
- Memanggil kesalahan log on FFI.
v0.15 - Pembersihan besar-besaran, perbaikan bug, perombakan UX (+syn2).
v0.14 - UX inventaris yang lebih baik.
v0.13 - Backend Python menggunakan ctypes
sekarang.
v0.12 - Kompatibilitas yang lebih baik menggunakan #[ffi_service_method]
.
v0.11 - C# mengalihkan aktor ke metode statis.
v0.10 - C# rasa DotNet
dan Unity
(termasuk Burst).
v0.9 - Irisan C# 150x lebih cepat, petunjuk tipe Python.
v0.8 - Memindahkan fungsi pengujian ke masing-masing backend.
v0.7 - Buat pola proc makro untuk dokumen FFI yang lebih baik.
v0.6 - Mengganti nama dan memperjelas banyak pola.
v0.5 - Penggunaan irisan yang lebih ergonomis di Rust dan FFI.
v0.4 - Aktifkan dukungan logging dalam panggilan FFI yang dibuat secara otomatis.
v0.3 - Kompatibilitas lebih baik dengan obat generik.
v0.2 - Memperkenalkan "pola"; interop kerja untuk C#.
v0.1 - Versi pertama.
Lihat juga petunjuk peningkatan kami.
FAQ dan Panduan Keselamatan.
PR dipersilakan.
Kirimkan perbaikan bug kecil secara langsung. Perubahan besar harus menjadi masalah terlebih dahulu.
Apa pun yang membuat pengikatan yang sebelumnya berfungsi mengubah perilaku atau menghentikan kompilasi adalah perubahan besar;
Ini tidak berarti kami menentang hal-hal yang melanggar, hanya saja kami ingin membicarakannya sebelum hal itu terjadi.
Fitur atau pola baru harus diwujudkan dalam proyek referensi dan disertai dengan pengujian interop (yaitu, pengujian backend yang menjalankan C#/Python terhadap DLL yang menjalankan kode tersebut) di setidaknya satu backend yang disertakan.