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

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

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

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

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

  • ์ผ๋ฐ˜ ์—ฐ๊ด€ ์œ ํ˜•(GAT, Generic Associated Types)์— ๋Œ€ํ•œ ์ง€์›์ด ์ถ”๊ฐ€๋˜์–ด ๋‹ค๋ฅธ ์œ ํ˜•๊ณผ ์—ฐ๊ด€๋œ ์œ ํ˜• ๋ณ„์นญ์„ ์ƒ์„ฑํ•˜๊ณ  ์œ ํ˜• ์ƒ์„ฑ์ž๋ฅผ ํŠน์„ฑ๊ณผ ์—ฐ๊ฒฐํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. trait Foo { type Bar<'x>; }
  • "let ... else" ํ‘œํ˜„์‹์ด ๊ตฌํ˜„๋˜์–ด "let" ํ‘œํ˜„์‹ ๋‚ด์—์„œ ์ง์ ‘ ํŒจํ„ด ์ผ์น˜ ์กฐ๊ฑด์„ ํ™•์ธํ•˜๊ณ , ํŒจํ„ด์ด ์ผ์น˜ํ•˜์ง€ ์•Š์œผ๋ฉด ์ž„์˜์˜ ์ฝ”๋“œ๋ฅผ ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. let Ok(count) = u64::from_str(count_str) else { ๋‹นํ™ฉ!("์ •์ˆ˜๋ฅผ ๊ตฌ๋ฌธ ๋ถ„์„ํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค: '{count_str}'"); };
  • ์ข…๋ฃŒํ•  ๋ธ”๋ก์„ ์‹๋ณ„ํ•˜๊ธฐ ์œ„ํ•ด ๋ธ”๋ก ์ด๋ฆ„(๋ ˆ์ด๋ธ”)์„ ์‚ฌ์šฉํ•˜์—ฌ ๋ช…๋ช…๋œ ๋ธ”๋ก์„ ์กฐ๊ธฐ์— ์ข…๋ฃŒํ•˜๊ธฐ ์œ„ํ•ด break ๋ฌธ์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ฒฐ๊ณผ = '๋ธ”๋ก: { do_thing(); if Condition_not_met() { break '๋ธ”๋ก 1; } do_next_thing(); if Condition_not_met() { break '๋ธ”๋ก 2; } do_last_thing(); ์‚ผ };
  • Linux์˜ ๊ฒฝ์šฐ ๊ธฐ์กด macOS ํ”Œ๋žซํผ์—์„œ๋งŒ ๊ฐ€๋Šฅํ–ˆ๋˜ ๋””๋ฒ„๊น… ์ •๋ณด๋ฅผ ๋ณ„๋„๋กœ ์ €์žฅํ•˜๋Š” ๊ธฐ๋Šฅ(split-debuginfo)์ด ์ถ”๊ฐ€๋˜์—ˆ์Šต๋‹ˆ๋‹ค. "-Csplit-debuginfo=unpacked" ์˜ต์…˜์„ ์ง€์ •ํ•˜๋ฉด DWARF ํ˜•์‹์˜ debuginfo ๋ฐ์ดํ„ฐ๊ฐ€ ".dwo" ํ™•์žฅ์ž๋ฅผ ๊ฐ€์ง„ ์—ฌ๋Ÿฌ ๊ฐœ์˜ ๊ฐœ๋ณ„ ๊ฐœ์ฒด ํŒŒ์ผ์— ์ €์žฅ๋ฉ๋‹ˆ๋‹ค. "-Csplit-debuginfo=packed"๋ฅผ ์ง€์ •ํ•˜๋ฉด ํ”„๋กœ์ ํŠธ์˜ ๋ชจ๋“  debuginfo ๋ฐ์ดํ„ฐ๋ฅผ ํฌํ•จํ•˜๋Š” ".dwp" ํ˜•์‹์˜ ๋‹จ์ผ ํŒจํ‚ค์ง€๊ฐ€ ์ƒ์„ฑ๋ฉ๋‹ˆ๋‹ค. debuginfo๋ฅผ ELF ๊ฐœ์ฒด์˜ .debug_* ์„น์…˜์— ์ง์ ‘ ํ†ตํ•ฉํ•˜๋ ค๋ฉด "-Csplit-debuginfo=off" ์˜ต์…˜์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  • API์˜ ์ƒˆ๋กœ์šด ๋ถ€๋ถ„์ด ์•ˆ์ •ํ™”๋œ ํŠน์„ฑ์˜ ๋ฉ”์„œ๋“œ ๋ฐ ๊ตฌํ˜„์„ ํฌํ•จํ•˜์—ฌ ์•ˆ์ •์ ์ธ ๋ฒ”์ฃผ๋กœ ์ด๋™๋˜์—ˆ์Šต๋‹ˆ๋‹ค.
    • ํ‘œ์ค€::์—ญ์ถ”์ ::์—ญ์ถ”์ 
    • ๋ฐ”์šด๋“œ::as_ref
    • std::io::read_to_string
    • <*const T>::cast_mut
    • <*mut T>::cast_const
  • ์ƒ์ˆ˜ ๋Œ€์‹  ๋ชจ๋“  ์ปจํ…์ŠคํŠธ์—์„œ ์‚ฌ์šฉํ•  ๊ฐ€๋Šฅ์„ฑ์„ ๊ฒฐ์ •ํ•˜๋Š” "const" ์†์„ฑ์€ <*const T&>::offset_from ๋ฐ <*mut T>::offset_from ํ•จ์ˆ˜์—์„œ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค.
  • LSP(Language Server Protocol) ํ”„๋กœํ† ์ฝœ ๊ตฌํ˜„์„ Rust-Analyzer๋กœ ์ด์ „ํ•˜๋Š” ๋งˆ์ง€๋ง‰ ๋‹จ๊ณ„์˜ ์ผ๋ถ€๋กœ, ์˜ค๋ž˜๋œ Rust Language Server(RLS) ๊ตฌํ˜„์ด ๋‹ค์Œ์œผ๋กœ ์ „ํ™˜ํ•˜๋ผ๋Š” ์ œ์•ˆ๊ณผ ํ•จ๊ป˜ ๊ฒฝ๊ณ ๋ฅผ ๋ฐœํ–‰ํ•˜๋Š” ์Šคํ… ์„œ๋ฒ„๋กœ ๋Œ€์ฒด๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ๋…น ๋ถ„์„๊ธฐ๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.
  • ์ปดํŒŒ์ผํ•˜๋Š” ๋™์•ˆ MIR ์ค‘๊ฐ„ ์ฝ”๋“œ์˜ ์ธ๋ผ์ธ ๋ฐฐํฌ ์ง€์›์ด ํ™œ์„ฑํ™”๋˜์–ด ์ผ๋ฐ˜์ ์ธ ํฌ๋ ˆ์ดํŠธ ํŒจํ‚ค์ง€์˜ ์ปดํŒŒ์ผ ์†๋„๊ฐ€ 3~10% ํ–ฅ์ƒ๋ฉ๋‹ˆ๋‹ค.
  • ์˜ˆ์•ฝ๋œ ๋นŒ๋“œ ์†๋„๋ฅผ ๋†’์ด๊ธฐ ์œ„ํ•ด Cargo ํŒจํ‚ค์ง€ ๊ด€๋ฆฌ์ž๋Š” ๋Œ€๊ธฐ์—ด์—์„œ ์‹คํ–‰์„ ๊ธฐ๋‹ค๋ฆฌ๋Š” ์ž‘์—… ์ •๋ ฌ ๊ธฐ๋Šฅ์„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค.

๋˜ํ•œ ๋ณผ๋ณด์—์„œ ์ž๋™์ฐจ ์ •๋ณด ์‹œ์Šคํ…œ์˜ ๊ตฌ์„ฑ ์š”์†Œ๋ฅผ ๊ฐœ๋ฐœํ•˜๊ธฐ ์œ„ํ•ด Rust ์–ธ์–ด๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๋ฐฉ๋ฒ•์— ๋Œ€ํ•œ ์ธํ„ฐ๋ทฐ๋ฅผ ๋ณผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. Rust๋กœ ๊ธฐ์กด ์ฝ”๋“œ์™€ ํ…Œ์ŠคํŠธ๋œ ์ฝ”๋“œ๋ฅผ ๋‹ค์‹œ ์ž‘์„ฑํ•  ๊ณ„ํš์€ ์—†์ง€๋งŒ, ์ƒˆ๋กœ์šด ์ฝ”๋“œ์˜ ๊ฒฝ์šฐ Rust๋Š” ์ €๋ ดํ•œ ๋น„์šฉ์œผ๋กœ ํ’ˆ์งˆ์„ ํ–ฅ์ƒ์‹œํ‚ค๊ธฐ ์œ„ํ•ด ์„ ํ˜ธ๋˜๋Š” ์˜ต์…˜ ์ค‘ ํ•˜๋‚˜์ž…๋‹ˆ๋‹ค. Rust ์–ธ์–ด ์‚ฌ์šฉ๊ณผ ๊ด€๋ จ๋œ ์ž‘์—… ๊ทธ๋ฃน์€ ์ž๋™์ฐจ ํ˜‘ํšŒ AUTOSAR(AUTomotive Open System ARchitecture) ๋ฐ SAE(Society of Automotive Engineers)์—๋„ ๋งŒ๋“ค์–ด์กŒ์Šต๋‹ˆ๋‹ค.

๋˜ํ•œ Google์˜ ์—”์ง€๋‹ˆ์–ด๋ง ๋ถ€์‚ฌ์žฅ์ธ David Kleidermacher๋Š” ์•”ํ˜ธํ™” ํ‚ค๋ฅผ ๊ด€๋ฆฌํ•˜๊ธฐ ์œ„ํ•ด Android ํ”Œ๋žซํผ์—์„œ ์‚ฌ์šฉ๋˜๋Š” ์ฝ”๋“œ๋ฅผ Rust๋กœ ๋ณ€ํ™˜ํ•˜๋Š” ๋ฐฉ๋ฒ•๊ณผ ์Šคํƒ์—์„œ HTTPS ํ”„๋กœํ† ์ฝœ์„ ํ†ตํ•œ DNS ๊ตฌํ˜„์— Rust๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๋ฐฉ๋ฒ•์— ๋Œ€ํ•ด ์„ค๋ช…ํ–ˆ์Šต๋‹ˆ๋‹ค. UWB ์นฉ(Ultra-Wideband) ๋ฐ Tensor G2 ์นฉ๊ณผ ๊ด€๋ จ๋œ ๊ฐ€์ƒํ™” ํ”„๋ ˆ์ž„์›Œํฌ(Android Virtualization Framework)์šฉ์ž…๋‹ˆ๋‹ค. Rust๋กœ ์žฌ์ž‘์„ฑ๋œ ์ƒˆ๋กœ์šด Bluetooth ๋ฐ Wi-Fi ์Šคํƒ๋„ Android์šฉ์œผ๋กœ ๊ฐœ๋ฐœ ์ค‘์ž…๋‹ˆ๋‹ค. ์ผ๋ฐ˜์ ์ธ ์ „๋žต์€ ๋จผ์ € ๊ฐ€์žฅ ์ทจ์•ฝํ•˜๊ณ  ์ค‘์š”ํ•œ ์†Œํ”„ํŠธ์›จ์–ด ๊ตฌ์„ฑ ์š”์†Œ๋ฅผ Rust๋กœ ๋ณ€ํ™˜ํ•œ ๋‹ค์Œ ๋‹ค๋ฅธ ๊ด€๋ จ ํ•˜์œ„ ์‹œ์Šคํ…œ์œผ๋กœ ํ™•์žฅํ•˜์—ฌ ์ ์ฐจ์ ์œผ๋กœ ๋ณด์•ˆ์„ ๊ฐ•ํ™”ํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์ž‘๋…„์—๋Š” Rust ์–ธ์–ด๊ฐ€ Android ํ”Œ๋žซํผ ๊ฐœ๋ฐœ์— ํ—ˆ์šฉ๋˜๋Š” ์–ธ์–ด ๋ชฉ๋ก์— ํฌํ•จ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

์ถœ์ฒ˜ : opennet.ru

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