Reddit

What stable Rust stands on: nightly features inside the compiler

안정판 Rust 컴파일러도 nightly 기능을 쓴다: 사용자 코드와 다른 빌드 경로

작성자가 특정 Rust 컴파일러 커밋의 크레이트별 기능 선언을 세어 보니 nightly 전용 기능이 83개였습니다. 베타 컴파일러로 rustc를 빌드하는 과정에서 부트스트랩 설정이 이를 허용하지만, 컴파일러 내부의 사용이 안정판 사용자 코드의 사용을 뜻하지는 않습니다.

본문

Rust 컴파일러 소스에는 작성자가 커밋 f45772e에서 세어 본 기준으로 nightly 기능 83개가 선언돼 있습니다. Rust 컴파일러를 빌드할 때는 보통 베타 컴파일러를 stage0로 사용하고, 부트스트랩 과정에서 RUSTC_BOOTSTRAP=1을 설정해 안정판·베타 컴파일러에서도 불안정 기능을 쓰도록 합니다. Rust 개발자 가이드는 이 설정이 안정성 보장을 깨므로 컴파일러 부트스트랩 외에는 사용하지 말라고 설명합니다. 컴파일러 내부의 기능 사용과 일반 프로젝트의 안정성 보장은 서로 다른 빌드 조건에 놓여 있습니다.

컴파일러 코드에서 줄이는 반복

글은 deref_patterns와 default_field_values를 사례로 들었습니다. deref_patterns는 Vec<String> 같은 값의 패턴을 내부 요소까지 따라가며 비교하게 해, 안정판에서 필요한 슬라이스 변환이나 별도 참조 목록을 줄입니다. rustc 내부에서는 Box로 감싼 자료 구조를 한 번에 패턴 매칭하는 데도 쓰입니다. 다만 역참조 결과가 일관돼야 패턴의 완전성을 안전하게 검사할 수 있어 지원 범위가 제한됩니다. 추적 이슈는 표준 라이브러리 타입에 적용을 한정하고, 이를 뒷받침하는 불안정 트레이트 DerefPure는 현 단계에서 안정화할 계획이 없다고 적었습니다. RFC 작성과 안정화 PR도 남아 있어 안정판 적용 시점은 확인된 자료에 나오지 않습니다.

default_field_values는 구조체 필드 선언에 기본값을 적어 두고 초기화할 때 해당 필드를 생략하게 합니다. 필수 필드는 그대로 지정해야 하며 .. 구문은 기본값이 있는 필드에 적용됩니다. derive(Default)도 필드에 선언한 값을 사용합니다. 작성자는 파서의 20개 필드 중 16개가 기본값을 가지며, 리졸버에는 96개 필드 중 57개가 기본값을 가진다고 소개했습니다. RFC 3681은 승인됐고 구현도 진행됐지만, 공식 추적 이슈에는 문서 작업과 안정화 PR이 남아 있습니다. 기본값 표현식의 const 제약을 없앨지도 미결 사항입니다. 따라서 컴파일러에서 실제로 쓰인다는 사실이나 RFC 승인만으로 안정판 배포가 임박했다고 볼 수는 없습니다.

자료: kivo's blog, Rust Compiler Development Guide, rust-lang/rust 추적 이슈 / 정리·해설: Trawling

참고 자료