1P by neo 24일전 | favorite | 댓글 1개

왜 C로 Rust 컴파일러를 작성하는가?

  • 최근 활동이 줄어든 이유는 여러 가지가 있음

    • 가족의 죽음 등 개인적인 사건
    • 직장에서의 책임 증가
    • 오픈 소스에 대한 열정 감소
    • 새로운 프로젝트에 집중
  • 이 프로젝트는 순수 C로 Rust 컴파일러를 작성하는 것임

    • C++이나 flex, yacc, Makefile 없이 순수 C로 작성
    • 프로젝트 이름은 Dozer

왜 이런 일을 하는가?

  • 부트스트래핑과 그 중요성을 이해해야 함
    • 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를 컴파일하는 프로세스 생성

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를 도구 체인의 일부로 사용하는 것을 고려할 수 있음