互通性

Rust 社群提供多個 C++/Rust 互通性選項,並且會持續開發新工具。目前 Chromium 使用的工具稱為 CXX。

您可以透過介面定義語言 (很類似 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 定義不相符,就會發生「編譯錯誤」,但如有未同步的手動繫結,則會發生「未定義的行為」
  • 這項工具會自動為非 C 功能產生 FFI 替換程式 (與 C-ABI 相容的小型、可自由使用的函式),例如讓 FFI 呼叫 Rust 或 C++ 方法;手動繫結會需要手動編寫這類頂層的、可自由使用的函式
  • 這項工具和程式庫可處理一組核心型別,例如:
    • &[T] 傳遞時可以跨越 FFI 邊界,但無法保證任何特定 ABI 或記憶體布局。使用手動繫結時,std::span<T>/&[T] 必須從一個指標和長度去手動解構並重新建構。這麼做很容易出錯,因為每種語言各以略微不同的方式表示空切片
    • std::unique_ptr<T>std::shared_ptr<T> 和/或 Box 等智慧指標均可原生支援。使用手動繫結時,必須傳遞與 C-ABI 相容的原始指標,這可能會增加生命週期和記憶體安全風險。
    • rust::StringCxxString 型別可理解並維持各語言字串表示法的差異,例如 rust::String::lossy 可透過非 UTF8 輸入內容建構 Rust 字串,而 rust::String::c_str 可以空終止字串。