Rust 1.100 출시: 10년 만에 never 타입 안정화, 커스텀 allocator API도 stable로
- never 타입
!가 10년과 5번의 안정화 실패 끝에 stable에 들어왔고Infallible이!의 별칭이 됨. 대신 2024 이전 에디션에서 never type fallback이()에서!로 바뀌는 breaking change를 포함함 - Allocator API 핵심이 안정화돼
Vec과Box에서 커스텀 allocator를 쓸 수 있게 됐고, Allocators 1.0 프로젝트 목표의 토대가 됨 - Cargo에 min-publish-age(dependency cooldowns, RFC 3923)가 들어와 설정하면 resolver가 그보다 최근에 배포된 버전을 무시함.
cargo install은 .crate tarball의 lockfile을 기본으로 쓰고--locked는 no-op이 됨 - Cargo가 미사용 의존성을 경고로 보고하고,
DropGuard로 return,?, panic 어느 경로에서든 클로저를 실행할 수 있음.bool::toggle(),Box::map(),str::trim_prefix()등도 안정화 API 목록에 포함됨
Hacker News 의견들
이번 릴리스 진짜 크다. 내 최애는 never 타입, 커스텀 allocator, 그리고 dependency cooldowns(RFC 3923)임. min-publish-age 설정하면 resolver가 그보다 최근에 올라온 버전은 무시해줌.
cargo install이 .crate tarball에 들어있는 lockfile을 기본으로 쓰고 --locked가 no-op 되는 것도 오래 기다렸음. 이건 진짜 반가운 변화다.
쿨다운은 올해 말이 많네. 공급망 공격 때문에 다들 넣자고 하더니 이제는 0-day를 놓친다고 걱정하는 분위기고. 그래도 설정할 수 있게 된 건 좋음.
never 타입 이름이 안정화 날짜에서 나왔다는 농담도 이제 끝나겠네.
좋긴 한데 아직 stable ABI가 없어서 아쉽다.
unsafe extern C가 있는데 뭘. 진짜 Rust 네이티브 ABI를 고정하는 건 전방 호환성 악몽일 듯.
제네릭이 문제임. 호출 규약을 안 바꿔도 ABI가 심볼 이름만 맞추면 되는 게 아님. dyn 기반 ABI로 가면 Vec를 그대로 못 내보내고 Vec<Box> 식으로 가야 해서 좀 끔찍해짐.
C++ 보면 ABI 안정성이 얼마나 발목 잡는지 알 수 있음. 한번 굳으면 못 깨니까 언어가 제약됨. Swift식 부분집합이면 몰라도 지금은 공수 대비 이득이 없어 보임.
타이밍 좋네. 며칠 전에 Bumpalo가 drop을 안 불러서 arena leak 고치느라 allocator-api2로 Vec::new_in 썼는데 이제 stable이라 바로 넘어갈 수 있음.
into_ok/into_err는 1.101에 들어감. 1.100 마감을 살짝 놓쳤고, 어려운 never 타입 안정화에 짐 더 얹기 싫어서 2주 FCP 포함된 절차를 따로 돌린 거임.
미사용 의존성 경고 좋다. 1.100 올린 클로드 세션에서 새 경고가 뜨길래 고치라고 했더니 미사용 의존성을 잔뜩 지워줬음.
그럼 machete나 shear는 이제 필요 없어지나?
bool::toggle()은 대체 왜 넣었는지 모르겠음. x = !x면 충분하지 않나. 블로그 Stabilized APIs 항목에는 다 적혀 있긴 한데.
never 타입 설명 읽어도 감이 안 왔는데, 반환이 아예 불가능할 때 쓰는 타입이고 다른 언어에도 있음. 전파돼서 새로 가능해지는 게 생긴다고 보면 됨.