[Rust 공식문서 한국어 정리] ⑲. Rust와 C++의 안전한 상호운용 — CXX
[Rust 공식문서 한국어 정리] ⑲. Rust와 C++의 안전한 상호운용 — CXX
원문 제목: The CXX Book
작성자: David Tolnay 및 CXX Contributors
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
📌 1. 서론 — 이 문서가 다루는 내용
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
CXX는 Rust와 C++ 간의 상호운용을 안전하게 설계한 툴킷입니다.
기존 FFI의 불안전한 raw 포인터와 수동 메모리 관리 대신, 소유권과 수명을 엄격히 검증하는 자동 바인딩을 생성합니다.
이 문서는 CXX의 설계 철학, 인터페이스 정의 문법(bridge module), 빌드 시스템 연동, 그리고 실전 사용법을 다룹니다.
두 언어의 타입 시스템 간 간극을 메우면서도 런타임 오버헤드를 최소화하는 접근 방식을 중심으로 설명합니다.
C++ 코드베이스를 점진적으로 Rust로 마이그레이션하거나, Rust에 C++ 기능을 통합해야 하는 팀에게 필수적입니다.
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
🔑 2. 핵심 개념 4가지
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
① Bridge Module: #[cxx::bridge] 매크로를 사용해 Rust와 C++이 공유하는 인터페이스를 선언합니다.
② Shared Types: 두 언어 모두에서 사용 가능한 구조체와 열거형을 정의할 수 있습니다.
③ Safe Abstraction: CXX는 raw 포인터 대신 Box, Vec, String, UniquePtr 등의 안전한 타입을 교차 언어 경계로 전달합니다.
④ Zero-cost Interop: 런타임 리플렉션이나 직렬화 없이 C++의 제로 오버헤드 추상화 철학을 유지합니다.
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
📖 3. 주요 내용 상세
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
CXX의 핵심은 #[cxx::bridge] 어노테이션이 붙은 모듈입니다.
이 모듈 안에서 Rust 측 함수와 C++ 측 함수를 선언하면, CXX 빌드 플러그인이 양방향 glue 코드를 자동 생성합니다.
Rust에서 extern "Rust"로 C++에 노출할 함수를, C++에서 extern "C++"로 Rust에 노출할 함수를 정의합니다.
지원되는 타입은 제한적이지만 핵심적인 것들이 포함됩니다.
기본 타입(u8, i32, bool 등), String, Vec<T>, Box<T>, SharedPtr<T>, UniquePtr<T>, CxxVector 등이 가능합니다.
사용자 정의 구조체는 필드 타입이 CXX-safe한 경우에만 공유할 수 있습니다.
빌드 연동은 cxx-build 크레이트를 통해 이루어집니다.
build.rs에서 cxx_build::bridge("src/lib.rs")를 호출하고, C++ 소스를 추가 컴파일하면 됩니다.
Cargo는 자동으로 C++ 컴파일러를 호출하고, 정적 라이브러리를 Rust 바이너리에 링크합니다.
메모리 안전성은 CXX의 가장 큰 강점입니다.
C++의 UniquePtr은 Rust의 Box와 대응되며, 소유권 이전 시 명확한 의미를 갖습니다.
SharedPtr은 참조 카운팅을 공유하지만, Rust 측에서는 참조만 가능하고 변형은 제한됩니다.
이러한 제약은 의도적으로 설계된 것이며, use-after-free나 이중 해제를 원천 차단합니다.
예외 처리 측면에서 CXX는 C++ 예외를 Rust panic으로, Rust panic을 C++ 예외로 변환하는 메커니즘을 제공합니다.
다만 모든 예외가 안전하게 전파되는 것은 아니며, noexcept 함수와의 상호작용에 주의가 필요합니다.
또한 C++ 템플릿은 직접 노출할 수 없고, 구체화된 타입만 인터페이스에 노출할 수 있습니다.
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
🛠 4. 실전 활용
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
기존 C++ 게임 엔진이나 미디어 파이프라인의 일부를 Rust로 교체할 때 CXX를 사용합니다.
bridge 모듈에서 안전한 경계를 정의하고, C++의 복잡한 클래스를 Rust가 이해할 수 있는 단순한 타입으로 매핑합니다.
빌드 시스템은 Bazel이나 CMake와도 통합 가능하며, 대규모 모노레포에서도 활용됩니다.
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
✅ 5. 정리
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
CXX는 Rust와 C++ 간 안전한 상호운용을 위한 현대적인 솔루션입니다.
bridge 모듈과 제한적이지만 안전한 타입 시스템을 통해 메모리 버그를 크게 줄일 수 있습니다.
기존 C++ 자산을 Rust로 점진적으로 전환할 때 강력한 도구로 작용합니다.
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
🔗 출처 링크
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
원문: https://cxx.rs/
GitHub: https://github.com/dtolnay/cxx
#Rust #CXX #Cpp #Interop #FFI #SafeInterop # SystemsProgramming #번역

오뉴노노 님의 최근 댓글
ㅋㅋㅋㅋㅋ 2019 01.14 잘 읽었습니다 2018 12.30 포인트가 없어서 아직 시작을 못하고있는데요! 글은 잘 읽었습니다! 포인트 쌓고 도전할거에요 2018 12.30