[Rust] 1.88.0 업데이트 발표 (번역)
https://blog.rust-lang.org/2025/06/26/Rust-1.88.0/
러스트는 누구든 믿음직하고 효과적인 소프트웨어를 만들 수 있게 도와주는 끝내주는 언어입니다.
만약 rustup을 통해서 Rust의 이전버전을 설치해놓은 상대라면, 업데이트는 아주 쉽습니다. 그냥 이렇게 치면 돼요.
rustup update stable
rustup을 설치한 적이 없다면, 우리 웹사이트의 설치 페이지에서 받을 수 있습니다. 그리고 깃허브에서 이번 버전에 대한 릴리즈 노트를 참조해보세요.
미래의 릴리즈를 테스트해서 러스트 팀을 돕고 싶다면, 로컬에서 베타 채널(rustup default beta) 또는 nightly 채널(rustup default nightly)로 업데이트하는 것을 고려할 수 있습니다.
버그를 발견했다면 리포트해주세요!
1.88.0 stable에는 무엇이 있나요?
Let chain
이제 if와 while 조건 내에서 let statement를 &&-로 연달아서 사용할 수 있습니다. boolean 표현식과 섞을 수도 있고요.
그래서 if/if let과 while/while let 구문 간의 차이가 더 적어집니다.
let 표현식 내부의 패턴은 반박 불가능하거나(irrefutable) 반박할 수 있으며(refutable), let으로 바인딩된 값은 해당 body 뿐만 아니라 체인의 나중 부분에서도 사용할 수 있습니다.
역주
**irrefutable: let 표현식의 분기 여부가 컴파일타임에 결정되는 경우. **
For example, this snippet combines multiple conditions which would have required nesting "if let" and "if" blocks before:
예를 들어, 이 스니펫은 여러개의 조건을 결합합니다.
예전에는 if let과 if 블럭을 중첩해야 했죠.
if let Channel::Stable(v) = release_info()
** && let Semver { major, minor, .. } = v**
** && major == 1**
** && minor == 88**
{
** println!("let_chains was stabilized in this version");**
}
let chain은 Rust 2024 에디션에서만 사용할 수 있습니다.
이 기능은 더 일관된 drop 순서를 위해 if let의 temporary scope 변경에 의존합니다.
이전에는 모든 에디션에서 동작하게 만드는 것을 시도해봤지만, 일부 어려운 엣지케이스에서 구현의 무결성을 위협했습니다.
이제서야 2024 에디션이 이를 실현 가능하게 해줬으니, 기능을 사용하고 싶으시다면 crate의 에디션을 업그레이드해주세요!
Naked functions
러스트는 이제 컴파일러로 생성되는 에필로그와 프롤로그 없이 naked 함수를 작성할 수 있도록 지원합니다. 이를 통해서 특정 함수에 대해 생성된 어셈블리를 완전히 제어할 수 있습니다.
이건 global_asm! 블록에서 함수를 정의하는 것에 대한 훨씬 인체공학적인 대안입니다.
naked 함수는 #[unsafe(naked)] 어트리뷰트로 표시되며, 그 body는 단일 naked_asm! 호출로 구성됩니다.
예제는 다음과 같습니다.
#[unsafe(naked)]
pub unsafe extern "sysv64" fn wrapping_add(a: u64, b: u64) -> u64 {
** // a.wrapping_add(b)와 동등함**
** core::arch::naked_asm!(**
** "lea rax, [rdi + rsi]",**
** "ret"**
** );**
}
손수 작성한 어셈블리 블록은 전체 함수 body을 정의합니다.
그리고 이 경우 컴파일러는 non-naked 함수와 다르게, 인자나 반환값에 대한 특별한 처리를 추가하지 않습니다.
아무튼 naked function은 low-level setting에 주로 쓰입니다. Rust의 컴파일러 builtin이나, 운영체제, 임베디드 앱 같은 경우가 대표적이죠.
곧 이에 대한 더 자세한 포스트를 찾아보실 수 있을 거에요!
Boolean configuration
cfg predicate 언어는 이제 true/false bool 리터럴을 지원합니다.
이건 cfg/cfg_attr 어트리뷰트와 built-in cfg! 매크로를 사용한 Rust의 conditional 컴파일에서 작동합니다. 그리고 configuration와 manifests이 Cargo [target] 테이블에 모두 유효합니다.
이전에는 빈 predicate 목록이 무조건적인 구성에 사용될 수 있었습니다.
enable인 경우에는 cfg(all)이고 disable인 경우에는 cfg(any())인데, 의미가 암시적이고 거꾸로 전달되기 쉬웠습니다. 모호했죠.
따라서 cfg(true)와 cfg(false)는 원하는 것을 더 직접적으로 표현할 수 있는 방법을 제공합니다.
더 많은 배경정보가 필요하다면 RFC 3695를 참조하세요.
Cargo의 자동 cache cleaning
1.88.0부터 cargo는 home 디렉토리의 캐시에 대해 자동으로 가비지 컬렉션을 실행합니다!
빌드를 할때, cargo은 종속성으로 필요한 crate를 다운로드하고 캐시합니다.
하지만 다운로드된 파일들은 절대 정리되지 않았고, cargo의 home 디렉토리에서 무제한의 누적이 발생했습니다.
이 버전부터 cargo는 가비지 컬렉션 매커니즘을 도입해서 오래된 파일(예: .crate 파일들)을 자동으로 정리합니다.
cargo는 3개월 내에 액세스하지 않은 파일을 네트워크 다운로드에서 제거하고, 1개월 안에 액세스하지 않은 파일을 로컬 시스템에서 제거합니다.
오프라인에서 실행되는 경우(--offline이나 --frozen 사용시) 이 자동 가비지 컬렉션은 실행되지 않습니다.
cargo 1.78 이후의 버전은 이 가비지컬렉션에 필요한 접근 정보를 추적하고 있었습니다.
이전 버전을 여전히 사용하는 사람들의 캐시 혼란을 줄이기 위해 실제 정리 구현이 시작되기 훨씬 전에 도입했었죠.
만약 현재 버전의 cargo를 실행하는 것 외에도 1.78 이전버전 cargo를 정기적으로 사용하고, cargo의 오래된 버전에서만 접근할 수 있는 일부 crate를 사용한다면, 그리고 3개월마다 그 crate를 다시 다운로드하고 싶지 않다면, 문서에 설명된 대로 cargo 구성에서 cache.auto-clean-frequency = "never"를 설정할 수 있습니다.
자세한 내용은 이 기능의 unstable 발표 당시를 참조해주세요.
이 설계의 일부는 여전히 unstable합니다.
예를 들어, cargo#13060에서 추적된 gc subcommand처럼요.
그러니 아직 더 기대해주세요!
Stable이 된 API
Cell::update
impl Default for *const T
impl Default for *mut T
mod ffi::c_str
HashMap::extract_if
HashSet::extract_if
hint::select_unpredictable
proc_macro::Span::line
proc_macro::Span::column
proc_macro::Span::start
proc_macro::Span::end
proc_macro::Span::file
proc_macro::Span::local_file
<[T]>::as_chunks
<[T]>::as_rchunks
<[T]>::as_chunks_unchecked
<[T]>::as_chunks_mut
<[T]>::as_rchunks_mut
<[T]>::as_chunks_unchecked_mut
다음의 이전 stable API들은 이제 const context에서도 사용 가능합니다.
NonNull
<*mut T>::replace
std::ptr::swap_nonoverlapping
Cell::replace
Cell::get
Cell::get_mut
Cell::from_mut
Cell::as_slice_of_cells
기타 변경점
i686-pc-windows-gnu 타겟은 예전에 예고했던대로 Tier 2로 강등합니다.
컴파일러와 표준 라이브러리 도구 모두 rustup으로 이 타겟을 배포하기 때문에, 사용자에게 즉각적인 효과는 전혀 없습니다.
그러나 Tier 1보다 테스트가 적으므로 향후 버그가 나타날 가능성이 더 높습니다.
이외의 모든 변경사항은 각 Rust, Cargo, Clippy 페이지를 확인하세요
1.88.0의 컨트리뷰터들에게
1.88.0의 완성엔 수많은 사람들이 함께했습니다. 전부 여러분이 없었다면 불가능했을 거에요.