[Rust] 1.98.0 업데이트 발표 (번역)
https://blog.rust-lang.org/2026/08/20/Rust-1.98.0/
러스트는 누구든 믿음직하고 효과적인 소프트웨어를 만들 수 있게 도와주는 끝내주는 언어입니다.
만약 rustup을 통해서 Rust의 이전버전을 설치해놓은 상대라면, 업데이트는 아주 쉽습니다. 그냥 이렇게 치면 돼요.
rustup update stable
rustup을 설치한 적이 없다면, 우리 웹사이트의 설치 페이지에서 받을 수 있습니다. 그리고 깃허브에서 이번 버전에 대한 릴리즈 노트를 참조해보세요.
미래의 릴리즈를 테스트해서 러스트 팀을 돕고 싶다면, 로컬에서 베타 채널(rustup default beta) 또는 nightly 채널(rustup default nightly)로 업데이트하는 것을 고려할 수 있습니다.
버그를 발견했다면 리포트해주세요!
1.98.0 stable에는 무엇이 있나요?
대수적 부동소수점 메서드
부동소수점 타입인 f32와 f64에 덧셈, 뺄셈, 곱셈, 나눗셈, 나머지 연산을 위한 "대수적(algebraic)" 메서드가 추가되었습니다.
이 메서드들은 실제 부동소수점 표현에서는 성립하지 않는 경우가 있더라도, 실수의 대수적 성질을 활용해 해당 연산을 최적화할 수 있도록 허용합니다.
정확히 어떤 최적화를 수행할지는 명세에 정해져 있지 않지만, 다른 언어에서 -ffast-math 옵션을 사용할 때 적용되는 최적화와 비슷할 수 있습니다.
예를 들어, 부동소수점 덧셈에는 결합법칙이 성립하지 않습니다.
따라서 "a + b + c + d"의 합은 파싱된 왼쪽 결합 순서대로, 즉 "((a + b) + c) + d"로 계산되어야 합니다.
하지만 동일한 연산을 algebraic_add 호출의 연속으로 작성하면, 컴파일러가 연산 순서를 자유롭게 바꿀 수 있습니다.
예를 들어 "(a + b) + (c + d)"로 재배치해서 두 부분합을 동시에 계산할 수도 있습니다.
또한 이러한 대수적 메서드를 사용하면 더 폭넓은 루프 벡터화(loop vectorization)가 가능해지는 경우가 많습니다.
이 메서드들은 컴파일러가 서로 다른 최적화 방식을 자유롭게 선택할 수 있기 때문에 결과가 비결정적일 (non-deterministic) 수 있습니다.
하지만 정의되지 않은 동작(undefined behavior)을 일으키지는 않습니다.
자세한 내용은 라이브러리 문서와 최초의 API 변경 제안서를 참고하세요.
버퍼를 이용한 정수 포매팅
모든 기본 정수 타입에 이제 format_into 메서드가 추가됩니다.
이 메서드는 &mut NumBuffer
버퍼 자체의 내부 구조는 공개되지 않지만, format_into 메서드는 해당 버퍼를 빌린 수명(lifetime)으로 포매팅된 &str을 반환합니다.
또한 이 메서드는 버퍼를 사용하는 write! 포매팅에서 발생하는 동적 디스패치의 상당 부분을 우회하기 때문에, 성능 면에서 큰 이점을 얻을 수 있습니다.
현재 itoa-benchmark에 따르면 format_into의 성능은 itoa 자체와 비슷한 수준입니다. 따라서 itoa나 그와 비슷한 의존성들을 대체할 수 있는 표준 라이브러리 기반 대안으로 활용할 수 있습니다
ManuallyDrop과 Box 간 상호작용 수정
Rust 1.96.0 이전에는 Rust 컴파일러에 버그가 있어 다음 코드가 정의되지 않은 동작(UB)으로 간주되었습니다.
let mut x = ManuallyDrop::new(Box::new(1));
unsafe { ManuallyDrop::drop(&mut x) };
let x = x;** // UB!**
컴파일러가 이미 드롭되어 메모리가 해제된 Box를 이동(move)하는 것을 UB로 간주하기 때문입니다. 기존의 ManuallyDrop도 이 특성을 그대로 전파했기 때문에, 내부의 Box가 이미 드롭된 ManuallyDrop<Box<_>>를 이동하는 것 역시 UB로 취급되었습니다.
Rust 1.96.0에서 이 문제가 수정되어, 위 코드는 더 이상 UB가 아닙니다.
이번 릴리스에서는 여기에 더해 ManuallyDrop 문서를 업데이트하여, 앞으로도 이 코드가 UB로 간주되지 않는다는 안정적인 보장(guarantee)을 명시했습니다.
자세한 내용은 ManuallyDrop 문서와 관련 RFC 3336을 참고하세요.
Stable이 된 API
str::substr_range
[T]::subslice_range
core::fmt::NumBuffer
<{integer}>::format_into
Send/Sync for std::process::CommandArgs
{fN}::algebraic_add
{fN}::algebraic_sub
{fN}::algebraic_mul
{fN}::algebraic_div
{fN}::algebraic_rem
NonZero<{integer}>::from_str_radix
String::from_utf16le
String::from_utf16le_lossy
String::from_utf16be
String::from_utf16be_lossy
[T]::strip_circumfix
str::strip_circumfix
Atomic
Atomic
Atomic
std::range::legacy
기타 변경점
이외의 모든 변경사항은 각 Rust, Cargo, Clippy 페이지를 확인하세요.
1.98.0의 컨트리뷰터들에게
1.98.0의 완성엔 수많은 사람들이 함께했습니다. 전부 여러분이 없었다면 불가능했을 거에요.