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

https://blog.rust-lang.org/2023/06/01/Rust-1.70.0.html

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

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

rustup update stable

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

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

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




1.70.0 stable에는 무엇이 있나요?


crates.io에서 Sparse를 디폴트로!

Cargo의 "sparse" 프로토콜은 이제 crates.io에서 기본적으로 활성화됩니다.

이 기능은 이전에 Rust 1.68.0에서 안정화되었지만 crates.io에서 사용하려면 추가 설정이 필요했습니다. 하지만 이제 1.70.0에서는 기본값이 됩니다!
그래서 이제는 crates.io 인덱스에서 정보를 가져올 때 상당히 향상된 성능을 느낄 수 있을 겁니다.

제한된 내부망의 사용자는 'https://index.crates.io'에 대한 액세스가 가능한지 확인해야 합니다.

특별한 이유로 GitHub의 git index를 사용하는 이전의 세팅을 유지해야 한다면, registries.crates-io.protocol 설정을 사용해서 기본값을 변경할 수 있습니다.

이 변경에 따른 한 가지 side effect는 crate 캐시의 경로가 변경되므로, dependency가 새로 다운로드된다는 것입니다.

sparse 프로토콜을 사용하는 것을 완전히 결정한 후에는 이전 "$CARGO_HOME/registry//github.com-" 경로를 지우고 싶을 수도 있습니다.




OnceCell과 OnceLock

shared 데이터의 일회성 초기화를 위한 용도로 thread-unsafe한 OnceCell과 thread-safe한 OnceLock 타입이 stable이 되었습니다.
이것들은 즉각적인 생성을 원하지 않는 모든 곳에서 사용할 수 있습니다. 심지어 전역 변수의 non-const 데이터를 설정할 때도요!

**use std::sync::OnceLock; **
**static WINNER: OnceLock<&str> = OnceLock::new(); **

**fn main() { **
** let winner = std:🧵:scope(|s| { **
** s.spawn(|| WINNER.set("thread")); **
** std:🧵:yield_now(); **
** **** // give them a chance... ******
** WINNER.get_or_init(|| "main") **
** }); **
** println!("{winner} wins!"); **
**} **

과거에는 lazy_static 및 once_cell 과 같은 crate가 이러한 요구를 충족했지만, 이제 이러한 빌딩 블록은 once_cell의 unsync 및 sync 모듈에서 포팅된 표준 라이브러리의 일부입니다.

비슷한 초기화 기능에는 LazyCell 및 LazyLock 타입뿐만 아니라 향후 안정화될 수 있는 더 많은 메서드가 있지만, 안정화의 이 첫 번째 단계는 이미 많은 사용 사례를 다룰 것입니다.




IsTerminal

새로 안정화된 이 trait에는 주어진 file descriptor나 handle이 터미널 또는 TTY를 나타내는지 확인하기 위한 is_terminal이라는 단일 메서드가 있습니다.

이건 외부 crate에 존재하는 기능을 표준화하는 또 다른 사례입니다. 예를 들어 Unix 타겟에서 C 라이브러리의 isatty 함수를 사용하고 다른 곳에서는 유사한 함수를 사용합니다.

일반적인 사용 사례는 프로그램이 스크립트 또는 대화형 모드에서 실행 중인지를 구분하는 것입니다.
예를 들어 대화형 모드에서는 색상이나 심지어 전체 텍스트 사용자 인터페이스(TUI)를 표시할 수 있습니다.

**use std::io::{stdout, IsTerminal}; **


**fn main() { **
** let use_color = stdout().is_terminal(); **
** // if so, add color codes to program output... **
}




디버그 정보의 named level

-Cdebuginfo 컴파일러 옵션은 이전에 디버깅 정보의 양을 늘리기 위해 숫자 0..=2만 지원했습니다.
여기서 Cargo는 개발 및 테스트 프로필에서 2로, 릴리스 및 벤치 프로필에서 0으로 기본 설정됩니다.

이러한 디버그 레벨은 이제 "none"(0), "limited"(1) 및 "full"(2)이라는 이름으로 설정할 수 있으며 두 가지 새로운 수준인 "line-directives-only" 및 "line- tables-only"도 생겼습니다.

Cargo와 rustc 문서는 이전에 레벨 1을 "line tables only"이라고 불렀지만, 타입과 변수가 아닌 모든 함수에 대한 정보가 있는 것 이상이었습니다.
이 레벨은 이제 "limited"라고 하며, 새로운 "line tables only" 레벨은 파일 이름과 라인번호가 있는 backtrace에 필요한 최소 레벨로 더 줄어듭니다.

이것은 결국 -Cdebuginfo=1에 사용되는 수준이 될 수 있습니다.

다른 line-directives-only 레벨은 NVPTX 프로파일링을 위한 것이며, 그렇지 않으면 권장되지 않습니다.

이러한 명명된 옵션은 아직 Cargo.toml을 통해 사용할 수 없습니다. 이에 대한 지원은 다음 릴리스 1.71에서 사용할 수 있습니다.




test CLI에서 stable 강제적용

#[test] 함수가 컴파일되면 실행 파일은 테스트 crate에서 CLI 인터페이스를 가져옵니다.
이 CLI에는 Rust 툴체인의 다른 많은 명령과 같이 아직 안정화되지 않았고, -Zunstable-options 지정이 필요한 옵션을 포함해 다양한 옵션이 있습니다.

이는 nightly 빌드에서만 허용되도록 의도되었지만 그 제한은 지금까지 테스트에서 활성화되지 않았습니다.
1.70.0부터 Rust의 stable과 beta 빌드는 더 이상 unstable한 테스트 옵션을 허용하지 않으므로, 문서화된 대로 진정한 nightly only가 됩니다.

특히 IntelliJ Rust 및 기타 IDE 플러그인에서 사용되는 -format json 과 같은, 직접적인 사용자 지식 없이 unstable한 옵션이 사용된 사례가 있습니다.

해당 프로젝트는 이미 이 변경 사항에 적응하고 있으며, tracking issue에서 JSON 출력 기능의 상태를 추적할 수 있습니다.




Stable이 된 API들

NonZero*::MIN/MAX
BinaryHeap::retain
Default for std::collections::binary_heap::IntoIter
Default for std::collections::btree_map::{IntoIter, Iter, IterMut}
Default for std::collections::btree_map::{IntoKeys, Keys}
Default for std::collections::btree_map::{IntoValues, Values}
Default for std::collections::btree_map::Range
Default for std::collections::btree_set::{IntoIter, Iter}
Default for std::collections::btree_set::Range
Default for std::collections::linked_list::{IntoIter, Iter, IterMut}
Default for std::vec::IntoIter
Default for std::iter::Chain
Default for std::iter::Cloned
Default for std::iter::Copied
Default for std::iter::Enumerate
Default for std::iter::Flatten
Default for std::iter::Fuse
Default for std::iter::Rev
Default for std::slice::Iter
Default for std::slice::IterMut
Rc::into_inner
Arc::into_inner
std::cell::OnceCell
Option::is_some_and
NonNull::slice_from_raw_parts
Result::is_ok_and
Result::is_err_and
std::sync::atomic::Atomic*::as_ptr
std::io::IsTerminal
std::os::linux::net::SocketAddrExt
std::os::unix::net::UnixDatagram::bind_addr
std::os::unix::net::UnixDatagram::connect_addr
std::os::unix::net::UnixDatagram::send_to_addr
std::os::unix::net::UnixListener::bind_addr
std::path::Path::as_mut_os_str
std::sync::OnceLock




기타 변경사항

RustCargoClippy에서 확인해주세요.




1.70.0의 컨트리뷰터들

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

고마워요!​