Search
📰

Rust 1.68.0 버전 출시

요약

Rust 1.68.0이 출시되었다는 소식이 전해졌습니다. 이번 릴리스에서는 다음과 같은 주요 변경 사항이 있습니다.
Cargo에서는 "sparse" 레지스트리 프로토콜을 사용하여 crates.io 레지스트리에서 crates의 인덱스를 읽을 수 있습니다. 이를 통해 crates.io에 액세스할 때 성능이 향상됩니다.
새로운 pin! 매크로를 사용하여 Pin<&mut T>를 생성할 수 있습니다. 이를 통해 스택 핀닝을 할 수 있으며, async fn 또는 block에서 캡처된 상태에서도 사용할 수 있습니다.
Rust에서는 기본적으로 std crate를 사용하는 경우 할당 실패 시 프로그램이 stderr에 출력되고 중단되는 것이 기본 동작입니다. 그러나 이제 std crate를 사용하지 않는 경우, 할당 실패 시 panic!이 발생하도록 변경되었습니다.
Android 플랫폼 지원이 NDK r25로 변경되어 최소 지원 API 레벨이 19 (KitKat)로 변경되었습니다.

본문

러스트 팀은 신뢰성 높은 효율적인 소프트웨어를 구축하는 모두를 위한 프로그래밍 언어인 러스트의 새 버전 1.68.0을 발표했습니다.
만약 이전 버전의 러스트가 이미 rustup을 통해 설치되어 있다면, 다음 명령어를 통해 1.68.0 버전을 얻을 수 있습니다.
rustup update stable
만약 rustup을 가지고 있지 않다면, 해당 웹사이트의 적절한 페이지에서 rustup을 얻을 수 있습니다. 1.68.0에 대한 자세한 릴리스 노트는 GitHub에서 확인할 수 있습니다.
향후 릴리스의 테스트를 위해 로컬 업데이트를 고려한다면, beta 채널 (rustup default beta) 또는 nightly 채널 (rustup default nightly)을 사용하도록 로컬을 업데이트할 수 있습니다. 만약 문제가 발생한다면, 버그를 보고해주시기 바랍니다.

1.68.0에서의 변경사항

Cargo의 sparse 프로토콜 Cargo의 "sparse" 레지스트리 프로토콜이 crates의 인덱스를 읽는 데 있어 안정화되었습니다. 이것은 crates.io 레지스트리의 주요 crates에 대한 인프라에 대해서만 적용됩니다. 이전 git 프로토콜(아직 기본값으로 설정되어 있음)은 레지스트리에서 사용 가능한 모든 crates를 인덱싱하는 리포지토리를 복제합니다. 그러나 이 방법은 확장성 제한으로 인해 업데이트 중 지연이 발생하기 시작했습니다. 새로운 프로토콜은 crates.io에 액세스할 때, 실제로 사용하는 subset의 crates 정보만 다운로드하므로 상당한 성능 향상을 제공할 것입니다.
-crates.io에서 sparse 프로토콜을 사용하려면, 환경 변수 CARGO_REGISTRIES_CRATES_IO_PROTOCOL=sparse를 설정하거나 .cargo/config.toml 파일을 편집하여 다음과 같이 추가하면 됩니다.
[registries.crates-io] protocol = "sparse"
YAML
복사
현재 sparse 프로토콜은 1.70.0 릴리스에서 몇 개월 후 crates.io의 기본값이 될 예정입니다. 자세한 정보는 Inside Rust Blog의 이전 공지, RFC 2789 및 Cargo Book의 현재 문서를 참조하시기 바랍니다.
로컬 Pin 생성 새로운 pin! 매크로는 T 표현식으로부터 Pin<&mut T>를 익명으로 추적합니다. 이를 보통 stack-pinning이라고 하지만, "stack"은 async fn이나 block의 캡처된 상태일 수도 있습니다. 이 매크로는 tokio::pin!과 같은 몇 가지 크레이트와 비슷하지만, 표준 라이브러리는 Pin 내부 및 임시 수명 연장을 활용하여 더 표현적인 매크로를 제공할 수 있습니다.
/// 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, } } }
Rust
복사
이 예제에서 원래의 future는 임시 로컬에 이동하고, 이를 참조하는 새로운 pinned_future가 Pin<&mut F> 형식으로 생성됩니다. 이 pin은 해당 로컬보다 오래 살 수 없도록 일반 borrow checker에 따라 제한됩니다.
기본 alloc 오류 핸들러 Rust에서 할당이 실패할 경우, Box::new나 Vec::push와 같은 API는 실패를 나타낼 수 있는 방법이 없기 때문에 어떤 분기점에서 다른 실행 경로를 따라야 합니다. std 크레이트를 사용할 경우, 프로그램은 stderr로 출력하고 중단됩니다. Rust 1.68.0부터는 std가 포함된 이진 파일은 여전히 이러한 동작을 보이지만, std가 포함되지 않은 이진 파일은 할당 실패 시 panic!을 발생시키도록 변경되었습니다. 이는 필요에 따라 #[panic_handler]를 통해 조정할 수 있습니다.
미래에는 std의 동작도 alloc-only 이진 파일과 일치하도록 변경될 가능성이 높습니다.
안정화된 API
다음 API는 const contexts에서 이제 안정화되었습니다.
기타 변경사항
이전에 발표된 대로, Rust의 Android 플랫폼 지원은 이제 NDK r25를 대상으로 하며, 최소 지원 API 레벨은 19 (KitKat)입니다. Rust, Cargo 및 Clippy에서 변경된 모든 내용을 확인해보세요.

참고 링크

최신 뉴스 정보