crustc는 전체 rustc 컴파일러를 C 로 변환합니다
crustc는 전체 rustc 컴파일러를 C로 변환합니다
crustc는 전체 rustc 컴파일러를 C로 변환합니다
crustc는 rustc 1.98.0‑nightly (c712ea946 2026‑06‑16) 전체 소스를 대략 4600만 줄의 C 로 변환하는 데모입니다. 생성된 C 코드는 표준 GCC 툴체인으로 컴파일되며 표준 라이브러리를 빌드할 수 있는 작동하는 Rust 컴파일러를 생성합니다.
crustc가 실제로 하는 일
crustc는 저자의 개인 cilly 툴체인을 기반으로 만든 트랜스파일러입니다. cilly는 휴대 가능한 ANSI‑C 코드를 내보내는 Rust 라이브러리이자 변환을 수행하는 컴파일러 백엔드 플러그인입니다. 핵심 아이디어는 다음과 같습니다:
- 컴파일러에 구애받지 않는 출력 –
cilly는 대상 C 컴파일러가 지원하는 언어 기능(예:_Thread_local, 타입 크기 등)을 탐색하고 그에 맞게 생성된 C 코드를 맞춤화합니다. - 네트워크 투명성 – 이 도구는 TCP(또는 UART)로 원격 C 컴파일러와 통신할 수 있어, 강력한 호스트가 네이티브 C 툴체인이 없는 장치의 컴파일을 수행하도록 할 수 있습니다.
- Makefile 생성 – 생성된 객체에 포함된 선택적 마커를 통해
cilly는 디렉터리 구조의 Makefile들을 재구성할 수 있어, C 컴파일러를 이용한 전통적인make기반 Rust 코드 빌드를 가능하게 합니다.
현재 저장소는 자신 자신을 컴파일하는 컴파일러만을 보여주며, 저자는 이를 “가장 화려한 쇼케이스”라고 부릅니다.
rustc를 C로 변환하는 이유는?
주된 동기는 하드웨어 지원입니다. 많은 레거시 혹은 희귀 플랫폼은 LLVM이나 최신 GCC 버전을 제공하지 않지만 C 컴파일러는 가지고 있습니다. Rust를 C로 변환함으로써 이러한 시스템에서도 전체 LLVM 스택 없이 Rust 프로그램을 실행할 수 있습니다.
"이 작업의 주요 목표는 LLVM/GCC 지원이 없는 오래되거나 희귀한 하드웨어를 지원하는 것입니다. 아직 Rust를 지원하지 않지만 C는 지원하는 시스템이 존재합니다." – crustc README
이는 고전적인 Rust 부트스트래핑 역설을 회피하기도 합니다: C 컴파일러만 제공하는 머신에서 Rust 컴파일러를 빌드하고, 이를 이용해 대상 플랫폼용 Rust를 컴파일할 수 있습니다.
빌드 방식
- 전제 조건 – 최신 GCC(저자는 GCC 13.3.0 사용)와 upstream
rustc가 기대하는 일치하는 LLVM 라이브러리(libLLVM.so.22.1‑rust‑1.98.0‑nightly). - 컴파일 –
make -j20 LLVM_LIB_DIR=~/.rustup/toolchains/nightly-2026-06-16-aarch64-unknown-linux-gnu/lib를 실행합니다. 빌드 결과는 C로 작성된rustc바이너리가 생성됩니다. - 실행 –
LD_LIBRARY_PATH를 LLVM 라이브러리 경로로 설정하고./rustc/rustc --version을 실행하면 원본 버전 문자열이 표시됩니다.
저자는 최적화는 비활성화해야 한다고 언급합니다; CFLAGS=-g 로 전체 빌드는 20코어 머신에서 약 1분 18초에 완료됩니다. -O2 를 활성화하면 큰 소스 파일에서 종종 크래시가 발생합니다.
현재 제한 사항 및 버그
- 생성된 C 코드는 타깃‑특정이며, ARM64용으로 만든 코드는 재생성 없이 RISC‑V에서 실행되지 않습니다.
- 특히 ARM64에서 Rust가 작은 구조체에 사용하는
sret호출 규약을 컴파일러가 표현하지 못해 ABI 불일치가 남아 있습니다. - 저장소 루트에서 실행할 경우 경로 정규화 문제로 Crustc가 크래시합니다(저자는 이 버그에 대해서도 혼란스러워합니다).
cilly툴체인은 아직 공개되지 않음이며, 저자는 개인적인 제약(새 직장, 논문, 그리고 문자 그대로 블렌더 사고) 때문에 지연되고 있다고 설명합니다.
커뮤니티 반응
- 헌신 – 댓글자
@lioeters는cilly뒤에 14년의 노력이 있음을 칭찬하고 부트스트래핑 관련성을 강조했습니다. - 기존 프로젝트와 비교 –
@ahartmetz는 LLVM의 과거 C 백엔드를 떠올리게 하며 최근 부활 논의에 링크를 달았습니다. - 실용성 우려 –
@nxtfari는 보안‑중요 혹은 레거시 시스템에 베타 트랜스파일러를 신뢰하는 것에 회의적이지만, 개념 자체는 흥미롭다고 평가했습니다. - 성능 호기심 –
@Tiberium은 C‑생성 코드가 네이티브 LLVM‑생성 바이너리와 비교해 어떤 성능을 보이는지 물으며, 비포팅 사용 사례 가능성을 제시했습니다. - 부트스트랩 가능한 OS 관심 –
@Imustaskforhelp는 crustc가 OCaml이나 다른 무거운 툴체인에 대한 의존성을 줄여 부트스트랩 가능한 Rust 빌드를 단순화할 수 있다고 제안했습니다.
전반적으로 커뮤니티는 crustc를 새로운 개념 증명으로 보며, 이식성, 부트스트래핑, 크로스‑컴파일에 대한 흥미로운 함의를 가지고 있지만 도구가 아직 실험 단계임을 인식하고 있습니다.
전망
crustc는 전체 Rust 컴파일러를 ANSI‑C 로 표현하고 기존 C 툴체인으로 빌드할 수 있음을 보여줍니다. 저자가 최종적으로 전체 cilly 스위트를 공개한다면, 개발자는 Plan 9 VM부터 희귀 임베디드 CPU까지 모든 C‑호환 플랫폼을 대상으로 할 수 있게 되며, 맞춤형 LLVM 백엔드를 작성할 필요가 없어집니다. 그때까지 crustc는 Rust를 소스‑투‑소스 변환 문제로 다룰 때 기술적으로 가능한 것의 매력적인 쇼케이스로 남아 있습니다.