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

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

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

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

  • ์ค„ ์„œ์‹ ์ง€์ • ๋ธ”๋ก์—์„œ๋Š” ์ค„ ๋’ค์— ๋ช…์‹œ์ ์œผ๋กœ ๋‚˜์—ด๋œ ๋ณ€์ˆ˜๋ฅผ ๋ฒˆํ˜ธ์™€ ์ด๋ฆ„์œผ๋กœ ๋Œ€์ฒดํ•˜๋Š” ์ด์ „ ๊ธฐ๋Šฅ ์™ธ์—๋„ ์ค„์— "{์‹๋ณ„์ž}"๋ผ๋Š” ํ‘œํ˜„์„ ์ถ”๊ฐ€ํ•˜์—ฌ ์ž„์˜์˜ ์‹๋ณ„์ž๋ฅผ ๋Œ€์ฒดํ•˜๋Š” ๊ธฐ๋Šฅ์ด ๊ตฌํ˜„๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ์˜ˆ: // ์ด์ „์— ์ง€์›๋œ ๊ตฌ์„ฑ: println!("Hello, {}!", get_person()); println!("์•ˆ๋…•ํ•˜์„ธ์š”, {0} ๋‹˜!", get_person()); println!("์•ˆ๋…•ํ•˜์„ธ์š”, {person} ๋‹˜!", person = get_person()); // ์ด์ œ ์ง€์ •ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. let person = get_person(); println!("์•ˆ๋…•ํ•˜์„ธ์š”, {์‚ฌ๋žŒ} ๋‹˜!");

    ํ˜•์‹ ์ง€์ • ์˜ต์…˜์—์„œ ์‹๋ณ„์ž๋ฅผ ์ง์ ‘ ์ง€์ •ํ•  ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค. let (๋„ˆ๋น„, ์ •๋ฐ€๋„) = get_format(); for (์ด๋ฆ„, ์ ์ˆ˜) in get_scores() { println!("{name}: {score:width$.precision$}"); }

    ์ƒˆ๋กœ์šด ๋Œ€์ฒด๋Š” "panic!" ๋งคํฌ๋กœ๋ฅผ ์ œ์™ธํ•˜๊ณ  ๋ฌธ์ž์—ด ํ˜•์‹ ์ •์˜๋ฅผ ์ง€์›ํ•˜๋Š” ๋ชจ๋“  ๋งคํฌ๋กœ์—์„œ ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค. Rust ์–ธ์–ด์˜ 2015 ๋ฐ 2018 ๋ฒ„์ „์—์„œ๋Š” ๋‹นํ™ฉ!("{ident}")์ด ์ผ๋ฐ˜ ๋ฌธ์ž์—ด๋กœ ์ฒ˜๋ฆฌ๋ฉ๋‹ˆ๋‹ค(Rust 2021์—์„œ๋Š” ๋Œ€์ฒด๊ฐ€ ์ž‘๋™ํ•จ).

  • Windows ํ”Œ๋žซํผ์˜ std::process::Command ๊ตฌ์กฐ ๋™์ž‘์ด ๋ณ€๊ฒฝ๋˜์–ด ๋ช…๋ น์„ ์‹คํ–‰ํ•  ๋•Œ ๋ณด์•ˆ์ƒ์˜ ์ด์œ ๋กœ ๋” ์ด์ƒ ํ˜„์žฌ ๋””๋ ‰ํ„ฐ๋ฆฌ์—์„œ ์‹คํ–‰ ํŒŒ์ผ์„ ์ฐพ์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ํ˜„์žฌ ๋””๋ ‰ํ„ฐ๋ฆฌ๋Š” ์‹ ๋ขฐํ•  ์ˆ˜ ์—†๋Š” ๋””๋ ‰ํ„ฐ๋ฆฌ์—์„œ ํ”„๋กœ๊ทธ๋žจ์ด ์‹คํ–‰๋  ๊ฒฝ์šฐ ์•…์„ฑ์ฝ”๋“œ ์‹คํ–‰์— ์‚ฌ์šฉ๋  ์ˆ˜ ์žˆ์œผ๋ฏ€๋กœ ์ œ์™ธ๋ฉ๋‹ˆ๋‹ค(CVE-2021-3013). ์ƒˆ๋กœ์šด ์‹คํ–‰ ๊ฐ€๋Šฅ ๊ฐ์ง€ ๋…ผ๋ฆฌ์—๋Š” Rust ๋””๋ ‰ํ„ฐ๋ฆฌ, ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ๋””๋ ‰ํ„ฐ๋ฆฌ, Windows ์‹œ์Šคํ…œ ๋””๋ ‰ํ„ฐ๋ฆฌ ๋ฐ PATH ํ™˜๊ฒฝ ๋ณ€์ˆ˜์— ์ง€์ •๋œ ๋””๋ ‰ํ„ฐ๋ฆฌ ๊ฒ€์ƒ‰์ด ํฌํ•จ๋ฉ๋‹ˆ๋‹ค.
  • ํ‘œ์ค€ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์—์„œ๋Š” ๋ฐ˜ํ™˜ ๊ฐ’์ด ๋ฌด์‹œ๋˜๋ฉด ๊ฒฝ๊ณ ๋ฅผ ๋ฐœํ–‰ํ•˜๋„๋ก "#[must_use]"๋ผ๊ณ  ํ‘œ์‹œ๋œ ํ•จ์ˆ˜ ์ˆ˜๋ฅผ ํ™•์žฅํ–ˆ์Šต๋‹ˆ๋‹ค. ์ด๋Š” ํ•จ์ˆ˜๊ฐ€ ์ƒˆ ๊ฐ’์„ ๋ฐ˜ํ™˜ํ•˜๋Š” ๊ฒƒ์ด ์•„๋‹ˆ๋ผ ๊ฐ’์„ ๋ณ€๊ฒฝํ•  ๊ฒƒ์ด๋ผ๊ณ  ๊ฐ€์ •ํ•˜์—ฌ ๋ฐœ์ƒํ•˜๋Š” ์˜ค๋ฅ˜๋ฅผ ์‹๋ณ„ํ•˜๋Š” ๋ฐ ๋„์›€์ด ๋ฉ๋‹ˆ๋‹ค.
  • API์˜ ์ƒˆ๋กœ์šด ๋ถ€๋ถ„์ด ์•ˆ์ •ํ™”๋œ ํŠน์„ฑ์˜ ๋ฉ”์„œ๋“œ ๋ฐ ๊ตฌํ˜„์„ ํฌํ•จํ•˜์—ฌ ์•ˆ์ •์ ์ธ ๋ฒ”์ฃผ๋กœ ์ด๋™๋˜์—ˆ์Šต๋‹ˆ๋‹ค.
    • ๋ฉ”ํƒ€๋ฐ์ดํ„ฐ::is_symlink
    • ๊ฒฝ๋กœ::is_symlink
    • {integer}::saturating_div
    • ์˜ต์…˜::unwrap_unchecked
    • ๊ฒฐ๊ณผ::unwrap_unchecked
    • ๊ฒฐ๊ณผ::unwrap_err_unchecked
  • ์ƒ์ˆ˜ ๋Œ€์‹  ๋ชจ๋“  ์ปจํ…์ŠคํŠธ์—์„œ ์‚ฌ์šฉํ•  ๊ฐ€๋Šฅ์„ฑ์„ ๊ฒฐ์ •ํ•˜๋Š” "const" ์†์„ฑ์€ ํ•จ์ˆ˜์—์„œ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค.
    • ๊ธฐ๊ฐ„::์ƒˆ๋กœ ๋งŒ๋“ค๊ธฐ
    • ๊ธฐ๊ฐ„::checked_add
    • ๊ธฐ๊ฐ„::saturating_add
    • ๊ธฐ๊ฐ„::checked_sub
    • ๊ธฐ๊ฐ„::saturating_sub
    • ๊ธฐ๊ฐ„::checked_mul
    • ๊ธฐ๊ฐ„::saturating_mul
    • ๊ธฐ๊ฐ„::checked_div
  • "const" ์ปจํ…์ŠคํŠธ์—์„œ "*const T" ํฌ์ธํ„ฐ์˜ ์—ญ์ฐธ์กฐ๊ฐ€ ํ—ˆ์šฉ๋ฉ๋‹ˆ๋‹ค.
  • Cargo ํŒจํ‚ค์ง€ ๊ด€๋ฆฌ์ž์—์„œ Rust_version ํ•„๋“œ๊ฐ€ ํŒจํ‚ค์ง€ ๋ฉ”ํƒ€๋ฐ์ดํ„ฐ์— ์ถ”๊ฐ€๋˜์—ˆ๊ณ  "--message-format" ์˜ต์…˜์ด "cargo install" ๋ช…๋ น์— ์ถ”๊ฐ€๋˜์—ˆ์Šต๋‹ˆ๋‹ค.
  • ์ปดํŒŒ์ผ๋Ÿฌ๋Š” CFI(์ œ์–ด ํ๋ฆ„ ๋ฌด๊ฒฐ์„ฑ) ๋ณดํ˜ธ ๋ฉ”์ปค๋‹ˆ์ฆ˜์— ๋Œ€ํ•œ ์ง€์›์„ ๊ตฌํ˜„ํ•ฉ๋‹ˆ๋‹ค. ์ด ๋ฉ”์ปค๋‹ˆ์ฆ˜์€ ๊ฐ ๊ฐ„์ ‘ ํ˜ธ์ถœ ์ „์— ๊ฒ€์‚ฌ๋ฅผ ์ถ”๊ฐ€ํ•˜์—ฌ ์ž ์žฌ์ ์œผ๋กœ ์ •์ƒ์ ์ธ ์‹คํ–‰ ์ˆœ์„œ(์ œ์–ด ํ๋ฆ„)๋ฅผ ์œ„๋ฐ˜ํ•  ์ˆ˜ ์žˆ๋Š” ์ •์˜๋˜์ง€ ์•Š์€ ๋™์ž‘์˜ ์ผ๋ถ€ ํ˜•ํƒœ๋ฅผ ๊ฐ์ง€ํ•ฉ๋‹ˆ๋‹ค. ํ•จ์ˆ˜์˜ ๋ฉ”๋ชจ๋ฆฌ์— ์ €์žฅ๋œ ํฌ์ธํ„ฐ๋ฅผ ๋ณ€๊ฒฝํ•˜๋Š” ์ต์Šคํ”Œ๋กœ์ž‡ ์‚ฌ์šฉ.
  • ์ปดํŒŒ์ผ๋Ÿฌ๋Š” ํ…Œ์ŠคํŠธ ์ค‘์— ์ฝ”๋“œ ์ ์šฉ ๋ฒ”์œ„๋ฅผ ํ‰๊ฐ€ํ•˜๋Š” ๋ฐ ์‚ฌ์šฉ๋˜๋Š” LLVM ์ ์šฉ ๋ฒ”์œ„ ๋น„๊ต ํ˜•์‹ ๋ฒ„์ „ 5 ๋ฐ 6์— ๋Œ€ํ•œ ์ง€์›์„ ์ถ”๊ฐ€ํ–ˆ์Šต๋‹ˆ๋‹ค.
  • ์ปดํŒŒ์ผ๋Ÿฌ์—์„œ๋Š” LLVM์˜ ์ตœ์†Œ ๋ฒ„์ „์— ๋Œ€ํ•œ ์š”๊ตฌ ์‚ฌํ•ญ์ด LLVM 12์œผ๋กœ ์ƒํ–ฅ ์กฐ์ •๋˜์—ˆ์Šต๋‹ˆ๋‹ค.
  • x86_64-unknown-none ํ”Œ๋žซํผ์— ๋Œ€ํ•œ ์„ธ ๋ฒˆ์งธ ์ˆ˜์ค€์˜ ์ง€์›์ด ๊ตฌํ˜„๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ์„ธ ๋ฒˆ์งธ ์ˆ˜์ค€์—๋Š” ๊ธฐ๋ณธ ์ง€์›์ด ํฌํ•จ๋˜์ง€๋งŒ ์ž๋™ํ™”๋œ ํ…Œ์ŠคํŠธ, ๊ณต์‹ ๋นŒ๋“œ ๊ฒŒ์‹œ ๋˜๋Š” ์ฝ”๋“œ ๋นŒ๋“œ ๊ฐ€๋Šฅ ์—ฌ๋ถ€ ํ™•์ธ์€ ํฌํ•จ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

๋˜ํ•œ Microsoft๊ฐ€ Rust ์–ธ์–ด๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ Windows OS์šฉ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ๊ฐœ๋ฐœํ•  ์ˆ˜ ์žˆ๋Š” Windows์šฉ Rust 0.30 ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ๋ฆด๋ฆฌ์Šค๋ฅผ ๋ฐœํ‘œํ–ˆ๋‹ค๋Š” ์‚ฌ์‹ค์„ ์ฃผ๋ชฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด ์„ธํŠธ์—๋Š” Rust ํ”„๋กœ๊ทธ๋žจ์—์„œ Win API์— ์•ก์„ธ์Šคํ•  ์ˆ˜ ์žˆ๋Š” ๋‘ ๊ฐœ์˜ ์ƒ์ž ํŒจํ‚ค์ง€(windows ๋ฐ windows-sys)๊ฐ€ ํฌํ•จ๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค. API ์ง€์›์„ ์œ„ํ•œ ์ฝ”๋“œ๋Š” API๋ฅผ ์„ค๋ช…ํ•˜๋Š” ๋ฉ”ํƒ€๋ฐ์ดํ„ฐ์—์„œ ๋™์ ์œผ๋กœ ์ƒ์„ฑ๋˜๋ฏ€๋กœ ๊ธฐ์กด Win API ํ˜ธ์ถœ๋ฟ๋งŒ ์•„๋‹ˆ๋ผ ํ–ฅํ›„ ๋‚˜ํƒ€๋‚  ํ˜ธ์ถœ์— ๋Œ€ํ•œ ์ง€์›์„ ๊ตฌํ˜„ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ƒˆ ๋ฒ„์ „์€ UWP(Universal Windows Platform) ๋Œ€์ƒ ํ”Œ๋žซํผ์— ๋Œ€ํ•œ ์ง€์›์„ ์ถ”๊ฐ€ํ•˜๊ณ  ํ•ธ๋“ค ๋ฐ ๋””๋ฒ„๊ทธ ์œ ํ˜•์„ ๊ตฌํ˜„ํ•ฉ๋‹ˆ๋‹ค.

์ถœ์ฒ˜ : opennet.ru

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