귀하의 라이브러리를 위한 다언어 바인딩 생성기입니다.
Rust로 강력한 라이브러리를 작성하고 두 번째로 선호하는 언어에서 쉽게 액세스하세요.
Rust에서 단일 .dll
/ .so
디자인하고 어디에서나 사용할 수 있습니다.
QoL 기능(예: 클래스, 문자열)이 있는 언어로 가져옵니다.
항상 정상적인 C 호환 API를 사용하세요.
간편한 작업 흐름, 외부 도구가 필요하지 않습니다.
더 많은 언어를 쉽게 지원하고 백엔드는 기본 프로젝트에서 완전히 분리됩니다.
우리는 생성된 바인딩의 비용을 0으로 만들기 위해 노력합니다. 이는 합리적으로 직접 작성할 수 있을 만큼 관용적이어야 하지만 실제로 노출하려는 인터페이스를 마술처럼 숨기거나 숨겨서는 안 됩니다.
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`을 포함합니다. 유형은 추론됩니다.pub fn ffi_inventory() -> Inventory {InventoryBuilder::new().register(function!(my_function)).validate().inventory()}
언어 | 나무 상자 | 샘플 출력 1 |
---|---|---|
기음# | interoptopus_backend_csharp | Interop.cs |
기음 | interoptopus_backend_c | my_header.h |
파이썬 | interoptopus_backend_cpython | 참조.py |
다른 | 나만의 백엔드 작성 2 | - |
1 참조 프로젝트의 경우.
2 단 몇 시간 만에 새로운 언어에 대한 지원을 추가하세요. 풀 요청이 필요하지 않습니다. 핑키 약속해요.
당신이 원한다면 ...
시작해 보세요. Hello World를 보세요.
프로젝트를 제품화하고 , 실제 프로젝트 레이아웃을 확인하고,
가능한 것이 무엇인지 이해하고 참조 프로젝트를 참조하십시오.
새로운 언어를 지원하려면 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
- ffi_type
, ...과 같은 Proc 매크로
serde
- 내부 유형의 Serde 속성입니다.
log
- FFI 오류에 대한 로그를 호출합니다.
v0.15 - 대규모 정리, 버그 수정, UX 점검(+syn2).
v0.14 - 더 나은 인벤토리 UX.
v0.13 - Python 백엔드는 이제 ctypes
사용합니다.
v0.12 - #[ffi_service_method]
사용하여 호환성이 향상되었습니다.
v0.11 - C#은 섹터를 정적 메서드로 전환합니다.
v0.10 - C# 버전 DotNet
및 Unity
(버스트 포함).
v0.9 - 150배 더 빠른 C# 슬라이스, Python 유형 힌트.
v0.8 - 테스트 기능을 각 백엔드로 이동했습니다.
v0.7 - 더 나은 FFI 문서를 위해 패턴 처리 매크로를 만듭니다.
v0.6 - 많은 패턴의 이름이 바뀌고 명확해졌습니다.
v0.5 - Rust 및 FFI에서 더욱 인체공학적인 슬라이스 사용.
v0.4 - 자동 생성된 FFI 호출에서 로깅 지원을 활성화합니다.
v0.3 - 제네릭과의 호환성이 향상되었습니다.
v0.2 - "패턴"이 도입되었습니다. C#에 대한 상호 운용성 작업 .
v0.1 - 첫 번째 버전.
업그레이드 지침도 참조하세요.
FAQ 및 안전 가이드.
PR을 환영합니다.
작은 버그 수정 사항을 직접 제출하세요. 주요 변경 사항이 먼저 문제가 되어야 합니다.
이전에 작업했던 바인딩의 동작을 변경하거나 컴파일을 중단하게 만드는 것은 모두 중요한 변화입니다.
이는 우리가 문제가 발생하기 전에 이야기하고 싶은 내용을 깨뜨리는 것에 반대한다는 의미는 아닙니다.
새로운 기능이나 패턴은 참조 프로젝트에서 구체화되어야 하며 포함된 하나 이상의 백엔드에서 상호 운용성 테스트(즉, 해당 코드를 호출하는 DLL에 대해 C#/Python을 실행하는 백엔드 테스트)를 동반해야 합니다.