قابلیت همکاری با ++C

جامعه Rust گزینه‌های متعددی را برای C++/Rust interop ارائه می‌دهد، با ابزارهای جدیدی که همیشه در حال توسعه هستند. در حال حاضر، Chromium از ابزاری به نام CXX استفاده می‌کند.

شما کل مرز زبان (language boundary) خود را در یک زبان تعریف interface (که بسیار شبیه Rust به نظر می رسد) توصیف می کنید و سپس ابزارهای CXX اعلان‌هایی را برای توابع و تایپ‌ها در Rust و ++C ایجاد می‌کنند.

Overview diagram of cxx, showing that the same interface definition is used to create both C++ and Rust side code which then communicate via a lowest common denominator C API

برای مثال کامل استفاده از این آموزش CXX را ببینید.

از طریق دیاگرام صحبت کنید. توضیح دهید که در پشت صحنه، این دقیقاً همان کاری را انجام می‌دهد که قبلاً انجام می‌دادید. به این نکته اشاره کنید که خودکارسازی فرآیند دارای مزایای زیر است:

  • این ابزار تضمین می‌کند که مجانب ++C و Rust مطابقت کامل دارند (مثلاً اگر #[cxx::bridge] با تعاریف واقعی ++C یا Rust مطابقت نداشته باشد، درنتیجه با خطاهای کامپایل مواجه می‌شوید اما با اتصال‌های دستی غیرهمگام‌شده (out-of-sync manual bindings) می‌توانید رفتار نامشخص دریافت کنید)
  • این ابزار تولید Thunk‌های FFI (کارکردهای کوچک، سازگار با C-ABI، و رایگان) را برای ویژگی های غیر C (به عنوان مثال فعال کردن تماس‌های FFI به‌ متدهای Rust) به طور خودکار انجام می دهد؛ اتصال های دستی نیاز به نوشتن چنین عملکردهای سطح بالا و رایگان به صورت دستی دارد.
  • ابزارها و کتابخانه می‌توانند مجموعه‌ای از انواع هسته (core types) را مدیریت کنند - به عنوان مثال:
    • &[T] را می‌توان از مرز FFI عبور داد، حتی اگر هیچ‌گونه طرح‌بندی ABI یا حافظه خاصی را تضمین نکند. با اتصال‌های (bindings) دستی،std::span<T> / &[T] باید به‌صورت دستی تخریب شود و از یک pointer و length به صورت مجدد ساخته شود - با توجه به اینکه هر زبان sliceهای خالی را کمی متفاوت نشان می‌دهد، درنتیجه مستعد خطا است)
    • اشاره گرهای هوشمند مانند std::unique_ptr<T>, std::shared_ptr<T> و/یا Box به صورت native پشتیبانی می‌شوند. با کمک اتصال‌های دستی (manual bindings)، باید C-ABI-compatible raw pointers را پاس کنید که خطرات ایمنی و طول عمر را افزایش می‌دهد.
    • تایپ‌های rust::String و CxxString تفاوت‌ها را در نمایش stringها در بین زبان‌ها درک و حفظ می‌کنند (به عنوان مثال، rust::String::lossy می‌تواند یک Rust string را از ورودی غیر UTF8 و rust::String::c_str بسازد و می‌تواند یک string را با NUL خاتمه دهد).