เครื่องมือสร้างการเชื่อมโยงหลายภาษาสำหรับห้องสมุดของคุณ
เขียนไลบรารีที่มีประสิทธิภาพใน Rust เข้าถึงได้อย่างง่ายดายจากภาษาโปรดอันดับสองของคุณ:
ออกแบบ .dll
/ .so
เดี่ยวใน Rust ใช้งานได้จากทุกที่
รับคุณสมบัติ QoL (เช่น คลาส สตริง) ในภาษาที่มี
มี API ที่เข้ากันได้กับ C ที่สมเหตุสมผลเสมอ
ขั้นตอนการทำงานที่ไม่ยุ่งยาก ไม่ต้องใช้เครื่องมือภายนอก
ง่ายต่อการรองรับภาษาอื่น ๆ แบ็กเอนด์แยกจากโปรเจ็กต์หลักอย่างสมบูรณ์
เรามุ่งมั่นที่จะทำให้การเชื่อมโยงที่สร้างขึ้นของเรา ไม่มีค่าใช้จ่าย ควรเป็นสำนวนเท่าที่คุณสามารถเขียนเองได้อย่างสมเหตุสมผล แต่อย่าใช้เวทมนตร์หรือซ่อนอินเทอร์เฟซที่คุณต้องการเปิดเผยจริงๆ
ใช้ 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 (อินพุต: 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 | Interop.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 - UX สินค้าคงคลังที่ดีขึ้น
v0.13 - แบ็กเอนด์ Python ใช้ ctypes
ทันที
v0.12 - #[ffi_service_method]
เข้ากันได้ดีกว่า
v0.11 - C# สลับ ctors เป็นวิธีคงที่
v0.10 - C# รสชาติ DotNet
และ Unity
(รวม Burst)
v0.9 - ชิ้น C# เร็วขึ้น 150 เท่า, คำแนะนำประเภท Python
v0.8 - ย้ายฟังก์ชันการทดสอบไปยังแบ็กเอนด์ที่เกี่ยวข้อง
v0.7 - สร้างรูปแบบ proc มาโครสำหรับเอกสาร FFI ที่ดีขึ้น
v0.6 - เปลี่ยนชื่อและชี้แจงรูปแบบต่างๆ มากมาย
v0.5 - การใช้สไลซ์ตามหลักสรีรศาสตร์มากขึ้นใน Rust และ FFI
v0.4 - เปิดใช้งานการสนับสนุนการบันทึกในการโทร FFI ที่สร้างขึ้นอัตโนมัติ
v0.3 - เข้ากันได้ดีขึ้นกับยาชื่อสามัญ
v0.2 - แนะนำ "รูปแบบ"; การทำงาน ร่วมกันสำหรับ C#
v0.1 - เวอร์ชันแรก
โปรดดูคำแนะนำในการอัปเกรดของเราด้วย
คำถามที่พบบ่อยและคำแนะนำด้านความปลอดภัย
ยินดีประชาสัมพันธ์ครับ.
ส่งการแก้ไขข้อบกพร่องเล็กๆ น้อยๆ โดยตรง การเปลี่ยนแปลงที่สำคัญควรเป็นปัญหาก่อน
สิ่งใดก็ตามที่ทำให้การผูกการทำงานก่อนหน้านี้เปลี่ยนพฤติกรรมหรือหยุดการคอมไพล์ถือเป็นการเปลี่ยนแปลงที่สำคัญ
นี่ไม่ได้หมายความว่าเราไม่เห็นด้วยกับการทำลายสิ่งของเพียงแต่เราต้องการพูดคุยเกี่ยวกับมันก่อนที่มันจะเกิดขึ้น
คุณสมบัติหรือรูปแบบใหม่จะต้องเกิดขึ้นจริงในโปรเจ็กต์อ้างอิงและมาพร้อมกับการทดสอบการทำงานร่วมกัน (เช่น การทดสอบแบ็กเอนด์ที่ใช้ C# / Python กับ DLL ที่เรียกใช้โค้ดนั้น) ในแบ็กเอนด์ที่รวมอยู่อย่างน้อยหนึ่งรายการ