Rust 1.66 ํ”„๋กœ๊ทธ๋ž˜๋ฐ ์–ธ์–ด ๋ฆด๋ฆฌ์Šค

Mozilla ํ”„๋กœ์ ํŠธ์— ์˜ํ•ด ์„ค๋ฆฝ๋˜์—ˆ์ง€๋งŒ ํ˜„์žฌ๋Š” ๋…๋ฆฝ์ ์ธ ๋น„์˜๋ฆฌ ์กฐ์ง์ธ Rust Foundation์˜ ํ›„์›์œผ๋กœ ๊ฐœ๋ฐœ๋œ Rust 1.66 ๋ฒ”์šฉ ํ”„๋กœ๊ทธ๋ž˜๋ฐ ์–ธ์–ด์˜ ์ถœ์‹œ๊ฐ€ ๋ฐœํ‘œ๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ์ด ์–ธ์–ด๋Š” ๋ฉ”๋ชจ๋ฆฌ ์•ˆ์ „์— ์ค‘์ ์„ ๋‘๊ณ  ๊ฐ€๋น„์ง€ ์ˆ˜์ง‘๊ธฐ ๋ฐ ๋Ÿฐํƒ€์ž„(๋Ÿฐํƒ€์ž„์€ ํ‘œ์ค€ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์˜ ๊ธฐ๋ณธ ์ดˆ๊ธฐํ™” ๋ฐ ์œ ์ง€ ๊ด€๋ฆฌ๋กœ ์ถ•์†Œ๋จ)์˜ ์‚ฌ์šฉ์„ ํ”ผํ•˜๋ฉด์„œ ๋†’์€ ์ž‘์—… ๋ณ‘๋ ฌ์„ฑ์„ ๋‹ฌ์„ฑํ•  ์ˆ˜ ์žˆ๋Š” ์ˆ˜๋‹จ์„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค.

Rust์˜ ๋ฉ”๋ชจ๋ฆฌ ์ฒ˜๋ฆฌ ๋ฐฉ๋ฒ•์€ ํฌ์ธํ„ฐ๋ฅผ ์กฐ์ž‘ํ•  ๋•Œ ๊ฐœ๋ฐœ์ž๋ฅผ ์˜ค๋ฅ˜๋กœ๋ถ€ํ„ฐ ๋ณดํ˜ธํ•˜๊ณ  ๋ฉ”๋ชจ๋ฆฌ ์˜์—ญ์ด ํ•ด์ œ๋œ ํ›„ ์•ก์„ธ์Šค, null ํฌ์ธํ„ฐ ์—ญ์ฐธ์กฐ, ๋ฒ„ํผ ์˜ค๋ฒ„๋Ÿฐ ๋“ฑ๊ณผ ๊ฐ™์€ ์ €์ˆ˜์ค€ ๋ฉ”๋ชจ๋ฆฌ ์ฒ˜๋ฆฌ๋กœ ์ธํ•ด ๋ฐœ์ƒํ•˜๋Š” ๋ฌธ์ œ๋กœ๋ถ€ํ„ฐ ๋ณดํ˜ธํ•ฉ๋‹ˆ๋‹ค. ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ๋ฐฐํฌ, ๋นŒ๋“œ ์ œ๊ณต ๋ฐ ์ข…์†์„ฑ ๊ด€๋ฆฌ๋ฅผ ์œ„ํ•ด ํ”„๋กœ์ ํŠธ๋Š” Cargo ํŒจํ‚ค์ง€ ๊ด€๋ฆฌ์ž๋ฅผ ๊ฐœ๋ฐœํ•ฉ๋‹ˆ๋‹ค. crates.io ์ €์žฅ์†Œ๋Š” ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ํ˜ธ์ŠคํŒ…์„ ์œ„ํ•ด ์ง€์›๋ฉ๋‹ˆ๋‹ค.

๋ฉ”๋ชจ๋ฆฌ ์•ˆ์ „์€ ์ปดํŒŒ์ผ ์‹œ๊ฐ„์— ์ฐธ์กฐ ํ™•์ธ, ๊ฐœ์ฒด ์†Œ์œ ๊ถŒ ์ถ”์ , ๊ฐœ์ฒด ์ˆ˜๋ช…(๋ฒ”์œ„) ์ถ”์  ๋ฐ ์ฝ”๋“œ ์‹คํ–‰ ์ค‘ ๋ฉ”๋ชจ๋ฆฌ ์•ก์„ธ์Šค์˜ ์ •ํ™•์„ฑ ํ‰๊ฐ€๋ฅผ ํ†ตํ•ด Rust์—์„œ ์ œ๊ณต๋ฉ๋‹ˆ๋‹ค. Rust๋Š” ๋˜ํ•œ ์ •์ˆ˜ ์˜ค๋ฒ„ํ”Œ๋กœ์— ๋Œ€ํ•œ ๋ณดํ˜ธ ๊ธฐ๋Šฅ์„ ์ œ๊ณตํ•˜๊ณ , ์‚ฌ์šฉํ•˜๊ธฐ ์ „์— ๋ณ€์ˆ˜ ๊ฐ’์˜ ํ•„์ˆ˜ ์ดˆ๊ธฐํ™”๊ฐ€ ํ•„์š”ํ•˜๋ฉฐ, ํ‘œ์ค€ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์—์„œ ์˜ค๋ฅ˜๋ฅผ ๋” ์ž˜ ์ฒ˜๋ฆฌํ•˜๊ณ , ๊ธฐ๋ณธ์ ์œผ๋กœ ๋ถˆ๋ณ€ ์ฐธ์กฐ ๋ฐ ๋ณ€์ˆ˜ ๊ฐœ๋…์„ ์ ์šฉํ•˜๊ณ , ๊ฐ•๋ ฅํ•œ ์ •์  ์œ ํ˜• ์ง€์ •์„ ์ œ๊ณตํ•˜์—ฌ ๋…ผ๋ฆฌ์  ์˜ค๋ฅ˜๋ฅผ ์ตœ์†Œํ™”ํ•ฉ๋‹ˆ๋‹ค.

์ฃผ์š” ํ˜์‹ :

  • ์ •์ˆ˜ ํ‘œํ˜„์ด ์žˆ๋Š” ์—ด๊ฑฐํ˜•("#[repr(Int)]" ํŠน์„ฑ)์—์„œ ์—ด๊ฑฐํ˜•์— ํ•„๋“œ๊ฐ€ ํฌํ•จ๋˜์–ด ์žˆ๋”๋ผ๋„ ํŒ๋ณ„์‹(์—ด๊ฑฐํ˜•์˜ ๋ณ€ํ˜• ๋ฒˆํ˜ธ)์„ ๋ช…์‹œ์ ์œผ๋กœ ํ‘œ์‹œํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. #[repr(u8)] enum Foo { A(u8), # ํŒ๋ณ„ 0 B(i8), # ํŒ๋ณ„ 1 C(bool) = 42, # ํŒ๋ณ„ 42 }
  • ๋‹จ์ˆœํžˆ ๋ฐ›์€ ๊ฐ’์„ ๋ฐ˜ํ™˜ํ•˜๋Š” core::hint::black_box ํ•จ์ˆ˜๋ฅผ ์ถ”๊ฐ€ํ–ˆ์Šต๋‹ˆ๋‹ค. ์ปดํŒŒ์ผ๋Ÿฌ๋Š” ์ด ํ•จ์ˆ˜๊ฐ€ ๋ฌด์–ธ๊ฐ€๋ฅผ ํ•˜๊ณ  ์žˆ๋‹ค๊ณ  ์ƒ๊ฐํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์ฝ”๋“œ ์„ฑ๋Šฅ ํ…Œ์ŠคํŠธ๋ฅผ ์ˆ˜ํ–‰ํ•˜๊ฑฐ๋‚˜ ์ƒ์„ฑ๋œ ๊ธฐ๊ณ„ ์ฝ”๋“œ๋ฅผ ๊ฒ€์‚ฌํ•  ๋•Œ black_box ํ•จ์ˆ˜๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋ฃจํ”„์— ๋Œ€ํ•œ ์ปดํŒŒ์ผ๋Ÿฌ ์ตœ์ ํ™”๋ฅผ ๋น„ํ™œ์„ฑํ™”ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด ์•„๋ž˜ ์˜ˆ์ œ์—์„œ black_box(v.as_ptr())๋Š” ์ปดํŒŒ์ผ๋Ÿฌ๊ฐ€ ๋ฒกํ„ฐ v๊ฐ€ ์‚ฌ์šฉ๋˜์ง€ ์•Š๋Š”๋‹ค๊ณ  ์ƒ๊ฐํ•˜์ง€ ์•Š๋„๋ก ํ•ฉ๋‹ˆ๋‹ค. std::hint::black_box ์‚ฌ์šฉ; fn push_cap(v: &mut Vec) { for i in 0..4 { v.push(i); black_box(v.as_ptr()); } }
  • "cargo" ํŒจํ‚ค์ง€ ๊ด€๋ฆฌ์ž๋Š” ๋ช…๋ น์ค„์—์„œ Cargo.toml ๋งค๋‹ˆํŽ˜์ŠคํŠธ์˜ ์ข…์†์„ฑ์„ ์ œ๊ฑฐํ•  ์ˆ˜ ์žˆ๋Š” "remove" ๋ช…๋ น์„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค.
  • API์˜ ์ƒˆ๋กœ์šด ๋ถ€๋ถ„์ด ์•ˆ์ •ํ™”๋œ ํŠน์„ฑ์˜ ๋ฉ”์„œ๋“œ ๋ฐ ๊ตฌํ˜„์„ ํฌํ•จํ•˜์—ฌ ์•ˆ์ •์ ์ธ ๋ฒ”์ฃผ๋กœ ์ด๋™๋˜์—ˆ์Šต๋‹ˆ๋‹ค.
    • proc_macro::์ŠคํŒฌ::source_text
    • u*::{checked_add_signed, Overflowing_add_signed, saturating_add_signed, Wrapping_add_signed}
    • i*::{checked_add_unsigned, Overflowing_add_unsigned, saturating_add_unsigned, Wrapping_add_unsigned}
    • i*::{checked_sub_unsigned, Overflowing_sub_unsigned, saturating_sub_unsigned, Wrapping_sub_unsigned}
    • BTreeSet::{์ฒ˜์Œ, ๋งˆ์ง€๋ง‰, pop_first, pop_last}
    • BTreeMap::{first_key_value, last_key_value, first_entry, last_entry, pop_first, pop_last}
    • WASI๋ฅผ ์‚ฌ์šฉํ•  ๋•Œ stdio ์ž ๊ธˆ ์œ ํ˜•์— ๋Œ€ํ•œ AsFd ๊ตฌํ˜„์„ ์ถ”๊ฐ€ํ•ฉ๋‹ˆ๋‹ค.
    • Impl TryFrom > ์ƒ์ž<[T; ์—”]>
    • ์ฝ”์–ด::ํžŒํŠธ::๋ธ”๋ž™๋ฐ•์Šค
    • ๊ธฐ๊ฐ„::try_from_secs_{f32,f64}
    • ์˜ต์…˜::์••์ถ• ํ•ด์ œ
    • ํ‘œ์ค€::os::fd
  • "..X" ๋ฐ "..=X" ๋ฒ”์œ„๋Š” ํ…œํ”Œ๋ฆฟ์—์„œ ํ—ˆ์šฉ๋ฉ๋‹ˆ๋‹ค.
  • Rustc ์ปดํŒŒ์ผ๋Ÿฌ์˜ ํ”„๋ŸฐํŠธ ์—”๋“œ์™€ LLVM ๋ฐฑ์—”๋“œ๋ฅผ ๋นŒ๋“œํ•  ๋•Œ LTO(Link Time Optimization) ๋ฐ BOLT(Binary Optimization and Layout Tool) ์ตœ์ ํ™” ๋ชจ๋“œ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๊ฒฐ๊ณผ ์ฝ”๋“œ์˜ ์„ฑ๋Šฅ์„ ๋†’์ด๊ณ  ๋ฉ”๋ชจ๋ฆฌ ์†Œ๋น„๋ฅผ ์ค„์ž…๋‹ˆ๋‹ค.
  • armv5te-none-eabi ๋ฐ thumbv5te-none-eabi ํ”Œ๋žซํผ์— ๋Œ€ํ•œ ๋ ˆ๋ฒจ XNUMX ์ง€์›์„ ๊ตฌํ˜„ํ–ˆ์Šต๋‹ˆ๋‹ค. ์„ธ ๋ฒˆ์งธ ์ˆ˜์ค€์€ ๊ธฐ๋ณธ ์ง€์›์„ ์˜๋ฏธํ•˜์ง€๋งŒ ์ž๋™ํ™”๋œ ํ…Œ์ŠคํŠธ ์—†์ด ๊ณต์‹ ๋นŒ๋“œ๋ฅผ ๊ฒŒ์‹œํ•˜๊ณ  ์ฝ”๋“œ ๋นŒ๋“œ ๊ธฐ๋Šฅ์„ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค.
  • macOS ์ผ๋ฐ˜ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์— ์—ฐ๊ฒฐํ•˜๊ธฐ ์œ„ํ•œ ์ง€์›์ด ์ถ”๊ฐ€๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

๋˜ํ•œ Rust ์–ธ์–ด์˜ ํ”„๋ŸฐํŠธ ์—”๋“œ ์ปดํŒŒ์ผ๋Ÿฌ(gccrs)๊ฐ€ GCC ์ฝ”๋“œ๋ฒ ์ด์Šค์— ํฌํ•จ๋œ ๊ฒƒ์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ํ”„๋ŸฐํŠธ์—”๋“œ๋Š” 13๋…„ 2023์›”์— ์ถœ์‹œ๋  GCC 13 ๋ถ„๊ธฐ์— ํฌํ•จ๋ฉ๋‹ˆ๋‹ค. GCC 13๋ถ€ํ„ฐ ํ‘œ์ค€ GCC ํˆดํ‚ท์„ ์‚ฌ์šฉํ•˜์—ฌ LLVM ๊ฐœ๋ฐœ์„ ์‚ฌ์šฉํ•˜์—ฌ ๋นŒ๋“œ๋œ rustc ์ปดํŒŒ์ผ๋Ÿฌ๋ฅผ ์„ค์น˜ํ•  ํ•„์š” ์—†์ด Rust ํ”„๋กœ๊ทธ๋žจ์„ ์ปดํŒŒ์ผํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. GCC XNUMX์˜ Rust ๊ตฌํ˜„์€ ๋ฒ ํƒ€ ์ƒํƒœ์ด๋ฉฐ ๊ธฐ๋ณธ์ ์œผ๋กœ ํ™œ์„ฑํ™”๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

์ถœ์ฒ˜ : opennet.ru

์ฝ”๋ฉ˜ํŠธ๋ฅผ ์ถ”๊ฐ€