[Rust] 1.77.0 업데이트 발표 (번역)

https://blog.rust-lang.org/2024/03/21/Rust-1.77.0.html
러스트는 누구든 믿음직하고 효과적인 소프트웨어를 만들 수 있게 도와주는 끝내주는 언어입니다.

만약 rustup을 통해서 Rust의 이전버전을 설치해놓은 상대라면, 업데이트는 아주 쉽습니다. 그냥 이렇게 치면 돼요.

rustup update stable

rustup을 설치한 적이 없다면, 우리 웹사이트의 설치 페이지에서 받을 수 있습니다. 그리고 깃허브에서 이번 버전에 대한 릴리즈 노트를 참조해보세요.

미래의 릴리즈를 테스트해서 러스트 팀을 돕고 싶다면, 로컬에서 베타 채널(rustup default beta) 또는 nightly 채널(rustup default nightly)로 업데이트하는 것을 고려할 수 있습니다.

버그를 발견했다면 리포트해주세요!




1.77.0 stable엔 무엇이 있나요?

이번 릴리스는 비교적 사소하지만 언제나 그랬듯 점진적인 개선이 전체적인 변화로 이어집니다.
이 포스트에서는 이러한 변경 사항 중 일부를 강조하고 있으며, 기타 변경 사항은 더 많은 틈새 요구 사항(niche needs)을 충족할 수 있습니다.




C-string 리터럴

Rust는 이제 C-string 리터럴을 지원합니다.
c"abc" 같은 형태로 표현되고, &'static CStr 타입이면서, nul-byte로 끝나는 문자열로 처리되죠.

그리고 이를 통해 컴파일 타임에 수행되는 모든 관련 오류 검사가 필요하거나(예: 내부 nul 바이트 부족), null로 끝나는 문자열이 필요한 foreign language 인터페이스와 연결되는 코드를 더 쉽게 작성할 수 있습니다.




async fn에서의 재귀 지원

이전에는 async 함수가 컴파일러 제한으로 인해 자신을 호출할 수 없었습니다.
1.77에서는 해당 제한이 해제되었습니다.
무한한 재귀 상태를 피하게만 작성한다면 재귀 호출이 허용됩니다.

이제 다음과 같은 코드가 작동한다는 말입니다.

async fn fib(n: u32) -> u32 {
** match n {**
** 0 | 1 => 1,**
** _ => Box::pin(fib(n-1)).await + Box::pin(fib(n-2)).await**
** }**
}




offset_of!

1.77.0은 구조체 필드에 대한 offset_of를 안정화합니다. 구조체의 관련 public 필드의 바이트 오프셋에 대한 액세스를 제공하죠.
이 매크로는 타입의 기존 값 없이도 필드의 오프셋이 필요할 때 가장 유용합니다.
이러한 매크로를 구현하는 것은 stable에서 이미 가능하지만, 해당 타입의 값이 없으면 실수로 정의되지 않은 동작을 쉽게 도입할 수 있는 까다롭고 unsafe한 코드가 필요합니다.

이제 사용자들은 offset_of!(StructName, field)를 사용하여 public 필드의 오프셋에 액세스할 수 있습니다. 이는 구조체 시작부터 바이트 단위의 오프셋을 사용하여 usize 표현식으로 확장됩니다.




release profiles에서 strip이 기본으로 활성화됨

출력에서 debuginfo를 활성화하지 않는 cargo 프로필(예: debug = 0)은 기본적으로 strip = "debuginfo"를 활성화합니다.

이는 미리 컴파일된 표준 라이브러리가 debuginfo와 함께 제공되기 때문에 주로 필요합니다.
즉, 로컬 컴파일이 명시적으로 debuginfo를 요청하지 않은 경우에도 정적으로 링크된 결과에는 표준 라이브러리의 debuginfo가 포함됩니다.

debuginfo를 원하는 사용자는 관련 Cargo 프로필의 debug 플래그를 사용하여 이를 명시적으로 활성화할 수 있습니다.




Clippy에 incompatible_msrv 린트 추가

이 Rust 프로젝트는 Rust의 최신 stable 릴리스만을 지원합니다.
일부 라이브러리는 이전 최소 지원 Rust 버전(MSRV)을 목표로 하며 일반적으로 이전 릴리스의 CI에서 컴파일하여 이 지원을 확인합니다.

새로운 코드를 개발할 때는 버그 수정, 성능 개선, 기타 개선 사항이 포함된 최신 문서와 최신 툴체인을 사용하는 것이 편리합니다.
하지만 이는 최신 버전의 Rust에서만 사용할 수 있는 API를 실수로 사용하기 쉽게 만듭니다.

때문에 Clippy는 참조되는 기능이 선언된 MSRV보다 최신 버전에서만 사용할 수 있는 것인지를 사용자에게 알리는 새로운 린트인 incompatible_msrv를 추가했습니다.




안정화된 API

array::each_ref
array::each_mut
core::net
f32::round_ties_even
f64::round_ties_even
mem::offset_of!
slice::first_chunk
slice::first_chunk_mut
slice::split_first_chunk
slice::split_first_chunk_mut
slice::last_chunk
slice::last_chunk_mut
slice::split_last_chunk
slice::split_last_chunk_mut
slice::chunk_by
slice::chunk_by_mut
Bound::map
File::create_new
Mutex::clear_poison
RwLock::clear_poison




기타 변경점

이외의 모든 변경사항은 각각 Rust, Cargo, Clippy에서 확인하세요.




1.77.0의 컨트리뷰터들에게

1.77.0의 완성엔 수많은 사람들이 함께했습니다. 전부 여러분이 없었다면 불가능했을 거에요.

고마워요!