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

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

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

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

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

  • ๊ธฐ๋ณธ ํ•จ์ˆ˜์—์„œ ์ž์‹ ๋งŒ์˜ ๋ฐ˜ํ™˜ ์ฝ”๋“œ๋ฅผ ์ •์˜ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์›๋ž˜ Rust์˜ ์ฃผ์š” ํ•จ์ˆ˜๋Š” "()"(๋‹จ์œ„) ์œ ํ˜•๋งŒ ๋ฐ˜ํ™˜ํ•  ์ˆ˜ ์žˆ์—ˆ๋Š”๋ฐ, ์ด๋Š” ๊ฐœ๋ฐœ์ž๊ฐ€ ๋ช…์‹œ์ ์œผ๋กœ "process::exit(code)" ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœํ•˜์ง€ ์•Š๋Š” ํ•œ ํ•ญ์ƒ ์„ฑ๊ณต์ ์ธ ์ข…๋ฃŒ ์ƒํƒœ๋ฅผ ๋‚˜ํƒ€๋ƒ…๋‹ˆ๋‹ค. Rust 1.26์—์„œ๋Š” main ํ•จ์ˆ˜์˜ ๋ถˆ์•ˆ์ •ํ•œ Termination ํŠน์„ฑ์„ ์‚ฌ์šฉํ•˜์—ฌ C ํ”„๋กœ๊ทธ๋žจ์˜ EXIT_SUCCESS ๋ฐ EXIT_FAILURE ์ฝ”๋“œ์— ํ•ด๋‹นํ•˜๋Š” "Ok" ๋ฐ "Err" ๊ฐ’์„ ๋ฐ˜ํ™˜ํ•˜๋Š” ๊ฒƒ์ด ๊ฐ€๋Šฅํ–ˆ์Šต๋‹ˆ๋‹ค. Rust 1.61์—์„œ๋Š” Termination ํŠน์„ฑ์ด ์•ˆ์ •์ ์œผ๋กœ ๋งŒ๋“ค์–ด์กŒ์œผ๋ฉฐ ํŠน์ • ๋ฐ˜ํ™˜ ์ฝ”๋“œ๋ฅผ ๋‚˜ํƒ€๋‚ด๊ธฐ ์œ„ํ•ด ๋ณ„๋„์˜ ExitCode ์œ ํ˜•์ด ์ œ์•ˆ๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ์ด ์œ ํ˜•์€ ๋ฏธ๋ฆฌ ์ •์˜๋œ ์ƒ์ˆ˜ SUCCESS ๋ฐ FAILURE์™€ From ๋ฉ”์„œ๋“œ๋ฅผ ๋ชจ๋‘ ์ œ๊ณตํ•˜์—ฌ ํ”Œ๋žซํผ๋ณ„ ๋ฐ˜ํ™˜ ์œ ํ˜•์„ ์ถ”์ƒํ™”ํ•ฉ๋‹ˆ๋‹ค. ์ž„์˜์˜ ๋ฐ˜ํ™˜ ์ฝ”๋“œ๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค. std::process::ExitCode๋ฅผ ์‚ฌ์šฉํ•˜์‹ญ์‹œ์˜ค. fn main() -> ExitCode { if !check_foo() { return ExitCode::from(8); } ์ข…๋ฃŒ์ฝ”๋“œ::์„ฑ๊ณต }
  • "const fn" ํ‘œํ˜„์‹์„ ์‚ฌ์šฉํ•˜์—ฌ ์ •์˜๋œ ํ•จ์ˆ˜์˜ ์ถ”๊ฐ€ ๊ธฐ๋Šฅ์ด ์•ˆ์ •ํ™”๋˜์–ด ์ผ๋ฐ˜ ํ•จ์ˆ˜๋กœ ํ˜ธ์ถœํ•  ์ˆ˜ ์žˆ์„ ๋ฟ๋งŒ ์•„๋‹ˆ๋ผ ์ƒ์ˆ˜ ๋Œ€์‹  ๋ชจ๋“  ์ปจํ…์ŠคํŠธ์—์„œ ์‚ฌ์šฉํ•  ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๋Ÿฌํ•œ ํ•จ์ˆ˜๋Š” ๋Ÿฐํƒ€์ž„์ด ์•„๋‹Œ ์ปดํŒŒ์ผ ํƒ€์ž„์— ๊ณ„์‚ฐ๋˜๋ฏ€๋กœ ์ƒ์ˆ˜์—์„œ๋งŒ ์ฝ์„ ์ˆ˜ ์žˆ๋Š” ๊ธฐ๋Šฅ๊ณผ ๊ฐ™์€ ํŠน์ • ์ œํ•œ ์‚ฌํ•ญ์ด ์ ์šฉ๋ฉ๋‹ˆ๋‹ค. ์ƒˆ ๋ฒ„์ „์—์„œ๋Š” ํ•จ์ˆ˜ ํฌ์ธํ„ฐ๋ฅผ ์‚ฌ์šฉํ•œ ๊ธฐ๋ณธ ์ž‘์—…์ด const ํ•จ์ˆ˜ ๋‚ด์—์„œ ํ—ˆ์šฉ๋ฉ๋‹ˆ๋‹ค(ํฌ์ธํ„ฐ ์ƒ์„ฑ, ์ „๋‹ฌ ๋ฐ ์บ์ŠคํŒ…์€ ํ—ˆ์šฉ๋˜์ง€๋งŒ ํฌ์ธํ„ฐ๋กœ ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœํ•  ์ˆ˜๋Š” ์—†์Œ). T: Copy์™€ ๊ฐ™์€ const ํ•จ์ˆ˜์˜ ์ผ๋ฐ˜ ๋งค๊ฐœ๋ณ€์ˆ˜์— ๋Œ€ํ•œ ํŠน์„ฑ ๋ฒ”์œ„; ๋™์ ์œผ๋กœ ์ „๋‹ฌ ๊ฐ€๋Šฅํ•œ ํŠน์„ฑ(dyn Trait) impl ํ•จ์ˆ˜ ์ธ์ˆ˜ ๋ฐ ๋ฐ˜ํ™˜ ๊ฐ’์— ๋Œ€ํ•œ ํŠน์„ฑ ์œ ํ˜•์ž…๋‹ˆ๋‹ค.
  • std::io์˜ Stdin, Stdout ๋ฐ Stderr์„ ์ฒ˜๋ฆฌํ•˜๋Š” ์ŠคํŠธ๋ฆผ์€ ์ด์ œ ์ž ๊ฒจ ์žˆ์„ ๋•Œ ์ •์  ์ˆ˜๋ช…("์ •์ ")์„ ๊ฐ€์ง€๋ฏ€๋กœ "let out = std::io::stdout().lock();"๊ณผ ๊ฐ™์€ ๊ตฌ๋ฌธ์„ ํ—ˆ์šฉํ•ฉ๋‹ˆ๋‹ค. ํ•˜๋‚˜์˜ ํ‘œํ˜„์‹์œผ๋กœ ํ•ธ๋“ค์„ ์–ป๊ณ  ์ž ๊ธˆ์„ ์„ค์ •ํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.
  • API์˜ ์ƒˆ๋กœ์šด ๋ถ€๋ถ„์ด ์•ˆ์ •ํ™”๋œ ํŠน์„ฑ์˜ ๋ฉ”์„œ๋“œ ๋ฐ ๊ตฌํ˜„์„ ํฌํ•จํ•˜์—ฌ ์•ˆ์ •์ ์ธ ๋ฒ”์ฃผ๋กœ ์ด๋™๋˜์—ˆ์Šต๋‹ˆ๋‹ค.
    • ํ•€::static_mut
    • ํ•€::static_ref
    • Vec::retain_mut
    • VecDeque::retain_mut
    • ์ปค์„œ ์“ฐ๊ธฐ
    • std::os::unix::net::SocketAddr::from_pathname
    • ํ‘œ์ค€::ํ”„๋กœ์„ธ์Šค::ExitCode
    • ํ‘œ์ค€::ํ”„๋กœ์„ธ์Šค::์ข…๋ฃŒ
    • std::์Šค๋ ˆ๋“œ::JoinHandle::is_finished
  • ์ƒ์ˆ˜ ๋Œ€์‹  ๋ชจ๋“  ์ปจํ…์ŠคํŠธ์—์„œ ์‚ฌ์šฉํ•  ๊ฐ€๋Šฅ์„ฑ์„ ๊ฒฐ์ •ํ•˜๋Š” "const" ์†์„ฑ์€ ํ•จ์ˆ˜์—์„œ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค.
    • ::offset ๋ฐ ::offset
    • ::wrapping_offset ๋ฐ ::wrapping_offset
    • ::add ๋ฐ ::add
    • ::sub ๋ฐ ::sub
    • ::wrapping_add ๋ฐ ::wrapping_add
    • ::wrapping_sub ๋ฐ ::wrapping_sub
    • ::as_mut_ptr
    • ::as_ptr_range
    • ::as_mut_ptr_range

๋˜ํ•œ ํŽŒ์›จ์–ด์— ์‚ฌ์šฉ๋˜๋Š” Xous ๋งˆ์ดํฌ๋กœ์ปค๋„ ์šด์˜ ์ฒด์ œ๋ฅผ ๊ฐœ๋ฐœํ•˜๋Š” ๋™์•ˆ 100๋งŒ ์ค„์˜ ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•œ ํ›„ Rust ์–ธ์–ด์— ๋Œ€ํ•œ ์ธ์ƒ์„ ์š”์•ฝํ•œ "Rust: A Critical Retrospective" ๊ธฐ์‚ฌ๋ฅผ ์ฐธ๊ณ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋‹จ์ ์œผ๋กœ๋Š” ์ดํ•ดํ•˜๊ธฐ ์–ด๋ ค์šด ๊ตฌ๋ฌธ, ์–ธ์–ด์˜ ๋ถˆ์™„์ „์„ฑ๊ณผ ์ง€์†์ ์ธ ๊ฐœ๋ฐœ, ๋ฐ˜๋ณต ๊ฐ€๋Šฅํ•œ ๋นŒ๋“œ ๋ถ€์กฑ, Crates.io์˜ ์ข…์†์„ฑ ์‹ ๋ขฐ์— ๋Œ€ํ•œ ์ผ๋ฐ˜์ ์ธ ๋ฌธ์ œ, ๋ณด์•ˆ ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•˜๊ธฐ ์œ„ํ•ด ํŠน์ • ๊ทœ์œจ์„ ์œ ์ง€ํ•ด์•ผ ํ•˜๋Š” ํ•„์š”์„ฑ ๋“ฑ์ด ์žˆ์Šต๋‹ˆ๋‹ค. ๊ธฐ๋Œ€๋ฅผ ๋›ฐ์–ด๋„˜๋Š” ๊ธฐ๋Šฅ์—๋Š” ์ฝ”๋“œ ๋ฆฌํŒฉํ† ๋ง์„ ์œ„ํ•œ ๋„๊ตฌ์™€ ์‹ ์†ํ•œ ํ”„๋กœํ† ํƒ€์ดํ•‘ ์ค‘์— ์ถ”๊ฐ€๋œ "ํ•ดํ‚น" ์žฌ์ž‘์—…์ด ํฌํ•จ๋ฉ๋‹ˆ๋‹ค.

์ถœ์ฒ˜ : opennet.ru

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