Генератор привязок полиглота для вашей библиотеки.
Напишите надежную библиотеку на Rust и легко получите к ней доступ со второго любимого языка:
Создайте единый .dll
/ .so
в Rust и используйте его где угодно.
Получите функции 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 как `ffi_inventory`, содержащий // единственная функция `my_function`. Типы: inferred.pub fn ffi_inventory() -> Inventory {InventoryBuilder::new().register(function!(my_function)).validate().inventory()}
Язык | Ящик | Пример вывода 1 |
---|---|---|
С# | interoptopus_backend_csharp | Взаимодействие.cs |
С | interoptopus_backend_c | my_header.h |
Питон | interoptopus_backend_cpython | ссылка.py |
Другой | Напишите свой собственный бэкэнд 2 | - |
1 Для эталонного проекта.
2 Добавьте поддержку нового языка всего за несколько часов. Никакого запроса на вытягивание не требуется. Пинки обещает.
Если вы хотите ...
начни, посмотри привет, мир ,
продуктизируйте свой проект , посмотрите реальный макет проекта ,
понять, что возможно , посмотреть эталонный проект ,
поддержите новый язык , скопируйте серверную часть C.
Обзор смотрите в эталонном проекте :
функции (автономные функции и делегаты)
типы (композиты, перечисления, непрозрачные элементы, ссылки,...)
константы (примитивные константы; результаты вычисления const)
шаблоны (указатели ASCII, параметры, фрагменты, классы,...)
Созданные низкоуровневые привязки являются нулевыми по сравнению с созданными вручную привязками для этого языка.
Тем не менее, даже созданные вручную привязки сталкиваются с некоторыми накладными расходами, специфичными для целевой цели, на границе FFI (например, маршалинг или закрепление в управляемых языках). Для C# эта стоимость часто составляет наносекунды, для Python CFFI — микросекунды.
Хотя в конечном итоге вы ничего не можете поделать с производительностью FFI языка, знание стоимости вызовов может помочь вам разработать более эффективные API.
Подробные таблицы стоимости звонков можно найти здесь:
Накладные расходы на вызов C#
Накладные расходы на вызов Python
Для краткого обзора в этой таблице перечислены наиболее распространенные типы вызовов в ns/call :
Построить | С# | Питон |
---|---|---|
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
— макросы Proc, такие как ffi_type
, ...
serde
— атрибуты Serde для внутренних типов.
log
— вызвать журнал ошибок FFI.
v0.15 — Массивная очистка, исправление ошибок, капитальный ремонт UX (+syn2).
v0.14 — Улучшенный пользовательский интерфейс инвентаря.
v0.13 — Серверная часть Python теперь использует ctypes
.
v0.12 — Улучшена совместимость с использованием #[ffi_service_method]
.
v0.11 — C# переключает векторы на статические методы.
v0.10 — версии C# DotNet
и Unity
(включая Burst).
v0.9 — фрагменты C# в 150 раз быстрее, подсказки по типам Python.
v0.8 — Функции тестирования перенесены в соответствующие серверные части.
v0.7 — Создание макросов обработки шаблонов для улучшения документации FFI.
v0.6 - Переименованы и уточнены многие шаблоны.
v0.5 — Более эргономичное использование срезов в Rust и FFI.
v0.4 — Включить поддержку журналирования в автоматически создаваемых вызовах FFI.
v0.3 — Улучшена совместимость с дженериками.
v0.2 - Введены "паттерны"; рабочее взаимодействие для C#.
v0.1 - Первая версия.
Также ознакомьтесь с нашими инструкциями по обновлению.
Часто задаваемые вопросы и руководства по безопасности.
Пиар приветствуется.
Отправляйте исправления небольших ошибок напрямую. Крупные изменения должны быть в первую очередь проблемами.
Все, что приводит к изменению поведения ранее работающих привязок или остановке компиляции, является серьезным изменением;
Это не значит, что мы против того, чтобы что-то ломать, просто мы хотели бы поговорить об этом до того, как это произойдет.
Новые функции или шаблоны должны быть реализованы в эталонном проекте и сопровождаться тестом взаимодействия (т. е. внутренним тестом, запускающим C#/Python для DLL, вызывающей этот код) по крайней мере в одном включенном внутреннем интерфейсе.