← На главную

Cpp2Rust автоматически переводит C++ в безопасный Rust через clang AST

10.07.2026 16:24 · hackernews

Cpp2Rust автоматически переводит C++ в безопасный Rust. Это синтаксически-ориентированный транслятор на основе clang AST. Алгоритм описан в статье Cpp2Rust: Automatic Translation of C++ to Safe Rust, опубликованной на PLDI 2026. Cpp2Rust сначала парсит C++-файлы через clang, получает AST, обходит его и генерирует Rust-код как строки. Он вставляет вызовы runtime-библиотеки libcc2rs там, где это нужно (например, для семантики сырых указателей). Затем код форматируется через rustfmt в один .rs-файл.

По умолчанию используется модель reference counting — она выдаёт полностью безопасный Rust. Есть и режим unsafe через флаг --model=unsafe — для отладки и сравнения производительности. Runtime-библиотека libcc2rs упрощает перевод: C-указатели превращаются в тип Ptr<T>, который моделирует семантику C (null, арифметику, aliasing) и уживается с borrow checker через проверки на этапе выполнения.

Сборка под Ubuntu: sudo apt install libclang-22-dev clang++-22 ninja-build cmake, потом curl для ruff, mkdir build, cmake -GNinja .., ninja, ninja check. Пример: для hello.cpp с printf cpp2rust генерирует Rust-код с println! и std::process::exit(main_0()). Компиляция через rustc hello.rs -L ../libcc2rs/target/debug и запуск ./hello.

Чтобы перевести целый проект, нужен compile_commands.json. Для CMake он создаётся флагом -DCMAKE_EXPORT_COMPILE_COMMANDS=ON. Затем запуск: ./build/cpp2rust/cpp2rust --dir=<dir> -o <output>.rs. Есть команды для тестов: ninja check — все тесты, check-unit — модульные, check-libcc2rs — тесты библиотеки, check-libcc2rs-macros — тесты макросов. Если нужно обновить ожидаемый вывод после правок — REPLACE_EXPECTED=1 ninja check-unit.

Читать оригинал →