์–ด์…ˆ๋ธ”๋ฆฌ ์‚ฝ์ž…์„ ์ง€์›ํ•˜๋Š” Rust 1.59 ํ”„๋กœ๊ทธ๋ž˜๋ฐ ์–ธ์–ด ์ถœ์‹œ

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

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

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

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

  • ๋‚ฎ์€ ์ˆ˜์ค€์—์„œ ์‹คํ–‰์„ ์ œ์–ดํ•ด์•ผ ํ•˜๊ฑฐ๋‚˜ ํŠน์ˆ˜ํ•œ ๊ธฐ๊ณ„ ๋ช…๋ น์–ด๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์–ด์•ผ ํ•˜๋Š” ์‘์šฉ ํ”„๋กœ๊ทธ๋žจ์—์„œ ์š”๊ตฌ๋˜๋Š” ์–ด์…ˆ๋ธ”๋ฆฌ ์–ธ์–ด ์‚ฝ์ž…์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์–ด์…ˆ๋ธ”๋ฆฌ ์ธ์„œํŠธ๋Š” "asm!" ๋งคํฌ๋กœ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ถ”๊ฐ€๋ฉ๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  "global_asm!" Rust์—์„œ ๋ฌธ์ž์—ด ๋Œ€์ฒด์— ์‚ฌ์šฉ๋˜๋Š” ๊ฒƒ๊ณผ ์œ ์‚ฌํ•œ ์ด๋ฆ„ ์ง€์ • ๋ ˆ์ง€์Šคํ„ฐ์— ๋ฌธ์ž์—ด ํ˜•์‹ํ™” ๊ตฌ๋ฌธ์„ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. ์ปดํŒŒ์ผ๋Ÿฌ๋Š” x86, x86-64, ARM, AArch64 ๋ฐ RISC-V ์•„ํ‚คํ…์ฒ˜์— ๋Œ€ํ•œ ์–ด์…ˆ๋ธ”๋ฆฌ ๋ช…๋ น์–ด๋ฅผ ์ง€์›ํ•ฉ๋‹ˆ๋‹ค. ์‚ฝ์ž… ์˜ˆ: std::arch::asm;์„ ์‚ฌ์šฉํ•˜์‹ญ์‹œ์˜ค. // ์‹œํ”„ํŠธ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ x์— 6์„ ๊ณฑํ•˜๊ณ  ์ถ”๊ฐ€ํ•ฉ๋‹ˆ๋‹ค. let mut x: u64 = 4; unsafe { asm!( "mov {tmp}, {x}", "shl {tmp}, 1", "shl {x}, 2", "{x}, {tmp} ์ถ”๊ฐ€", x = inout(reg ) x, tmp = out(reg) _, ); } ์ฃผ์žฅ_eq!(x, 4 * 6);
  • ์—ฌ๋Ÿฌ ํŠน์„ฑ, ์กฐ๊ฐ ๋˜๋Š” ๊ตฌ์กฐ๊ฐ€ ํ‘œํ˜„์‹์˜ ์™ผ์ชฝ์— ์ง€์ •๋˜๋Š” ๊ตฌ์กฐ ํ•ด์ œ๋œ(๋ณ‘๋ ฌ) ํ• ๋‹น์— ๋Œ€ํ•œ ์ง€์›์ด ์ถ”๊ฐ€๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค: (a, b, c, d, e); (a, b) = (1, 2); [c, .., d, _] = [1, 2, 3, 4, 5]; ๊ตฌ์กฐ์ฒด { e, .. } = ๊ตฌ์กฐ์ฒด { e: 5, f: 3 }; ์ฃผ์žฅ_eq!([1, 2, 1, 4, 5], [a, b, c, d, e]);
  • const ์ œ๋„ค๋ฆญ์— ๋Œ€ํ•œ ๊ธฐ๋ณธ๊ฐ’์„ ์ง€์ •ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค: struct ArrayStorage { ๋„์ฐฉ: [T; N], } ์•”์‹œ ์–ด๋ ˆ์ด์Šคํ† ๋ฆฌ์ง€ { fn new(a: T, b: T) -> ArrayStorage { ArrayStorage { ๋„์ฐฉ: [a, b], } } }
  • Cargo ํŒจํ‚ค์ง€ ๊ด€๋ฆฌ์ž๋Š” ์ปดํŒŒ์ผ๋Ÿฌ์˜ ์˜ค๋ฅ˜๋กœ ์ธํ•ด ์ฒ˜๋ฆฌ๋˜๋Š” ์ข…์†์„ฑ์—์„œ ์œ ํšจํ•˜์ง€ ์•Š์€ ๊ตฌ์กฐ์˜ ์‚ฌ์šฉ์— ๋Œ€ํ•œ ๊ฒฝ๊ณ ๋ฅผ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค(์˜ˆ: ์˜ค๋ฅ˜๋กœ ์ธํ•ด ํŒจํ‚น๋œ ๊ตฌ์กฐ์˜ ํ•„๋“œ๋ฅผ ์•ˆ์ „ํ•œ ๋ธ”๋ก์—์„œ ๋นŒ๋ ค์˜ค๋Š” ๊ฒƒ์ด ํ—ˆ์šฉ๋จ). ์ด๋Ÿฌํ•œ ๊ตฌ์„ฑ์€ ํ–ฅํ›„ Rust ๋ฒ„์ „์—์„œ๋Š” ๋” ์ด์ƒ ์ง€์›๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
  • Cargo์™€ Rustc์—๋Š” ๋ณ„๋„์˜ ์œ ํ‹ธ๋ฆฌํ‹ฐ๋ฅผ ํ˜ธ์ถœํ•  ํ•„์š” ์—†์ด ๋””๋ฒ„๊น… ๋ฐ์ดํ„ฐ(strip = "debuginfo")์™€ ๊ธฐํ˜ธ(strip = "symbols")๊ฐ€ ์ œ๊ฑฐ๋œ ์‹คํ–‰ ํŒŒ์ผ์„ ์ƒ์„ฑํ•˜๋Š” ๊ธฐ๋Šฅ์ด ๋‚ด์žฅ๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค. ์ •๋ฆฌ ์„ค์ •์€ Cargo.toml์˜ "strip" ๋งค๊ฐœ๋ณ€์ˆ˜๋ฅผ ํ†ตํ•ด ๊ตฌํ˜„๋ฉ๋‹ˆ๋‹ค: [profile.release] ์ŠคํŠธ๋ฆฝ = "debuginfo", "symbols"
  • ์ฆ๋ถ„ ์ปดํŒŒ์ผ์€ ๊ธฐ๋ณธ์ ์œผ๋กœ ๋น„ํ™œ์„ฑํ™”๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ ์ด์œ ๋Š” ์ถฉ๋Œ ๋ฐ ์—ญ์ง๋ ฌํ™” ์˜ค๋ฅ˜๋ฅผ ๋ฐœ์ƒ์‹œํ‚ค๋Š” ์ปดํŒŒ์ผ๋Ÿฌ ๋ฒ„๊ทธ์— ๋Œ€ํ•œ ์ž„์‹œ ํ•ด๊ฒฐ ๋ฐฉ๋ฒ•์ด๋ผ๊ณ  ํ•ฉ๋‹ˆ๋‹ค. ๋ฒ„๊ทธ ์ˆ˜์ •์€ ์ด๋ฏธ ์ค€๋น„๋˜์—ˆ์œผ๋ฉฐ ๋‹ค์Œ ๋ฆด๋ฆฌ์Šค์— ํฌํ•จ๋  ์˜ˆ์ •์ž…๋‹ˆ๋‹ค. ์ฆ๋ถ„ ์ปดํŒŒ์ผ์„ ๋ฐ˜ํ™˜ํ•˜๋ ค๋ฉด ํ™˜๊ฒฝ ๋ณ€์ˆ˜ RUSTC_FORCE_INCREMENTAL=1์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  • API์˜ ์ƒˆ๋กœ์šด ๋ถ€๋ถ„์ด ์•ˆ์ •ํ™”๋œ ํŠน์„ฑ์˜ ๋ฉ”์„œ๋“œ ๋ฐ ๊ตฌํ˜„์„ ํฌํ•จํ•˜์—ฌ ์•ˆ์ •์ ์ธ ๋ฒ”์ฃผ๋กœ ์ด๋™๋˜์—ˆ์Šต๋‹ˆ๋‹ค.
    • std::์Šค๋ ˆ๋“œ::available_parallelism
    • ๊ฒฐ๊ณผ::๋ณต์‚ฌ๋จ
    • ๊ฒฐ๊ณผ::๋ณต์ œ๋จ
    • ์•„์น˜::asm!
    • ์•„์น˜::global_asm!
    • ops::ControlFlow::is_break
    • ops::ControlFlow::is_continue
    • u8์šฉ TryFrom
    • char::TryFromCharError(๋ณต์ œ, ๋””๋ฒ„๊ทธ, ํ‘œ์‹œ, PartialEq, ๋ณต์‚ฌ, Eq, ์˜ค๋ฅ˜)
    • ๋ฐ˜๋ณต::zip
    • NonZeroU8::is_power_of_two
    • NonZeroU16::is_power_of_two
    • NonZeroU32::is_power_of_two
    • NonZeroU64::is_power_of_two
    • NonZeroU128::is_power_of_two
    • ToLowercase ๊ตฌ์กฐ์— ๋Œ€ํ•œ DoubleEndedIterator
    • ToUppercase ๊ตฌ์กฐ์— ๋Œ€ํ•œ DoubleEndedIterator
    • TryFrom<&mut [T]> for [T; N]
    • Once ๊ตฌ์กฐ์— ๋Œ€ํ•œ UnwindSafe
    • RefUnwindSafe๋ฅผ ํ•œ ๋ฒˆ๋งŒ ์‚ฌ์šฉํ•ด๋ณด์„ธ์š”.
    • aarch8์šฉ ์ปดํŒŒ์ผ๋Ÿฌ์— ๋‚ด์žฅ๋œ armv64 ๋„ค์˜จ ์ง€์› ํ•จ์ˆ˜
  • ์ƒ์ˆ˜ ๋Œ€์‹  ๋ชจ๋“  ์ปจํ…์ŠคํŠธ์—์„œ ์‚ฌ์šฉํ•  ๊ฐ€๋Šฅ์„ฑ์„ ๊ฒฐ์ •ํ•˜๋Š” "const" ์†์„ฑ์€ ํ•จ์ˆ˜์—์„œ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค.
    • mem::MaybeUninit::as_ptr
    • mem::MaybeUninit::assume_init
    • mem::MaybeUninit::assume_init_ref
    • ffi::CStr::from_bytes_with_nul_unchecked

์ถœ์ฒ˜ : opennet.ru

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