[Rust] 1.71.0 업데이트 발표 (번역)
https://blog.rust-lang.org/2023/07/13/Rust-1.71.0.html
러스트는 누구든 믿음직하고 효과적인 소프트웨어를 만들 수 있게 도와주는 끝내주는 언어입니다.
만약 rustup을 통해서 Rust의 이전버전을 설치해놓은 상대라면, 업데이트는 아주 쉽습니다. 그냥 이렇게 치면 돼요.
rustup update stable
rustup을 설치한 적이 없다면, 우리 웹사이트의 설치 페이지에서 받을 수 있습니다. 그리고 깃허브에서 이번 버전에 대한 릴리즈 노트를 참조해보세요.
미래의 릴리즈를 테스트해서 러스트 팀을 돕고 싶다면, 로컬에서 베타 채널(rustup default beta) 또는 nightly 채널(rustup default nightly)로 업데이트하는 것을 고려할 수 있습니다.
버그를 발견했다면 리포트해주세요!
1.71에는 무엇이 있나요?
C-unwind ABI
1.71.0는 C-unwind를 안정화합니다. 다른 -unwind가 붙은 ABI 변형까지 포함해서요.
일반적인 경우, 강제되지 않는(unforced) unwind에 대한 동작은 이 기능을 제안한 RFC의 이 표에 명시되어 있습니다.
해당 내용을 요약한다면-
각 ABI는 -unwind가 없는 동일한 ABI와 대부분 동일합니다. -unwind 사용시에는 unwinding operation(패닉이나 C++ 스타일 예외)이 ABI 경계를 넘을 때, 동작이 안전한 것으로 정의된다는 점을 제외하고요.
panic=unwind의 경우, 이는 한 언어의 예외가 프로세스를 종료하지 않고 다른 언어의 스택을 unwind하도록 허용하는 유효한 방법입니다. 예외가 발생한 언어와 동일한 언어에서 포착된(caught) 경우엔 말이죠.
반면 panic=abort의 경우 일반적으로 프로세스가 즉시 중단됩니다.(abort)
이번 초기 안정화는 기존 ABI(예: 'C')에 대해서는 변경 사항이 없고, unwind를 하더라도 undefined behavior가 유지됩니다.
미래의 Rust 릴리즈는 이 기능을 안정화하는 마지막 parts에서 RFC에서 지정된 동작과 일치하도록 ABI를 수정할 겁니다. 보통은 경계에서 abort되도록 말이죠.
사용자들은 ABI 경계를 넘어 unwind해야 하는 경우 future proof를 유지하기 위해서라도 코드에서 새로운 unwind ABI variants를 쓰기 시작하는 것이 좋습니다.
디버거 visualization attributes
1.71.0은 새 attribute인 #[debug_visualizer(natvis_file = "...")]와 #[debug_visualizer(gdb_script_file = "...")]를 통해 Natviz description이나 GDB 스크립트를 Rust 라이브러리에 삽입해서 해당 라이브러리에서 생성된 데이터 구조를 검사할 때의 디버거 출력을 개선합니다.
Rust 자체는 한동안 표준 라이브러리용으로 유사한 스크립트를 패키징했지만, 이 기능을 통해 라이브러리 작성자는 end user에게 유사한 경험을 제공할 수 있습니다.
사용법에 대한 자세한 내용은 다음 링크를 참고하세요.
raw-dylib linking
Windows 플랫폼에서 Rust는 이제 #[link]에 대한 새로운 kind="raw-dylib” 옵션을 통해서 빌드 시 라이브러리를 사용할 필요도 없이 동적 라이브러리에서 함수를 가져와서 사용하는 방식을 제공합니다.
이렇게 하면 사용자가 해당 라이브러리를 설치할 필요가 없고(특히 교차 컴파일이 어려웠음) 링크할 크레이트에 라이브러리의 스텁 버전을 배송하지 않아도 됩니다.
이는 Windows 라이브러리에 대한 바인딩을 제공하는 crate를 단순화합니다.
Rust는 또한 새로운 #[link_ordinal] 속성을 사용하여 named symbol이 아닌 ordinal로 DLL에서 제공하는 symbols에 대한 바인딩을 지원합니다.
musl 1.2로 업그레이드
이전에 발표한 대로 Rust 1.71은 musl 버전을 1.2.3으로 업데이트합니다.
대부분의 사용자는 이 변경 사항의 영향을 받지 않습니다.
Const로 초기화되는 thread locals
Rust 1.59.0의 const 표준 라이브러리에서는 스레드 로컬 지원을 시작해서, 보다 최적의 코드 생성이 가능해졌습니다.
그러나 지금까지 이 기능은 릴리즈 노트나 문서에서 누락되었습니다.
이 안정화는 const { ... }를 다른 컨텍스트에서 유효한 표현식이나 구문으로 만들지는 않습니다. 그건 별도의 unstable 기능입니다.
**use std::cell::Cell; **
**thread_local! { **
** pub static FOO: Cell
}
안정화된 API
CStr::is_empty
BuildHasher::hash_one
NonZeroI*::is_positive
NonZeroI*::is_negative
NonZeroI*::checked_neg
NonZeroI*::overflowing_neg
NonZeroI*::saturating_neg
NonZeroI*::wrapping_neg
Neg for NonZeroI*
Neg for &NonZeroI*
From<[T; N]> for (T...) (array to N-tuple for N in 1..=12)
From<(T...)> for [T; N] (N-tuple to array for N in 1..=12)
windows::io::AsHandle for Box
windows::io::AsHandle for Rc
windows::io::AsHandle for Arc
windows::io::AsSocket for Box
windows::io::AsSocket for Rc
windows::io::AsSocket for Arc
아래 API들은 이제 const context에서도 stable입니다.
<*const T>::read
<*const T>::read_unaligned
<*mut T>::read
<*mut T>::read_unaligned
ptr::read
ptr::read_unaligned
<[T]>::split_at
기타 변경사항
전체 변경사항은 Rust, Cargo, Clippy에서 확인해주세요.
1.71.0의 컨트리뷰터들
1.71.0의 완성엔 수많은 사람들이 함께했습니다. 전부 여러분이 없었다면 불가능했을 거에요.