相互運用性
RustとCとの相互運用性は、常に2つの言語間のデータ変換に依存しています。
そこで、2つの専用モジュールがstdlib内にあります。
std::ffiと
std::os::rawと呼ばれるものです。
std::os::rawは、コンパイラによって暗黙的に変換される低レベルのプリミティブ型を扱います。
RustとCとの間で、これらのプリミティブ型のメモリレイアウトは十分似ているか、同じだからです。
std::ffiは、文字列のようなより複雑な型を変換し、&strとStringの両方を、
より扱いやすく安全なCの型にマッピングするためのユーティリティを提供します。
これらの2つのモジュールは、どちらもcoreでは利用できませんが、
#![no_std]互換バージョンのstd::ffi::{CStr,CString}が、cstr_coreクレートにあります。
そして、ほとんどのstd::os::rawの型は、ctyクレートにあります。
| Rustの型 | 中間表現 | Cの型 |
|---|---|---|
| String | CString | *char |
| &str | CStr | *const char |
| () | c_void | void |
| u32 or u64 | c_uint | unsigned int |
| 他 | ... | ... |
上述の通り、プリミティブ型は、コンパイラによって暗黙的に変換されます。
unsafe fn foo(num: u32) {
let c_num: c_uint = num;
let r_num: u32 = c_num;
}
他のビルドシステムとの相互運用性
組込みプロジェクトにRustを組み込むための共通の要件は、Cargoとmakeやcmakeのような既存のビルドシステムとを組み合わせることです。
issue #61でこれに関する事例とユースケースを集めています。
RTOSとの相互運用性
RustをFreeRTOSやChibiOSといったRTOSに統合することは、まだ作業を進めている状態です。 特に、RTOSの関数をRustから呼び出すことはトリッキーです。
issue #62でこれに関する事例とユースケースを集めています。