Exercise: Interoperability with C++

パート 1

  • 先ほど作成した Rust ファイルに、C++ から呼び出す単一の関数を示す #[cxx::bridge] を追加します。これは hello_from_rust という関数で、パラメータを受け取らず、値も返しません。
  • Modify your previous hello_from_rust function to remove extern "C" and #[unsafe(no_mangle)]. This is now just a standard Rust function.
  • gn ターゲットを変更して、これらのバインディングをビルドします。
  • C++ コードで、hello_from_rust の前方宣言を削除し、代わりに生成されたヘッダー ファイルをインクルードします。
  • ビルドして実行します。

パート 2

CXX を少し使ってみて、Chromium における Rust の柔軟性について理解を深めましょう。

以下を試してください。

  • Rust から C++ を呼び出します。これには以下が必要です。
    • cxx::bridge から include! できる追加のヘッダー ファイル。その新しいヘッダー ファイルで C++ 関数を宣言する必要があります。
    • このような関数を呼び出す unsafe ブロック。または こちら に記載されているとおり、#[cxx::bridge] 内で unsafe キーワードを指定する必要があります。
    • #include "third_party/rust/cxx/v1/crate/include/cxx.h" も必要になるかもしれません。
  • C++ から Rust に C++ 文字列を渡します。
  • C++ オブジェクトへの参照を Rust に渡します。
  • 意図的に#[cxx::bridge]と一致しないようにRust 関数のシグネチャを変更し、表示されるエラーに慣れるようにします。
  • 意図的に#[cxx::bridge]と一致しないようにC++ 関数のシグネチャを変更し、表示されるエラーに慣れるようにします。
  • なんらかの型の std::unique_ptr を C++ から Rust に渡して、Rust がいくつかの C++ オブジェクトを所有できるようにします。
  • Rust オブジェクトを作成して C++ に渡して、C++ がそれを所有できるようにします(ヒント: Box が必要です)。
  • C++ 型でいくつかのメソッドを宣言し、Rust から呼び出します。
  • Rust 型に対していくつかのメソッドを宣言し、C++ から呼び出します。

パート 3

CXX の相互運用性の長所と制限事項について理解したところで、インターフェースが非常にシンプルな、Chromium での Rust のユースケースをいくつか考えてみましょう。このインターフェースをどのように定義すればよいか考えてみましょう。

参考情報

As students explore Part Two, they're bound to have lots of questions about how to achieve these things, and also how CXX works behind the scenes.

次のような質問が寄せられる可能性があります。

  • X と Y の両方が関数型である場合に、型 X の変数を型 Y で初期化すると問題が発生します。これは、C++ 関数が cxx::bridge 内の宣言と完全に一致しないためです。
  • C++ 参照を Rust 参照に自由に変換できるようですが、UB のリスクはないでしょうか?CXX の不透明型の場合、サイズがゼロであるため、そのリスクはありません。CXX のトリビアル型では UB が発生する可能性がありますが、CXX の設計上、そのような例を作成するのは非常に困難です。