[Rust] 1.84.0 업데이트 발표 (번역)
https://blog.rust-lang.org/2025/01/09/Rust-1.84.0.html
러스트는 누구든 믿음직하고 효과적인 소프트웨어를 만들 수 있게 도와주는 끝내주는 언어입니다.
만약 rustup을 통해서 Rust의 이전버전을 설치해놓은 상대라면, 업데이트는 아주 쉽습니다. 그냥 이렇게 치면 돼요.
rustup update stable
rustup을 설치한 적이 없다면, 우리 웹사이트의 설치 페이지에서 받을 수 있습니다. 그리고 깃허브에서 이번 버전에 대한 릴리즈 노트를 참조해보세요.
미래의 릴리즈를 테스트해서 러스트 팀을 돕고 싶다면, 로컬에서 베타 채널(rustup default beta) 또는 nightly 채널(rustup default nightly)로 업데이트하는 것을 고려할 수 있습니다.
버그를 발견했다면 리포트해주세요!
1.84.0 stable에는 무엇이 있나요?
Cargo가 의존성 버전 선택에 Rust 버전을 확인
1.84.0은 minimum supported Rust version (MSRV)에 대한 aware resolver를 안정화합니다. 이건 프로젝트에서 선언한 MSRV와 호환되는 종속성 버전을 선호하도록 하는 역할을 합니다.
MSRV-aware 버전 선택을 통해 각 종속성에 대해 이전 버전을 수동으로 선택할 필요가 없게 하는데, 이러면 유지보수자가 예전버전의 툴체인을 지원하는 수고를 감소시킬 수 있죠.
.cargo/config.toml을 통해 MSRV-aware resolver에 옵션을 지정할 수 있습니다.
[resolver]
incompatible-rust-versions = "fallback"
그리고 종속성을 추가하면, 이렇게 되죠.
$ cargo add clap
** Updating crates.io index**
warning: ignoring clap@4.5.23 (which requires rustc 1.74) to maintain demo's rust-version of 1.60****
** Adding clap v4.0.32 to dependencies**
** Updating crates.io index**
** Locking 33 packages to latest Rust 1.60 compatible versions**
** Adding clap v4.0.32 (available: v4.5.23, requires Rust 1.74)**
CI에서 최신 종속성들을 검증할 때 이렇게 무시하도록 할 수도 있습니다.
$ CARGO_RESOLVER_INCOMPATIBLE_RUST_VERSIONS=allow cargo update
** Updating crates.io index**
** Locking 12 packages to latest compatible versions**
** Updating clap v4.0.32 -> v4.5.23**
You can also opt-in by setting package.resolver = "3" in the Cargo.toml manifest file though that will require raising your MSRV to 1.84. The new resolver will be enabled by default for projects using the 2024 edition (which will stabilize in 1.85).
이를 통해 라이브러리 작성자가 새로운 러스트 툴체인 기능 선택에 대한 정책을 결정할 때 더 많은 유연성을 제공할 수 있습니다.
이전에는, 새로운 러스트 툴체인의 기능을 사용하는 라이브러리는 러스트 구버전을 가진 라이브러리의 다운스트림 사용자가 툴체인을 업그레이드해야 했거나, 툴체인과 호환되는 라이브러리의 구버전을 수동으로 선택하도록 강요를 받았습니다.
그리고 cargo update 실행을 피했죠.
이제, 그 사용자들은 그들의 구버전 툴체인과 호환되는 예전 라이브러리 버전을 자동으로 사용할 수 있게 될 겁니다.
MSRV 정책 결정에 대한 더 많은 고려사항에 대해서는 문서를 참조하세요.
새로운 trait solver로의 마이그레이션 시작
러스트 컴파일러는 trait solver에 대한 새로운 구현으로 이동중에 있습니다. 차세대 trait solver는 러스트 타입 시스템의 핵심 구성 요소를 재구현한 거죠.
이 구성요소는 trait bound 검사만 책임지던 것이 아니라, 여기저기 많이 사용되었습니다.
trait bound의 예: Vec
그러나 normalization과 같은 타입 시스템의 다른 많은 부분에서도 사용됩니다.
<Vec
1.84에서는 새로운 resolver가 trait impl의 일관성(coherence)을 확인하는 데 사용됩니다. 고수준에서의 일관성은 다른 crate에서 아직 작성되지 않았거나, 가시적인 코드인지를 고려하기 위해서 주어진 타입에 대해 1개의 trait 구현이라도 있는지 확인하는 역할을 하죠.
이 안정화는 이전 구현의 몇 가지 이론적인 정확성 문제를 대부분 수정하여 잠재적으로 "trait 구현의 충돌"을 초래할 수 있습니다. 이전에는 보고되지 않았을 거에요.
crater를 통한 사용가능한 코드 평가를 기반했을때, 영향을 받는 패턴이 매우 드물 것으로 예상합니다.
이 안정화는 또한 impl이 겹치지 않는다는 것을 증명하는 능력을 향상시켜서, 경우에 따라 더 많은 코드를 작성할 수 있게 해줄 겁니다.
자세한 내용은 이전의 블로그 게시물과 안정화 보고서를 참조하세요.
Strict provenance APIs
Rust에서 포인터는 단순히 정수나 주소가 아닙니다. 예를 들어, "use after free"은 "운이 좋아서" free 메모리가 읽기/쓰기 전에 재할당되더라도 항상 정의되지 않은 행동(undefined behavior:UB)입니다.
다른 예를 들어보자면, &i32 참조로부터 가져온 포인터를 통한 쓰기는 UB입니다. 다른 포인터를 통해 동일한 주소에 쓰는 것이 괜찮은 상황이라도 말이죠.
여기서 기본 패턴은 포인터가 계산되는 방식이 중요하다는 것입니다. 이 계산에서 나오는 주소뿐만 아니라요.
이러한 이유로 포인터에는 출처(provenance)가 있다고 말합니다. 러스트에서 포인터와 관련된 UB를 완전히 특성화하려면 포인터가 가리키는 주소뿐만 아니라 어떤 다른 포인터들에서 "가져와졌는지"를 추적해야 합니다.
대부분의 경우 프로그래머들은 출처에 대해 크게 걱정할 필요가 없으며, 포인터가 어떻게 가져와졌는지는 매우 명확합니다.
하지만 뒤에서 포인터를 정수로 캐스팅할 때 그 결과 포인터의 출처가 지정되지 않는다는게 문제죠.
이 릴리즈로 Rust는 많은 경우에 정수 포인터 캐스팅의 사용을 대체할 수 있는 API 세트를 추가합니다. 이를 통해 그런 캐스팅에 내포된 모호성을 피할 수 있습니다.
특히, align된 포인터의 가장 낮은 비트를 사용하여 추가 정보를 저장하는 패턴은 이제 포인터를 정수로 캐스팅하지 않고도 구현될 수 있습니다.
이렇게 하면 코드를 추론하기 쉽고, 컴파일러를 분석하기 쉽게 만들 수 있을뿐더러. Miri와 같은 도구나, 포인터 오남용을 감지하고 진단하는 CHERI와 같은 아키텍처에도 도움이 됩니다.
자세한 내용은 provenance에 대한 표준 라이브러리 문서를 참조해주세요.
안정화된 API
Ipv6Addr::is_unique_local
Ipv6Addr::is_unicast_link_local
core::ptr::with_exposed_provenance
core::ptr::with_exposed_provenance_mut
NonZero::isqrt
core::ptr::without_provenance
core::ptr::without_provenance_mut
core::ptr::dangling
core::ptr::dangling_mut
Pin::as_deref_mut
다음 API들은 이제 const 컨텍스트에서도 stable입니다.
AtomicBool::from_ptr
AtomicPtr::from_ptr
AtomicU8::from_ptr
AtomicU16::from_ptr
AtomicU32::from_ptr
AtomicU64::from_ptr
AtomicUsize::from_ptr
AtomicI8::from_ptr
AtomicI16::from_ptr
AtomicI32::from_ptr
AtomicI64::from_ptr
AtomicIsize::from_ptr
Pin::new
Pin::new_unchecked
Pin::get_ref
Pin::into_ref
Pin::get_mut
Pin::get_unchecked_mut
Pin::static_ref
Pin::static_mut
기타 변경점
이외의 모든 변경사항은 각각 Rust, Cargo, Clippy에서 확인하세요.
1.84.0의 컨트리뷰터들에게
1.84.0의 완성엔 수많은 사람들이 함께했습니다. 전부 여러분이 없었다면 불가능했을 거에요.