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

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

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

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

  • "panic!" ๋งคํฌ๋กœ ์‚ฌ์šฉ์ด ์•ˆ์ •ํ™”๋˜์—ˆ์Šต๋‹ˆ๋‹ค. "const fn" ์„ ์–ธ๊ณผ ๊ฐ™์ด ์ปดํŒŒ์ผ ์ค‘์— ์ƒ์„ฑ๋œ ์ปจํ…์ŠคํŠธ์—์„œ. ๋˜ํ•œ "ํŒจ๋‹‰!"์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ ์™ธ์—๋„ const ์„ ์–ธ์„ ํ†ตํ•ด "assert!" ๋งคํฌ๋กœ๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋ฐ ๊ธฐํƒ€ ํ‘œ์ค€ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ API. ์•ˆ์ •ํ™”๋Š” ์•„์ง ์ „์ฒด ํฌ๋งท ์ธํ”„๋ผ๋ฅผ ํฌ๊ด„ํ•˜์ง€ ์•Š์œผ๋ฏ€๋กœ ํ˜„์žฌ ํ˜•ํƒœ์—์„œ๋Š” "ํŒจ๋‹‰!" ๋งคํฌ๋กœ๊ฐ€ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค. ์ •์  ๋ฌธ์ž์—ด(panic!(โ€œ...")) ๋˜๋Š” (panic!("{}", a))๋ฅผ ๋Œ€์ฒดํ•  ๋•Œ ๋‹จ์ผ ๋ณด๊ฐ„ ๊ฐ’ "&str"๊ณผ ํ•จ๊ป˜๋งŒ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๋Š” "{๋กœ ๋Œ€์ฒดํ•˜๋Š” ๊ฒƒ์œผ๋กœ ์ œํ•œ๋˜์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. }" ํ˜•์‹ ์ง€์ •์ž ๋ฐ ๊ธฐํƒ€ ์œ ํ˜•์ด ์—†์Šต๋‹ˆ๋‹ค. ์•ž์œผ๋กœ๋Š” ์ƒ์ˆ˜ ์ปจํ…์ŠคํŠธ์—์„œ ๋งคํฌ๋กœ์˜ ์ ์šฉ ๊ฐ€๋Šฅ์„ฑ์ด ํ™•์žฅ๋  ์˜ˆ์ •์ด์ง€๋งŒ ์•ˆ์ •ํ™”๋œ ๊ธฐ๋Šฅ์€ ์ด๋ฏธ ์ปดํŒŒ์ผ ๋‹จ๊ณ„์—์„œ ์–ด์„ค์…˜ ํ™•์ธ์„ ์ˆ˜ํ–‰ํ•˜๊ธฐ์— ์ถฉ๋ถ„ํ•ฉ๋‹ˆ๋‹ค. const _: () = ์ฃผ์žฅ!(std::mem::size_of:: () == 64); const _: () = ์ฃผ์žฅ!(std::mem::size_of:: () == 8);
  • Cargo ํŒจํ‚ค์ง€ ๊ด€๋ฆฌ์ž๋Š” "dev", "release", "test" ๋ฐ "bench"์— ๊ตญํ•œ๋˜์ง€ ์•Š๊ณ  ์ž„์˜์˜ ์ด๋ฆ„์„ ๊ฐ€์ง„ ํ”„๋กœํ•„์˜ ์‚ฌ์šฉ์„ ํ—ˆ์šฉํ•ฉ๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด, ์ตœ์ข… ์ œํ’ˆ ์–ด์…ˆ๋ธ”๋ฆฌ๊ฐ€ ์ƒ์„ฑ๋  ๋•Œ๋งŒ ์—ฐ๊ฒฐ ๋‹จ๊ณ„(LTO)์—์„œ ์ตœ์ ํ™”๋ฅผ ํ™œ์„ฑํ™”ํ•˜๋ ค๋ฉด Cargo.toml์—์„œ "์ƒ์‚ฐ" ํ”„๋กœํ•„์„ ์ƒ์„ฑํ•˜๊ณ  "lto = true" ํ”Œ๋ž˜๊ทธ๋ฅผ ์ถ”๊ฐ€ํ•˜๋ฉด ๋ฉ๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ์ž์‹ ์˜ ํ”„๋กœํ•„์„ ์ •์˜ํ•  ๋•Œ ๊ธฐ์กด ํ”„๋กœํ•„์„ ์ง€์ •ํ•˜์—ฌ ๊ธฐ๋ณธ ์„ค์ •์„ ์ƒ์†๋ฐ›์•„์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์•„๋ž˜ ์˜ˆ์—์„œ๋Š” "lto = true" ํ”Œ๋ž˜๊ทธ๋ฅผ ํฌํ•จํ•˜์—ฌ "๋ฆด๋ฆฌ์Šค" ํ”„๋กœํ•„์„ ๋ณด์™„ํ•˜๋Š” "ํ”„๋กœ๋•์…˜" ํ”„๋กœํ•„์„ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค. ํ”„๋กœํ•„ ์ž์ฒด๋Š” "--profile Production" ์˜ต์…˜์„ ์‚ฌ์šฉํ•˜์—ฌ Cargo๋ฅผ ํ˜ธ์ถœํ•˜์—ฌ ํ™œ์„ฑํ™”๋˜๋ฉฐ ์–ด์…ˆ๋ธ”๋ฆฌ ์•„ํ‹ฐํŒฉํŠธ๋Š” "target/production" ๋””๋ ‰ํ„ฐ๋ฆฌ์— ๋ฐฐ์น˜๋ฉ๋‹ˆ๋‹ค. [profile.production] ์ƒ์† = "๋ฆด๋ฆฌ์Šค" lto = true
  • Vec, String, HashMap, HashSet ๋ฐ VecDeque ์œ ํ˜•์— ๋Œ€ํ•œ try_reserve ์‚ฌ์šฉ์ด ์•ˆ์ •ํ™”๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ์ด๋ฅผ ํ†ตํ•ด ๋ฉ”๋ชจ๋ฆฌ ํ• ๋‹น ์ž‘์—…์˜ ๋นˆ๋„๋ฅผ ์ค„์ด๊ณ  ํ”ผํ•˜๊ธฐ ์œ„ํ•ด ํŠน์ • ์œ ํ˜•์˜ ํŠน์ • ์š”์†Œ ์ˆ˜์— ๋Œ€ํ•ด ๋ฏธ๋ฆฌ ๊ณต๊ฐ„์„ ์˜ˆ์•ฝํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋ฉ”๋ชจ๋ฆฌ ๋ถ€์กฑ์œผ๋กœ ์ธํ•ด ์ž‘๋™ ์ค‘์— ์ถฉ๋Œ์ด ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค.
  • "m!{ .. }.method()" ๋ฐ "m!{ .. }?"์™€ ๊ฐ™์€ ํ‘œํ˜„์‹์—์„œ ์ค‘๊ด„ํ˜ธ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋งคํฌ๋กœ๋ฅผ ์ง€์ •ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  • File::read_to_end ๋ฐ read_to_string ํ•จ์ˆ˜์˜ ์‹คํ–‰์ด ์ตœ์ ํ™”๋˜์—ˆ์Šต๋‹ˆ๋‹ค.
  • ์œ ๋‹ˆ์ฝ”๋“œ ์‚ฌ์–‘์— ๋Œ€ํ•œ ์ง€์›์ด ๋ฒ„์ „ 14.0์œผ๋กœ ์—…๋ฐ์ดํŠธ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.
  • ๋ฐ˜ํ™˜ ๊ฐ’์ด ๋ฌด์‹œ๋˜๋Š” ๊ฒฝ์šฐ ๊ฒฝ๊ณ ๋ฅผ ๋ฐœํ–‰ํ•˜๋„๋ก "#[must_use]"๋กœ ํ‘œ์‹œ๋œ ํ•จ์ˆ˜ ์ˆ˜๋ฅผ ํ™•์žฅํ–ˆ์Šต๋‹ˆ๋‹ค. ์ด๋Š” ํ•จ์ˆ˜๊ฐ€ ์ƒˆ ๊ฐ’์„ ๋ฐ˜ํ™˜ํ•˜๋Š” ๋Œ€์‹  ๊ฐ’์„ ๋ณ€๊ฒฝํ•  ๊ฒƒ์ด๋ผ๊ณ  ๊ฐ€์ •ํ•˜์—ฌ ๋ฐœ์ƒํ•˜๋Š” ์˜ค๋ฅ˜๋ฅผ ์‹๋ณ„ํ•˜๋Š” ๋ฐ ๋„์›€์ด ๋ฉ๋‹ˆ๋‹ค.
  • libgccjit๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ฝ”๋“œ ์ƒ์„ฑ์„ ์œ„ํ•œ ์‹คํ—˜์  ๋ฐฑ์—”๋“œ๊ฐ€ ์ถ”๊ฐ€๋˜์—ˆ์Šต๋‹ˆ๋‹ค.
  • API์˜ ์ƒˆ๋กœ์šด ๋ถ€๋ถ„์ด ์•ˆ์ •ํ™”๋œ ํŠน์„ฑ์˜ ๋ฉ”์„œ๋“œ ๋ฐ ๊ตฌํ˜„์„ ํฌํ•จํ•˜์—ฌ ์•ˆ์ •์ ์ธ ๋ฒ”์ฃผ๋กœ ์ด๋™๋˜์—ˆ์Šต๋‹ˆ๋‹ค.
    • [ํ‹ฐ; N]::as_mut_slice
    • [ํ‹ฐ; N]::as_slice
    • ์ปฌ๋ ‰์…˜::TryReserveError
    • HashMap::try_reserve
    • HashSet::try_reserve
    • ๋ฌธ์ž์—ด::try_reserve
    • ๋ฌธ์ž์—ด::try_reserve_exact
    • Vec::try_reserve
    • Vec::try_reserve_exact
    • VecDeque::try_reserve
    • VecDeque::try_reserve_exact
    • ๋ฐ˜๋ณต์ž::map_while
    • iter::MapWhile
    • proc_macro::์‚ฌ์šฉ ๊ฐ€๋Šฅ
    • ๋ช…๋ น::get_program
    • ๋ช…๋ น::get_args
    • ๋ช…๋ น::get_envs
    • ๋ช…๋ น::get_current_dir
    • CommandArgs
    • CommandEnvs
  • ์ƒ์ˆ˜ ๋Œ€์‹  ๋ชจ๋“  ์ปจํ…์ŠคํŠธ์—์„œ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š”์ง€ ์—ฌ๋ถ€๋ฅผ ๊ฒฐ์ •ํ•˜๋Š” "const" ์†์„ฑ์€ ํ•จ์ˆ˜ ํžŒํŠธ::unreachable_unchecked์—์„œ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค.
  • armv6k-nintendo-3ds, armv7-unknown-linux-uclibceabihf, m68k-unknown-linux-gnu, aarch64-kmc-solid_asp3, armv7a-kmc-solid_asp3-eabi ๋ฐ armv7a-kmc-์— ๋Œ€ํ•œ ์„ธ ๋ฒˆ์งธ ์ˆ˜์ค€์˜ ์ง€์›์ด ๊ตฌํ˜„๋˜์—ˆ์Šต๋‹ˆ๋‹ค. solid_asp3-eabihf ํ”Œ๋žซํผ. ์„ธ ๋ฒˆ์งธ ์ˆ˜์ค€์—๋Š” ๊ธฐ๋ณธ ์ง€์›์ด ํฌํ•จ๋˜์ง€๋งŒ ์ž๋™ํ™”๋œ ํ…Œ์ŠคํŠธ, ๊ณต์‹ ๋นŒ๋“œ ๊ฒŒ์‹œ ๋˜๋Š” ์ฝ”๋“œ ๋นŒ๋“œ ๊ฐ€๋Šฅ ์—ฌ๋ถ€ ํ™•์ธ์€ ํฌํ•จ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

์ถœ์ฒ˜ : opennet.ru

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