相互運用性
Rust と C のコードの相互運用性は、常に
2 つの言語の間でデータを変換することに依存します。
この目的のために、stdlib には
専用のモジュール
std::ffi
があります。
std::ffi は、char、int、long などの
C のプリミティブ型の型定義を提供します。
また、文字列のような、より複雑な型を変換するための
いくつかのユーティリティも提供し、
&str と String の両方を、
より簡単かつ安全に扱える C の型に対応付けます。
Rust 1.30 以降では、
std::ffi の機能は、
メモリ割り当てが関係するかどうかに応じて
core::ffi または alloc::ffi
のいずれかで利用できます。
cty クレートおよび cstr_core クレートも
同様の機能を提供します。
| Rust の型 | 中間型 | C の型 |
|---|---|---|
String | CString | char * |
&str | CStr | const char * |
() | c_void | void |
u32 または u64 | c_uint | unsigned int |
| など | … | … |
C のプリミティブ型の値は、
対応する Rust の型の 1 つとして使用でき、
その逆も同様です。
これは、前者が単に後者の型エイリアスだからです。
たとえば、次のコードは、
unsigned int が 32 ビット長であるプラットフォーム上で
コンパイルできます。
fn foo(num: u32) {
let c_num: c_uint = num;
let r_num: u32 = c_num;
}
他のビルドシステムとの相互運用性
組み込みプロジェクトに Rust を含める際の一般的な要件は、 Cargo を、make や cmake などの既存のビルドシステムと 組み合わせることです。
この件に関する例やユースケースは、issue tracker の issue #61 で収集しています。
RTOS との相互運用性
FreeRTOS や ChibiOS のような RTOS と Rust を統合する作業は、 依然として進行中です。特に、Rust から RTOS の関数を呼び出すのは 難しい場合があります。
現在、次のプロジェクトが Rust<->RTOS の相互運用性を 公開サポートしています。
この件に関する例やユースケースは、issue tracker の issue #62 で収集しています。