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

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

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

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

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

  • ๊ธฐ๋ณธ ํ”„๋กœ๊ทธ๋žจ ์ถฉ๋Œ ์ฒ˜๋ฆฌ๊ธฐ(ํŒจ๋‹‰)๊ฐ€ ๋ฐœํ–‰ํ•˜๋Š” ๋ฉ”์‹œ์ง€ ํ˜•์‹์ด ๋‹ค์‹œ ์„ค๊ณ„๋˜์—ˆ์Šต๋‹ˆ๋‹ค. "panic!" ๋งคํฌ๋กœ์— ์ง€์ •๋œ ํ…์ŠคํŠธ ์ด์ œ ๋”ฐ์˜ดํ‘œ ์—†์ด ๋ณ„๋„์˜ ์ค„์— ํ‘œ์‹œ๋˜๋ฏ€๋กœ ๋ฉ”์‹œ์ง€๋ฅผ ๋” ์‰ฝ๊ฒŒ ์ฝ์„ ์ˆ˜ ์žˆ๊ณ  ์ค‘์ฒฉ๋œ ๋”ฐ์˜ดํ‘œ๊ฐ€ ์žˆ๊ฑฐ๋‚˜ ์—ฌ๋Ÿฌ ์ค„์— ๊ฑธ์ณ ๋ถ„ํ• ๋  ๋•Œ ํ˜ผ๋ž€์ด ์‚ฌ๋ผ์ง‘๋‹ˆ๋‹ค. fn main() { let file = "ferris.txt"; ๋‹นํ™ฉ!("์•ˆ๋ผ! {ํŒŒ์ผ:?}์„(๋ฅผ) ์ฐพ์„ ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค!"); } '์•ˆ๋ผ!'์— ๋‹นํ™ฉํ•œ ์Šค๋ ˆ๋“œ 'main'์ด ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค. "ferris.txt"๋ฅผ ์ฐพ์„ ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค!', src/main.rs:3:5 'main' ์Šค๋ ˆ๋“œ๊ฐ€ src/main.rs:3:5์—์„œ ํŒจ๋‹‰ ์ƒํƒœ์— ๋น ์กŒ์Šต๋‹ˆ๋‹ค. ์ด๋Ÿฐ! "ferris.txt"๋ฅผ ์ฐพ์„ ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค!

    "assert_eq" ๋ฐ "assert_ne" ๋งคํฌ๋กœ๊ฐ€ ํŠธ๋ฆฌ๊ฑฐ๋  ๋•Œ ํ‘œ์‹œ๋˜๋Š” ๋ฉ”์‹œ์ง€ ์ถœ๋ ฅ๋„ ์žฌ์ž‘์—…๋˜์—ˆ์Šต๋‹ˆ๋‹ค. fn main() { ์ฃผ์žฅ_eq!("๐Ÿฆ€", "๐ŸŸ", "ํŽ˜๋ฆฌ์Šค๋Š” ๋ฌผ๊ณ ๊ธฐ๊ฐ€ ์•„๋‹™๋‹ˆ๋‹ค"); } 'assertion failed: `(left == right)`์— ๋‹นํ™ฉํ•œ ์Šค๋ ˆ๋“œ 'main'์ด ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค. left: `"๐Ÿฆ€"`, right: `"๐ŸŸ"`: ferris is not a fish', src/main.rs: 2:5 ์Šค๋ ˆ๋“œ 'main'์ด src/main.rs:2:5์—์„œ ํŒจ๋‹‰ ์ƒํƒœ: `left == right` ์ฃผ์žฅ ์‹คํŒจ: Ferris๋Š” ๋ฌผ๊ณ ๊ธฐ๊ฐ€ ์•„๋‹™๋‹ˆ๋‹ค. ์™ผ์ชฝ: โ€œ๐Ÿฆ€โ€ ์˜ค๋ฅธ์ชฝ: โ€œ๐ŸŸโ€

  • RFC 3184์— ๋”ฐ๋ผ ์Šค๋ ˆ๋“œ ๋กœ์ปฌ(thread_local) LocalKey ์ €์žฅ์†Œ ํ‚ค๋ฅผ ์ง์ ‘ ์กฐ์ž‘ํ•˜๋Š” ๊ธฐ๋Šฅ์ด ์ถ”๊ฐ€๋˜์—ˆ์Šต๋‹ˆ๋‹ค. > ๋ฐ ๋กœ์ปฌํ‚ค > "with(|inner| ...)" ํด๋กœ์ €๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๋Œ€์‹  get(), set(), take() ๋ฐ replacement() ๋ฉ”์†Œ๋“œ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ถ”๊ฐ€ ์ดˆ๊ธฐํ™” ์ฝ”๋“œ๋ฅผ ์ˆ˜ํ–‰ํ•  ํ•„์š”๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค. โ€œthread_local!โ€ ๋งคํฌ๋กœ๋ฅผ ์‚ฌ์šฉํ•  ๋•Œ ์ƒˆ ์Šค๋ ˆ๋“œ์— ๋Œ€ํ•ด ์ง€์ •๋œ ๊ธฐ๋ณธ๊ฐ’ ์Šค๋ ˆ๋“œ_๋กœ์ปฌ! { ์ •์  ์‚ฌํ•ญ: ์…€ > = ์…€::new(Vec::new()); } fn f() { // THINGS.with(|i| i.set(vec![32, 1, 2])); // THINGS.set(vec![3, 1, 2])์ด ๋˜์—ˆ์Šต๋‹ˆ๋‹ค. // ... // let v = THINGS.with(|i| i.take()); // let v: Vec๊ฐ€ ๋˜์—ˆ์Šต๋‹ˆ๋‹ค. = THINGS.take(); }
  • API์˜ ์ƒˆ๋กœ์šด ๋ถ€๋ถ„์ด ์•ˆ์ •ํ™”๋œ ํŠน์„ฑ์˜ ๋ฉ”์„œ๋“œ ๋ฐ ๊ตฌํ˜„์„ ํฌํ•จํ•˜์—ฌ ์•ˆ์ •์ ์ธ ๋ฒ”์ฃผ๋กœ ์ด๋™๋˜์—ˆ์Šต๋‹ˆ๋‹ค.
    • ์„œ๋ช…๋˜์ง€ ์•Š์€ {integer}::div_ceil
    • ๋ถ€ํ˜ธ ์—†๋Š” {integer}::next_multiple_of
    • ์„œ๋ช…๋˜์ง€ ์•Š์€ {integer}::checked_next_multiple_of
    • ํ‘œ์ค€::ffi::FromBytesUntilNulError
    • ํ‘œ์ค€::os::์œ ๋‹‰์Šค::fs::chown
    • ํ‘œ์ค€::os::์œ ๋‹‰์Šค::fs::fchown
    • ํ‘œ์ค€::os::์œ ๋‹‰์Šค::fs::lfchown
    • ๋กœ์ปฌํ‚ค:: >::์–ป๋‹ค
    • ๋กœ์ปฌํ‚ค:: >::์„ค์ •
    • ๋กœ์ปฌํ‚ค:: >::์ทจํ•˜๋‹ค
    • ๋กœ์ปฌํ‚ค:: >::๋ฐ”๊พธ๋‹ค
    • ๋กœ์ปฌํ‚ค:: >::with_borrow
    • ๋กœ์ปฌํ‚ค:: >::with_borrow_mut
    • ๋กœ์ปฌํ‚ค:: >::์„ค์ •
    • ๋กœ์ปฌํ‚ค:: >::์ทจํ•˜๋‹ค
    • ๋กœ์ปฌํ‚ค:: >::๋ฐ”๊พธ๋‹ค
  • ์ƒ์ˆ˜ ๋Œ€์‹  ๋ชจ๋“  ์ปจํ…์ŠคํŠธ์—์„œ ์‚ฌ์šฉํ•  ๊ฐ€๋Šฅ์„ฑ์„ ๊ฒฐ์ •ํ•˜๋Š” "const" ์†์„ฑ์€ ํ•จ์ˆ˜์—์„œ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค.
    • rc::์•ฝํ•จ::์ƒˆ
    • ๋™๊ธฐํ™”::์•ฝํ•จ::์ƒˆ
    • NonNull::as_ref
  • ์ปดํŒŒ์ผ๋Ÿฌ๋Š” GCC ๋ฐ Clang๊ณผ ์œ ์‚ฌํ•˜๊ฒŒ ".comment" ์„น์…˜์— ๋ฒ„์ „ ์ •๋ณด ๊ธฐ๋ก์„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค.
  • ์„ธ ๋ฒˆ์งธ ์ˆ˜์ค€์˜ ์ง€์›์€ aarch64-unknown-teeos, csky-unknown-linux-gnuabiv2, riscv64-linux-android, riscv64gc-unknown-hermit, x86_64-unikraft-linux-musl ๋ฐ x86_64-unknown-linux ํ”Œ๋žซํผ์— ๋Œ€ํ•ด ๊ตฌํ˜„๋˜์—ˆ์Šต๋‹ˆ๋‹ค. -์˜คํ˜ธ์Šค. ์„ธ ๋ฒˆ์งธ ์ˆ˜์ค€์—๋Š” ๊ธฐ๋ณธ ์ง€์›์ด ํฌํ•จ๋˜์ง€๋งŒ ์ž๋™ํ™”๋œ ํ…Œ์ŠคํŠธ, ๊ณต์‹ ๋นŒ๋“œ ๊ฒŒ์‹œ ๋˜๋Š” ์ฝ”๋“œ ๋นŒ๋“œ ๊ฐ€๋Šฅ ์—ฌ๋ถ€ ํ™•์ธ์€ ํฌํ•จ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
  • ๋Œ€์ƒ ํ”Œ๋žซํผ wasm32-wasi-preview1-threads์— ๋Œ€ํ•œ ๋‘ ๋ฒˆ์งธ ์ˆ˜์ค€์˜ ์ง€์›์ด ๊ตฌํ˜„๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ๋‘ ๋ฒˆ์งธ ์ˆ˜์ค€์˜ ์ง€์›์—๋Š” ์กฐ๋ฆฝ ๋ณด์ฆ์ด ํฌํ•จ๋ฉ๋‹ˆ๋‹ค.

์ถœ์ฒ˜ : opennet.ru

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