プログラミング
Cpp2Rust: C++を安全なRustへ自動翻訳
Cpp2Rust: Translates C++ to safe Rust automatically (github.com)
要約
Cpp2Rustは、C++コードを完全に安全なRustコードへ自動的に変換するツールです。Clangの抽象構文木(AST)に基づいた構文駆動型のトランスレーターであり、安全なRustコードを生成します。参照カウントモデルがデフォルトで使用され、必要に応じてランタイムライブラリ(libcc2rs)が利用されます。
全文翻訳
Cpp2RustはC++を完全に安全なRustへ自動的に翻訳します。これはClangのASTに基づいた構文駆動型のトランスレーターです。Cpp2Rustのアルゴリズムは、PLDI 2026で発表された論文Cpp2Rust: Automatic Translation of C++ to Safe Rustで説明されています。
概要
Cpp2Rustはまず、Clangを使用して入力C++ファイル(複数可)を解析し、ASTを生成します。次に、ASTをトラバースしてRustコードを文字列として出力し、必要に応じてlibcc2rsランタイムライブラリへの呼び出しを挿入します(例:生のポインタセマンティクスの場合)。最後に、Rustコードはrustfmtを使用して単一の.rsファイルに整形されます。デフォルトでは参照カウントモデルが使用され、完全に安全なRustが生成されます。デバッグやパフォーマンス比較のために、--model=unsafeコマンドライン引数を通じてunsafeなRustを生成するジェネレーターも利用可能です。
ランタイムライブラリ(libcc2rs)
生成されたコードは、翻訳プロセスを簡素化するために設計されたランタイムライブラリに依存しています。Cのポインタはlibcc2rsが提供するPtr<T>型に変換されます。Ptr<T>は、null、算術演算、エイリアシングを含むCポインタのセマンティクスをモデル化しつつ、チェックされた実行時操作を通じてRustの借用チェッカーを満たします。
要件
Ubuntuでは、以下のコマンドで必要な依存関係をインストールします。
sudo apt install libclang-22-dev clang++-22 ninja-build cmake curl -LsSf https://astral.sh/ruff/install.sh | sh
ビルド
mkdir build
cd build
cmake -GNinja ..
ninja
ninja check
実行
単一ファイルを翻訳する
./build/cpp2rust/cpp2rust --file=<file>.cpp -o=<file>.rs
デフォルトでは参照カウントモデルが使用されます(安全な出力)。代わりにunsafeなRustを生成するには以下を実行します。
./build/cpp2rust/cpp2rust --file=<file>.cpp -o=<file>.rs --model=unsafe
最小限の例。
hello.cpp の場合:
#include <cstdio>
int main() {
printf("hello world\n");
return 0;
}
./build/cpp2rust/cpp2rust --file=hello.cpp -o=hello.rs を実行すると、以下が生成されます。
pub fn main() {
std::process::exit(main_0());
}
fn main_0() -> i32 {
println!("hello world");
return 0;
}
コンパイルして実行するには:
rustc hello.rs -L ../libcc2rs/target/debug
./hello
プログラム全体を翻訳する
まず、プロジェクトのcompile_commands.jsonを生成します。CMakeでは、これは追加のフラグ1つです。
cmake -DCMAKE_EXPORT_COMPILE_COMMANDS=ON ..
その後、以下を実行します。
./build/cpp2rust/cpp2rust --dir=<dir> -o <output>.rs
<dir>はcompile_commands.jsonを含むディレクトリである必要があります。
テストスイート
すべてのテストを実行する
ninja check
単体テストのみを実行する
ninja check-unit
libcc2rsの単体テストを実行する
ninja check-libcc2rs
libcc2rs-macrosの単体テストを実行する
ninja check-libcc2rs-macros
意図的な変更後に単体テストの期待される出力を再生成する
REPLACE_EXPECTED=1 ninja check-unit