The Rust Programming Language(the book이라고도 불린다)는 rust-lang에서 관리하는 공식 가이드 북이다. 러스트 설치 방법부터 시작하여 기본적인 문법, 자료형, borrow checker, generic과 trait, 스마트 포인터, 동시성 등등 전반적인 러스트를 설명하고 있다. 러스트를 처음 시작하는 분들을 위한 책이며, 처음 시작한다면 무조건 읽어야 하는 필독서다.
'나는 영어로 된 거 읽기 불편해~'하는 분들을 위해 rust-kr 커뮤니티가 관리하는 한국 번역판도 있고, '아 나는 e북은 잘 안들어오더라~'하는 분들을 위해 종이책도 출판되어 있다.
이번 글에서 다루려 하는 내용은 #![feature(...)], feature 속성이다. feature 속성에 대해 설명하기 전에 우선 러스트의 릴리즈 모델에 대한 설명이 필요하다. 러스트는 총 stable, beta, nightly 이렇게 세 가지 릴리즈 채널이 있다. 이름에서 자신이 어떤 역할을 하고 있는 채널인지 잘 설명하고 있는데, 부연 설명을 덧붙이자면, stable은 말그대로 안정 채널이고, production 레벨에서 러스트를 사용하고 있다면 이 채널을 사용하는 것이 안전하다. beta 역시 말그대로 베타 채널인데, nightly에서 stable로 넘어가기 전에 한 번 더 검사하는 단계라고 볼 수 있다. nightly는 우리고 자고 일어날때마다 변경이 생기는 채널이다. 날마다 승인되는 PR들을 각각 merge 하는 것이 아니라(물론 우선순위가 높거나, 작업량이 많은 PR은 단독으로 병합되기도 함) rollup하는 PR을 하나 만들고, 그 PR안에 승인된 PR 여러 개를 묶어 main 브랜치로 보낸다.
feature 중에서 Unstable feature라고 아직 안정화되지 않은 feature 들이 있다. The Rust Programming Language에서는 If you’re using a beta or stable release of Rust, you can’t use any feature flags. 라고 Unstable feature를 설명한다.

만약 Unstable feature 속성을 nightly가 아닌 stable이나 beta 채널에서 사용하면 아래와 같은 에러가 발생한다.

"`#![feature]` may not be used on the stable release channel" 이라는 메시지가 나오는데, RFC2119에서 may의 정의를 다음과 같이 내리고 있다.
MAY This word, or the adjective "OPTIONAL", mean that an item is truly optional.
아무튼 선택적이라는 뜻인데, 그럼 다시 해석하자면 stable 채널에서도 feature 속성을 사용할 수 방법이 있다는 의미이다.
이제 질문이 생긴다.
어떻게?? 그리고 왜???
어떻게 라는 질문에 답을 먼저하자면 러스트에는 RUSTC_BOOTSTRAP 플래그가 있다. Unstable book에는 이렇게 설명하고 있다.
The RUSTC_BOOTSTRAP environment variable tells rustc to act as if it is a nightly compiler; in particular, it allows #![feature(...)] attributes and -Z flags even on the stable release channel.
즉 stable이나 beta 채널에서 #![feature(...)]와 -Z 플래그 기능을 사용하게 해주는 것이다. 이렇게 공식에서 제공하는 우회하여 사용하는 방법이 있기 때문에 에러 메시지에서 "사용할 수 없다", "MUST NOT"을 사용하지 않는 것이다.
RUSTC_BOOTSTRAP을 활성화하면 feature gate 체킹에서 우회를 하여 beta와 stable 채널에서도 unstable feature 기능을 사용할 수 있게 한다. (feature gate checking에 대해 더 궁금한 사람은 이 문서를)
러스트 코드를 살짝 맛보자면,,,
환경변수에서 RUSTC_BOOTSTRAP이 활성화 되어있다면 UnstableFeatures가 Cheat이 되고 이후 is_nightly_build()에서 true를 반환하게 되어 nightly가 아닌 채널에서도 우회하여 feature 사용이 가능하다.
enum 이름이 Cheat 이라니, 뭔가 정상적인 방법이 아니라는 것은 알겠다. 그런데 왜 존재할까?
변수 이름 RUSTC_BOOTSTRAP에 힌트가 있다. 컴파일러에서 부트스트랩은 자기 자신을 컴파일 한다는 의미다. 즉 러스트 코드를 컴파일 하는 러스트 컴파일러 rustc의 언어는 러스트다. 쉽게 말해 stable이 beta 버전을, beta 버전이 nightly 버전을 컴파일 한다. 표준 라이브러리나 컴파일러에서 모두 unstable feature를 사용하는데, stable과 beta 채널에서 이를 막아버리면 어떻게 컴파일 할 방법이 없다. 그래서 RUSTC_BOOTSTRAP 플래그를 만들고 우회하는 방법을 만들어 해결한 것이다.
정리하자면 RUSTC_BOOTSTRAP 환경 변수를 사용한다면 nightly가 아닌 stable, beta 채널에서도 Unstable feature 속성을 사용할 수 있지만, 이는 일반적인 방법도, 권장되는 방법도 아니다. 부트스트래핑을 위한 방법이니 웬만하면 사용하지 않도록 하자.
'Programming Language > 러스트' 카테고리의 다른 글
| 테스트로 배우는 러스트 (4) | 2025.06.30 |
|---|---|
| [Rust] 러스트의 꽃, 소유권 (0) | 2024.11.22 |
| [Rust] 러스트에게 반한 점, immutable & mutable 변수 (0) | 2024.11.21 |
| [Rust] 러스트에서 이분탐색 (0) | 2024.11.11 |