0Pricing
C++ Academy · درس

حدود FFI بين C++ وRust

وفّر دوال C++ لاستخدامها عبر FFI في Rust، والعكس صحيح.

حدود FFI بين C++ وRust درس مجاني في C++ Academy على CoddyKit. هذا هو الدرس 3 من أصل 4. يمكنك قراءة الدرس كاملاً أدناه مجاناً — ثم تمرن عليه مباشرة في المتصفح باستخدام محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7. هذا الدرس جزء من مسار التعلم في C++ Academy، وتقدمك يتزامن عبر الويب وتطبيق CoddyKit. تتضمن دورة C++ Academy 4 دروس في المجموع.

C++ وRust

إن Rust وC++ لغتان منخفضتا المستوى ومترجمتان، لكن لهما ABI مختلفتان ونظاما أنواع غير متوافقين. وعادةً ما تتكاملان عبر جسر يستخدم ABI الخاصة بـ C.

من Rust إلى C++: extern "C"

صدّر دوال Rust باستخدام extern "C" و#[no_mangle].

// Rust
#[no_mangle]
pub extern "C" fn add(a: i32, b: i32) -> i32 {
    a + b
}

استدعاء Rust من C++

صرّح بدالة Rust في C++ واربطها بمكتبة Rust الساكنة.

// C++
extern "C" int add(int a, int b);

std::cout << add(2, 3);

من C++ إلى Rust

الاتجاه العكسي — تستدعي Rust لغة C++. غلّف C++ داخل extern "C" وصرّح بها في Rust.

// C++
extern "C" int multiply(int a, int b) {
    return a * b;
}

// Rust
extern "C" {
    fn multiply(a: i32, b: i32) -> i32;
}

ربط المكتبات الساكنة

ابنِ حزمة Rust بصفتها staticlib أو cdylib، واربطها بعملية بناء C++.

# Cargo.toml
[lib]
crate-type = ["staticlib"]

Bindgen وCbindgen

أنشئ تصريحات FFI تلقائيًا:

  • bindgen — إنشاء روابط Rust من ترويسات C++
  • cbindgen — إنشاء ترويسات C/C++ من تعليمات Rust البرمجية

حزمة cxx

توفر حزمة cxx تكاملًا أكثر أمانًا وأعلى مستوى بين C++ وRust. عرّف مخططًا مشتركًا؛ إذ تنشئ cxx الروابط على كلا الجانبين مع توفير كتابة قوية.

ملكية الذاكرة عبر FFI

تستخدم اللغتان RAII، لكن لهما نموذجا ملكية مختلفان. مرّر البيانات المملوكة بالقيمة، والبيانات المستعارة عبر مؤشر خام — ووثّق الجهة التي تحرر كل شيء.

السلاسل النصية عبر FFI

إن String في Rust وstd::string في C++ غير متوافقين. استخدم *const c_char (منتهية بـ null)، أو (*const u8, usize) (مؤشر + طول).

الاستثناءات في مقابل panic

لا تعبر حالات panic في Rust واستثناءات C++ حدود FFI بأمان. التقط استثناءات C++ عند الحدود، واستخدم std::panic::catch_unwind في جانب Rust.

تكامل نظام البناء

استخدم نظام بناء فوقيًا: بحيث يستدعي CMake‏ Cargo، أو يستدعي Cargo‏ CMake عبر برنامج بناء نصي (build.rs). تتولى مكتبة cxx الأنماط الشائعة.

أمثلة من العالم الحقيقي

تجمع العديد من قواعد الشيفرة المستخدمة في الإنتاج بين C++ وRust: يستخدم Mozilla Firefox مكونات Rust داخل محرك C++، ويجرب Chromium وحدات Rust، كما توفر العديد من مكتبات التشفير روابط باللغتين.

تحقق سريع

ما سمة Rust التي تعطل تشويه الأسماء بحيث تتمكن C/C++ من العثور على الرمز؟

مراجعة

يتكامل C++ وRust عبر C ABI. استخدم extern "C" و#[no_mangle]. أنشئ الروابط باستخدام bindgen وcbindgen، أو استخدم مكتبة cxx لإنشاء جسور نمطية أكثر أمانًا. تعامل بحذر مع الملكية والسلاسل النصية وحالات panic عند عبور الحدود.

الأسئلة الشائعة

هل درس «حدود FFI بين C++ وRust» مجاني؟

نعم — نص درس «حدود FFI بين C++ وRust» كامل متاح مجاناً هنا على الويب. لتمرينه بشكل تفاعلي (محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7) وفتح باقي دورة C++ Academy، انتقل إلى CoddyKit PRO. تتضمن دورة C++ Academy 4 دروس في المجموع.

ماذا ستتعلم في «حدود FFI بين C++ وRust»؟

وفّر دوال C++ لاستخدامها عبر FFI في Rust، والعكس صحيح. تتمرن على C++ Academy مع أكواد عملية تشغلها مباشرة في المتصفح، ومدرس ذكاء اصطناعي متاح 24/7 يجيب على أسئلتك أثناء عملك.

هل أحتاج إلى خبرة سابقة لأبدأ C++ Academy؟

لا تُشترط خبرة سابقة. C++ Academy على CoddyKit منظم للمبتدئين حتى المتقدمين، لذا يمكنك البدء من هنا أو من البداية والتقدم بسرعتك الخاصة. هذا هو الدرس 3 من أصل 4.

كم من الوقت يستغرق درس «حدود FFI بين C++ وRust»؟

معظم دروس CoddyKit تستغرق حوالي 5–10 دقائق. كل منها موجز وتفاعلي، لذا تحرز تقدماً مستمراً وتستأنف من حيث توقفت عبر الويب والتطبيق.

هل يمكنني كتابة وتشغيل أكواد في درس C++ Academy هذا؟

نعم. كل درس في C++ Academy يتضمن محرر أكواد مدمج، لذا تكتب وتشغل أكواداً حقيقية مباشرة في متصفحك وتحصل على تعليقات فورية من الذكاء الاصطناعي — بدون إعداد محلي.

جميع الدروس في هذه الدورة

  1. ‏extern C وواجهة C ABI
  2. استدعاء Python من C++ عبر pybind11
  3. حدود FFI بين C++ وRust
  4. استخدام SWIG للروابط متعددة اللغات
← العودة إلى C++ Academy