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

https://blog.rust-lang.org/2023/03/09/Rust-1.68.0.html

러스트는 누구든 믿음직하고 효과적인 소프트웨어를 만들 수 있게 도와주는 끝내주는 언어입니다.

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

rustup update stable

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

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

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




1.68.0 stable에는 무엇이 있나요?



Cargo의 sparse 프로토콜

이번에 stable이 된 cargo의 "sparse" 레지스트리 프로토콜은 기본 crates.io 레지스트리에 게시된 crate들을 인덱스로 검색할 수 있게 해줍니다. https://index.crates.io/의 인프라와 함께요.

이전의 git 프로토콜(여전히 기본값)은 레지스트리에서 사용 가능한 모든 crate를 인덱싱하는 repository를 복제하지만, 해당 repository를 업데이트하는 동안마다 눈에 띄는 지연과 함께 확장 제한(scaling limitations)에 도달하기 시작했습니다.

이 새 프로토콜은 crates.io에 액세스할 때 실제로 사용하는 crate의 하위 집합에 대한 정보만 다운로드하므로, 상당한 성능 향상을 제공할 겁니다.

crates.io에서 sparse 프로토콜을 사용하려면 환경 변수 CARGO_REGISTRIES_CRATES_IO_PROTOCOL=sparse를 설정하거나, .cargo/config.toml 파일을 편집하여 다음을 추가하시면 됩니다.

**[registries.crates-io] **
protocol = "sparse"

sparse 프로토콜은 현재 몇 달 안에 1.70.0 릴리스에서 crates.io의 기본값이 될 예정입니다.

자세한 내용은 Inside Rust 블로그의 이전 발표, RFC 2789 및 Cargo Book의 최신 문서를 참조하세요.




Local Pin construction

새로운 pin! 매크로는 로컬 상태에서 익명으로 캡처된 T 표현식에 대해 Pin<&mut T>를 구성합니다.

이를 stack-pinning이라고도 하는데요. 이 '스택'은 async fn이나 async block에게 캡처된 상태일 수도 있습니다.

이 매크로는 tokio::pin!과 같은 일부 서드파티 기능과 유사하지만, 표준 라이브러리는 Pin internals이나 temporary lifetime extension을 활용해서 보다 expression-like한 매크로를 만들 수 있습니다.

**/// Runs a future to completion. ******
**fn block_on<F: Future>(future: F) -> F::Output { **
** let waker_that_unparks_thread = todo!(); **
** let mut cx = Context::from_waker(&waker_that_unparks_thread); **


** **** // Pin the future so it can be polled. ******
** let mut pinned_future = pin!(future); **


** loop { **
** match pinned_future.as_mut().poll(&mut cx) { **
** Poll::Pending => thread::park(), **
** Poll::Ready(result) => return result, **
** } **
** } **
**} **

이 예제에서 원래의 future는 Pin<&mut F> 타입의 새로운 pinned_future에 의해 참조되는 임시 로컬로 이동되며, 해당 pin은 로컬보다 오래 지속되지(outlive) 않도록 일반 borrow checker가 적용됩니다.




Default alloc error handler

Rust에서 할당이 실패하면, Box::new 및 Vec::push와 같은 API들은 실패를 표시할 방법이 없으므로 일부 다른 실행 경로를 사용해야 합니다.

std crate를 사용할 때 프로그램은 stderr로 문제를 출력하고 중단합니다(abort).

Rust 1.68.0부터 std를 포함하는 바이너리는 이 동작을 계속해서 유지할 겁니다.

std를 포함하지 않고 alloc만 포함하는 바이너리는 이제 할당 실패에 대해 panic!을 날립니다.
원하는 경우에는 #[panic_handler]를 통해 추가로 조정을 할 수 있습니다.

앞으로 std의 동작도 할당 전용(alloc-only) 바이너리의 동작과 일치하도록 변경될 가능성이 있습니다.




Stable이 된 API

{core,std}::pin::pin!
impl From for {f32,f64}
std::path::MAIN_SEPARATOR_STR
impl DerefMut for PathBuf

아래 API는 이제 const context에서도 사용 가능합니다.

VecDeque::new




기타 변경사항

이전에 발표했던대로, Rust의 Android 플랫폼 지원은 이제 최소 지원 API 레벨 19(KitKat)에 해당하는 NDK r25를 대상으로 합니다.

이외에도 Rust, Cargo, Clippy에서 변경된 모든 것을 확인하세요.




1.68.0의 컨트리뷰터들

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

고마워요!