TL;DR
ある言語から、別の言語で書かれたライブラリの関数を呼び出したり、逆に自分の関数を別の言語に公開したりする仕組み。Foreign Function Interface の略。
仕組み
The Rustonomicon によると、Rust では外部ライブラリの関数のシグネチャを extern ブロックに並べ、C の ABI で呼び出す。#[link(...)] 属性で、リンカにリンクするライブラリを指示する。
#[link(name = "snappy")]
unsafe extern "C" {
fn snappy_max_compressed_length(source_length: size_t) -> size_t;
}逆に Rust の関数を C から呼ぶときは、extern "C" で C の呼び出し規約に合わせ、#[unsafe(no_mangle)] で名前マングリングを止めてシンボル名を固定する。構造体のレイアウトを C と合わせるには #[repr(C)] を付ける。
注意点
コンパイラは外部関数の宣言が正しいかを確かめられないので、引数の型を正しく書くことも、実行時の正しさを保つ責任に含まれる。外部の関数は unsafe とみなされ、呼び出しは unsafe ブロックで包む必要がある。The Rustonomicon は、すべての入力に対して safe なラッパ関数で、unsafe な呼び出しを隠すよう勧めている。
Effective Rust によると、FFI 境界での問題を減らすには、メモリの確保と解放を常に境界のどちらか一方で行い、サイズの決まった整数型を使う。C の宣言と Rust の宣言を手で合わせるのは間違えやすいので、bindgen で自動生成するとよい。