GN⁺: C 언어로 작성된 Rust 컴파일러
(notgull.net)왜 C로 Rust 컴파일러를 작성하는가?
-
최근 활동이 줄어든 이유는 여러 가지가 있음
- 가족의 죽음 등 개인적인 사건
- 직장에서의 책임 증가
- 오픈 소스에 대한 열정 감소
- 새로운 프로젝트에 집중
-
이 프로젝트는 순수 C로 Rust 컴파일러를 작성하는 것임
- C++이나
flex
,yacc
,Makefile
없이 순수 C로 작성 - 프로젝트 이름은 Dozer
- C++이나
왜 이런 일을 하는가?
- 부트스트래핑과 그 중요성을 이해해야 함
- Rust 코드를 실행하려면 컴파일러가 필요함
- Rust의 주요 컴파일러는 rustc임
- rustc는 Rust로 작성되었으며, Rust 코드를 컴파일하기 위해 필요함
- rustc를 컴파일하려면 이전 버전의 rustc가 필요함
- 초기 버전의 rustc는 OCaml로 작성되었음
- OCaml 컴파일러는 Guile로 컴파일 가능하며, Guile은 C로 작성됨
하강 원리
-
Bootstrappable Builds 프로젝트 소개
- 512바이트 바이너리 시드로 시작
- 간단한 컴파일러로부터 점진적으로 더 복잡한 컴파일러를 생성
- 최종적으로 TinyCC, GCC, Linux 등을 컴파일 가능
-
Rust는 이 과정에서 매우 늦게 등장
- mrustc를 사용하여 rustc 1.56 버전을 컴파일
- C++ 도입 이전에 Rust를 사용하고 싶다면 불가능
-
Dozer는 C로 부트스트랩 가능한 Rust 컴파일러를 목표로 함
- TinyCC로 부트스트랩 가능해야 함
계획
-
지난 두 달 동안 Dozer 작업
- TinyCC와 cproc으로 컴파일 가능
- QBE를 백엔드로 사용
- 현재 렉서와 일부 파서 완료
- 매크로/모듈 확장은 미루고 있음
- 타입체크는
i32
만 지원 - 코드 생성은 아직 미흡
-
앞으로의 계획
- Dozer를 점진적으로 발전시켜 기본적인
libc
샘플,libcore
, rustc를 컴파일 가능하게 함 -
cargo
와 유사한 도구를 만들어 Rust 패키지를 컴파일 가능하게 함 - 자동 생성된 코드를 제거
- rustc와
cargo
를 컴파일하는 프로세스 생성
- Dozer를 점진적으로 발전시켜 기본적인
GN⁺의 정리
- 이 글은 순수 C로 Rust 컴파일러를 작성하는 프로젝트에 대한 이야기임
- 부트스트래핑의 중요성과 이를 통해 Rust 컴파일러를 만드는 과정 설명
- Dozer 프로젝트는 C로 부트스트랩 가능한 Rust 컴파일러를 목표로 함
- 이 프로젝트는 매우 도전적이며, 성공 여부는 불확실하지만 시도 자체에 의미가 있음
Hacker News 의견
-
Rust를 부트스트랩하려면, C로 프로토-러스트를 작성한 후, 프로토-러스트로 전체 러스트 컴파일러를 작성하는 것이 좋음
- 프로토-러스트는 차용 검사기나 매크로 지원이 없고, 메모리를 해제하지 않으며, 좋은 코드를 생성할 필요가 없음
- 프로토-러스트는 러스트 문법을 가진 C와 같음
- 왜 이 경로가 선택되지 않았는지 궁금함
-
취미로 Rust로 C 컴파일러를 작성 중이며, "Small C Compiler"라고 부름
- Cranelift를 백엔드로 사용하며, 컴파일러 아키텍처는 플러그 가능하고 해킹 가능함
- printf("Hello World!")를 처리할 수 있을 때까지 오픈 소스 계획이 없음
- 전처리기와 파서를 구현하려고 노력 중이며, rust-peg와 HimeCC에 참여함
- typedef 문제로 인해 학계의 해결책이 궁금함
-
하드웨어에서도 동일한 부트스트랩 문제 존재
- 컴퓨터는 이전에 만들어진 컴퓨터와 소프트웨어로 만들어짐
- 생각해볼 만한 흥미로운 주제임
-
부트스트랩의 이점을 찾기 위해 4개의 링크를 따라가야 했음
- 제목의 "왜" 부분이 그 이유를 설명할 것이라고 기대했음
-
부트스트랩 체인에 C++이 도입되면 부트스트랩이 거의 끝남
- Rust를 사용하려면 C++ 도입 이전에 사용해야 함
- Rust 컴파일러가 C에서 부트스트랩될 수 있으면 좋겠음
- 그러나 이전 버전의 rustc는 이전 버전의 rustc로 컴파일됨
- OCaml 컴파일러를 Guile로 성공적으로 컴파일할 수 있음
- 저자는 C++ 단계를 제거하고 C 단계를 선호함
- 저자의 동기가 명확하지 않음
-
목표 시스템에서 새로운 바이너리를 생성하려면 rustc가 해당 시스템을 지원해야 함
- rustc에 해당 지원을 추가하면 스스로 빌드할 수 있음
-
Scheme으로 C++ 인터프리터나 컴파일러를 작성하는 것을 상상함
- Scheme에서 현재 gcc로 바로 가는 것은 큰 지름길이 될 것임
- 그러나 C++ 컴파일러 작성은 거의 불가능하다는 것이 일반적인 지혜임
-
전체 스택을 보면 "trusting trust" 문제를 우회할 수 있는 방법일 수 있음
-
QBE를 백엔드로 사용하는 것이 마음에 듦
- Rust와 LLVM과의 비교를 보는 것이 흥미로울 것임
- 행운을 빔
-
부트스트랩 과정에 FORTH를 도구 체인의 일부로 사용하는 것을 고려할 수 있음