GN⁺: GCC 기반 Rust 컴파일러 개발 진전
(lwn.net)GCC 기반 Rust 컴파일러 개발 진행 상황
- GCC 기반 Rust 컴파일러 프로젝트인 gccrs는 2014년에 시작되어 GNU Compiler Collection(GCC) 내에서 Rust 컴파일러를 구현하는 것을 목표로 함.
- gccrs의 목표는 GCC 13 릴리스에 포함되는 것이었으나, 이는 달성되지 않았고 현재는 GCC 14(2024년 중반 릴리스 예상)에 포함될 것을 목표로 함.
- gccrs는 Rust 버전 1.49를 대상으로 하며, 이는 const generics이 도입되기 전의 마지막 버전임.
- gccrs 프로젝트의 중요한 원칙 중 하나는 Rust의 "superset"을 만들지 않고, rustc의 출력을 그대로 복제하는 것임.
- Rust 표준 라이브러리는 여러 "crates"로 구성되어 있으며, gccrs는 이 중 core와 alloc crate의 컴파일을 지원하는 데 집중하고 있음.
- gccrs는 현재 여러 기능 부족으로 인해 이러한 crates를 컴파일할 수 없으며, borrow checker의 부재와 GCC에서 지원하지 않는 LLVM intrinsics의 부족이 문제임.
GCC 생태계의 이점 활용
- gccrs 개발의 주요 이유 중 하나는 GCC의 보안 플러그인을 활용할 수 있게 하는 것임.
- gccrs는 이미 Sega Dreamcast 홈브루 커뮤니티에서 사용되고 있으며, GCC 플러그인을 사용하여 unsafe Rust 코드의 정적 분석을 수행할 수 있음.
- gccrs 노력을 통해 Rust 명세에 추가 기능을 기여할 수 있었으며, Rust의 공식 명세 작성 작업에 참여하고자 함.
개발 중인 기능들
- gccrs는 여전히 많은 핵심 기능이 누락되어 있으며, async/await, GCC에서 부재한 LLVM intrinsics, format_args!() 매크로 등이 포함됨.
- Polonius 프로젝트는 rustc의 현재 borrow checker의 단점을 해결하기 위해 다른 알고리즘으로 참조 수명을 계산하는 borrow checker를 구현함.
- format_args!() 매크로 작업이 시작되었으며, 이는 다른 문자열 포맷팅 매크로에 전달되는 인수를 구성하는 데 필요함.
rustc_codegen_gcc
- rustc_codegen_gcc는 gccrs보다 더 성숙하고 범위가 제한된 다른 GCC 기반 Rust 프로젝트임.
- rustc_codegen_gcc는 libgccjit 라이브러리를 사용하여 rustc의 LLVM 백엔드 API에 연결하며, rustc와 GCC의 뒤늦은 단계에서 컴파일을 수행함.
- 2023년 10월 기준으로 rustc_codegen_gcc는 추가 패치 없이 Rust for Linux를 컴파일할 수 있음.
Rust for Linux
- Rust for Linux 프로젝트는 rustc 또는 rustc_codegen_gcc를 사용하여 커널용 Rust 코드를 빌드하는 방법에 대한 문서를 제공함.
- gccrs는 Rust for Linux 지원을 목표로 하고 있으나, 현재 지원되는 rustc 버전과의 큰 차이로 인해 실현 가능성이 멀어 보임.
GN⁺의 의견
- gccrs 프로젝트는 Rust 언어의 GCC 기반 컴파일러 구현을 목표로 하며, 이는 Rust 생태계에 다양성을 제공하고 GCC의 보안 플러그인과 같은 기존 도구를 활용할 수 있는 잠재력을 가짐.
- gccrs가 Rust 표준 라이브러리의 핵심 부분을 아직 컴파일할 수 없는 상황이지만, 이미 Sega Dreamcast 홈브루 커뮤니티에서 실제 사용 사례를 찾을 수 있음은 주목할 만함.
- 본 기사는 Rust 언어의 다양한 컴파일러 구현과 그에 따른 생태계 확장 가능성에 대한 흥미로운 통찰을 제공함.
Hacker News 의견
-
첫 번째 댓글 요약:
- 기사에서 gccrs 개발 동기에 대한 주장이 약하다고 느낌.
- gccrs가 GCC의 보안 플러그인을 활용하기 위해 개발되고 있음.
- 리눅스 커널에 러스트 지원을 추가하는 'Rust for Linux' 이니셔티브가 또 다른 이유임.
- 리눅스 커널을 GNU 툴체인만으로 컴파일하길 원하는 커널 개발자들이 많아서 중요한 동기임.
- GCC를 백엔드로 사용하는 이유는 설명되지만, 왜 중복된 프론트엔드가 필요한지에 대한 설명은 부족함.
- C++의 실수에서 배워야 하며, 다양한 프론트엔드는 플랫폼 간 개발을 어렵게 만듦.
- gccrs가 'GNU Rust'가 되지 않도록 주의를 기울이고 있으며, rustc의 출력을 복제하려고 함.
-
두 번째 댓글 요약:
- 러스트에는 언어 표준이 필요함.
- 많은 조직과 산업이 표준이 없으면 러스트를 채택하지 않을 것임.
- C, C++, C#, 자바스크립트(ECMAScript)와 같은 다른 언어들은 모두 표준을 가지고 있음.
-
세 번째 댓글 요약:
- GCC-RS에 대한 부정적인 반응에 놀람.
- 언어가 여러 구현을 가지고 있지 않다면, 그 언어는 불완전한 것임.
-
네 번째 댓글 요약:
- gccrs가 LLVM이 지원하지 않는 아키텍처들에 대한 러스트 지원을 가능하게 할 것임.
-
다섯 번째 댓글 요약:
- gccrs가 rustc의 버그와 특이점까지 복제하려는 것은 실수라고 생각함.
- 러스트에는 공식적인 사양이 없으며, 단일 참조 구현만으로 문서화하는 것은 장기적인 약점임.
- 기존 코드가 모든 구현에서 작동하도록 하려는 것은 합리적이지만, 잘못된 결정과 버그를 영구화하는 문제가 있음.
- 마이크로소프트는 오래된 프로그램이 계속 실행되도록 많은 노력을 기울임.
- 러스트는 언어 개발 초기에 이러한 부담을 지지 말아야 함.
- 언어가 진화하려면 QA와 QC를 수용해야 함.
- 강력한 표준을 가진 언어들은 이러한 믿음을 받아들임.
-
여섯 번째 댓글 요약:
- lwn.net 링크를 게시해줘서 구독 갱신을 상기시켜줌에 감사함.
-
일곱 번째 댓글 요약:
- 리눅스는 이미 clang을 사용하여 컴파일할 수 있음.
- GNU '순수성'을 위해 이러한 중복된 노력을 개발하고 유지하는 것은 가치가 없어 보임.