HN 日本語サマリー

← 一覧へ戻る
プログラミング

Cpp2Rust: C++を安全なRustへ自動翻訳

Cpp2Rust: Translates C++ to safe Rust automatically (github.com)

34 pointsby signa113 コメント

要約

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