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

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

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

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

  • ์ข…์†์„ฑ ๋ฉ”ํƒ€๋ฐ์ดํ„ฐ๊ฐ€ ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•ด์ง€๋ฉด ์ปดํŒŒ์ผ์ด ์™„๋ฃŒ๋  ๋•Œ๊นŒ์ง€ ๊ธฐ๋‹ค๋ฆฌ์ง€ ์•Š๊ณ  ์ข…์† ํฌ๋ ˆ์ดํŠธ ํŒจํ‚ค์ง€์˜ ๋นŒ๋“œ๊ฐ€ ์ฆ‰์‹œ ์‹œ์ž‘๋˜๋Š” ํŒŒ์ดํ”„๋ผ์ธ ์ปดํŒŒ์ผ ๋ชจ๋“œ(ํŒŒ์ดํ”„๋ผ์ธ)๋ฅผ ์ถ”๊ฐ€ํ–ˆ์Šต๋‹ˆ๋‹ค. ํŒจํ‚ค์ง€๋ฅผ ์ปดํŒŒ์ผํ•  ๋•Œ ์ข…์†์„ฑ์„ ์™„์ „ํžˆ ์–ด์…ˆ๋ธ”ํ•  ํ•„์š”๋Š” ์—†์œผ๋ฉฐ ์œ ํ˜• ๋ชฉ๋ก, ์ข…์†์„ฑ ๋ฐ ๋‚ด๋ณด๋‚ธ ์š”์†Œ๊ฐ€ ํฌํ•จ๋œ ๋ฉ”ํƒ€๋ฐ์ดํ„ฐ๋งŒ ์ •์˜ํ•˜๋ฉด ๋ฉ๋‹ˆ๋‹ค. ๋ฉ”ํƒ€๋ฐ์ดํ„ฐ๋Š” ์ปดํŒŒ์ผ ํ”„๋กœ์„ธ์Šค ์ดˆ๊ธฐ์— ์ œ๊ณต๋˜๋ฏ€๋กœ ๋งํฌ๋œ ํŒจํ‚ค์ง€๋ฅผ ํ›จ์”ฌ ๋” ์ผ์ฐ ์ปดํŒŒ์ผํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋‹จ์ผ ํŒจํ‚ค์ง€๋ฅผ ๋นŒ๋“œํ•  ๋•Œ ์ œ์•ˆ๋œ ๋ชจ๋“œ๋Š” ์„ฑ๋Šฅ์— ์˜ํ–ฅ์„ ๋ฏธ์น˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ๋นŒ๋“œ๊ฐ€ ๋ถ„๊ธฐ๋œ ์ข…์†์„ฑ์„ ํฌํ•จํ•˜๋Š” ํŒจํ‚ค์ง€๋ฅผ ํฌํ•จํ•˜๋Š” ๊ฒฝ์šฐ ์ „์ฒด ๋นŒ๋“œ ์‹œ๊ฐ„์„ 10-20% ์ค„์ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  • ์ž˜๋ชป๋œ ๊ธฐ๋Šฅ ์‚ฌ์šฉ ๊ฐ์ง€ ๋ณด์žฅ std::mem::์ดˆ๊ธฐํ™”๋˜์ง€ ์•Š์Œ ะธ std::mem::์ œ๋กœํ™”๋จ. ์˜ˆ๋ฅผ ๋“ค์–ด std::mem::uninitialized๋Š” ๋ฐฐ์—ด์„ ๋น ๋ฅด๊ฒŒ ์ƒ์„ฑํ•˜๋Š” ๋ฐ ํŽธ๋ฆฌํ•˜์ง€๋งŒ ์ดˆ๊ธฐํ™”๋œ ๊ฒƒ์ฒ˜๋Ÿผ ๋ณด์ด์ง€๋งŒ ์‹ค์ œ๋กœ๋Š” ๊ฐ’์ด ์ดˆ๊ธฐํ™”๋˜์ง€ ์•Š์€ ์ƒํƒœ๋กœ ์œ ์ง€๋˜๋ฏ€๋กœ ์ปดํŒŒ์ผ๋Ÿฌ์— ์˜คํ•ด๋ฅผ ๋ถˆ๋Ÿฌ์ผ์œผํ‚ต๋‹ˆ๋‹ค. mem::uninitialized ํ•จ์ˆ˜๋Š” ์ด๋ฏธ ๋” ์ด์ƒ ์‚ฌ์šฉ๋˜์ง€ ์•Š๋Š” ๊ฒƒ์œผ๋กœ ํ‘œ์‹œ๋˜์–ด ์žˆ์œผ๋ฏ€๋กœ ๋Œ€์‹  ์ค‘๊ฐ„ ์œ ํ˜•์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค. ์•„๋งˆ๋„๋‹จ์œ„. mem::zeroed์˜ ๊ฒฝ์šฐ ์ด ํ•จ์ˆ˜๋Š” XNUMX ๊ฐ’์„ ํ—ˆ์šฉํ•  ์ˆ˜ ์—†๋Š” ์œ ํ˜•์— ๋ฌธ์ œ๋ฅผ ์ผ์œผํ‚ฌ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

    ์ •์˜๋˜์ง€ ์•Š์€ ๋™์ž‘์„ ์‹๋ณ„ํ•˜๋Š” ๋ฐ ๋„์›€์„ ์ฃผ๊ธฐ ์œ„ํ•ด ์ƒˆ ๋ฆด๋ฆฌ์Šค์—์„œ๋Š” mem::uninitialized ๋˜๋Š” mem::zeroed์™€ ๊ด€๋ จ๋œ ๋ช‡ ๊ฐ€์ง€ ๋ฌธ์ œ๋ฅผ ๊ฐ์ง€ํ•˜๋Š” Lint ๊ฒ€์‚ฌ๋ฅผ ์ปดํŒŒ์ผ๋Ÿฌ์— ์ถ”๊ฐ€ํ•ฉ๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด, null ๊ฐ’์„ ํ—ˆ์šฉํ•  ์ˆ˜ ์—†๋Š” ํฌ์ธํ„ฐ ๊ฐœ์ฒด๋ฅผ ๋‚˜ํƒ€๋‚ด๋Š” &T ๋ฐ Box<T> ์œ ํ˜•๊ณผ ํ•จ๊ป˜ mem::uninitialized ๋˜๋Š” mem::zeroed๋ฅผ ์‚ฌ์šฉํ•˜๋ ค๊ณ  ํ•˜๋ฉด ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค.

  • ํฌ๋ ˆ์ดํŠธ ํŒจํ‚ค์ง€๋ฅผ ๋” ์ด์ƒ ์‚ฌ์šฉ๋˜์ง€ ์•Š๋Š” ๊ฒƒ์œผ๋กœ ํ‘œ์‹œํ•˜๊ณ  ํ–ฅํ›„ ์‚ญ์ œ๋ฅผ ์˜ˆ์•ฝํ•  ์ˆ˜ ์žˆ๋„๋ก "#[deprecated]" ์†์„ฑ์ด ํ™•์žฅ๋˜์—ˆ์Šต๋‹ˆ๋‹ค. Rust 1.38๋ถ€ํ„ฐ ์ด ์†์„ฑ์€ ๋งคํฌ๋กœ์—๋„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  • ํ•˜์œ„ ๋ชจ๋“ˆ์— "#[global_allocator]" ์†์„ฑ์„ ์‚ฌ์šฉํ•˜๋Š” ๊ธฐ๋Šฅ์ด ์ถ”๊ฐ€๋˜์—ˆ์Šต๋‹ˆ๋‹ค.
  • ์ถ”๊ฐ€๋œ ๊ธฐ๋Šฅ ํ‘œ์ค€::๋ชจ๋“ ::์œ ํ˜•_์ด๋ฆ„, ๋””๋ฒ„๊น… ๋ชฉ์ ์— ์œ ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ์œ ํ˜•์˜ ์ด๋ฆ„์„ ์ฐพ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด, ํ”„๋กœ๊ทธ๋žจ ์‹คํ–‰ ์ค‘์— ํ•จ์ˆ˜๊ฐ€ ์–ด๋–ค ์œ ํ˜•์œผ๋กœ ํ˜ธ์ถœ๋˜์—ˆ๋Š”์ง€ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

    fn gen_value<T: ๊ธฐ๋ณธ๊ฐ’>() -> T {
    println!("{}์˜ ์ธ์Šคํ„ด์Šค ์ดˆ๊ธฐํ™” ์ค‘", std::any::type_name::<T>());
    ๊ธฐ๋ณธ๊ฐ’::๊ธฐ๋ณธ๊ฐ’()
    }

    fn ๋ฉ”์ธ() {
    let _: i32 = gen_value(); # "i32"๊ฐ€ ์ธ์‡„๋ฉ๋‹ˆ๋‹ค
    let _: String = gen_value(); # "alloc::string::String"์„ ์ธ์‡„ํ•ฉ๋‹ˆ๋‹ค.
    }

  • ํ‘œ์ค€ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์˜ ํ™•์žฅ ๊ธฐ๋Šฅ:
    • Slice::{concat, connect, Join}์€ ์ด์ œ &T ์™ธ์— &[T] ๊ฐ’๋„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
    • "*const T" ๋ฐ "*mut T"๋Š” ์ด์ œ marker::Unpin์„ ๊ตฌํ˜„ํ•ฉ๋‹ˆ๋‹ค.
    • "Arc<[T]>" ๋ฐ "Rc<[T]>"๋Š” ์ด์ œ FromIterator<T>๋ฅผ ๊ตฌํ˜„ํ•ฉ๋‹ˆ๋‹ค.
    • iter::{StepBy, Peekable, Take}๋Š” ์ด์ œ DoubleEndedIterator๋ฅผ ๊ตฌํ˜„ํ•ฉ๋‹ˆ๋‹ค.
    • ascii::EscapeDefault๋Š” ๋ณต์ œ ๋ฐ ํ‘œ์‹œ๋ฅผ ๊ตฌํ˜„ํ•ฉ๋‹ˆ๋‹ค.
  • ์•ˆ์ •ํ™”๋œ ๋ฉ”์†Œ๋“œ๋ฅผ ํฌํ•จํ•˜์—ฌ API์˜ ์ƒˆ๋กœ์šด ๋ถ€๋ถ„์ด ์•ˆ์ • ์นดํ…Œ๊ณ ๋ฆฌ๋กœ ์ด์ „๋˜์—ˆ์Šต๋‹ˆ๋‹ค.
    • <*const T>::cast, <*mut T>::cast,
    • ๊ธฐ๊ฐ„::as_secs_f{32|64},
    • ๊ธฐ๊ฐ„::div_duration_f{32|64},
    • ๊ธฐ๊ฐ„::div_f{32|64},
    • ๊ธฐ๊ฐ„::from_secs_f{32|64},
    • ๊ธฐ๊ฐ„::mul_f{32|64},
    • ๋‚˜๋จธ์ง€๊ฐ€ ์žˆ๋Š” ๋‚˜๋ˆ—์…ˆ ์—ฐ์‚ฐ
      ๋ชจ๋“  ์ •์ˆ˜ ํ”„๋ฆฌ๋ฏธํ‹ฐ๋ธŒ์— ๋Œ€ํ•œ div_euclid ๋ฐ rem_euclid;

  • ํ™”๋ฌผ ํŒจํ‚ค์ง€ ๊ด€๋ฆฌ์ž์—์„œ ๋‹ค์–‘ํ•œ ๊ธฐ๋Šฅ์„ ํ™œ์„ฑํ™”ํ•˜๊ธฐ ์œ„ํ•ด "--features" ์˜ต์…˜์„ ์—ฌ๋Ÿฌ ๋ฒˆ ์ง€์ •ํ•˜๋Š” ์ง€์›์ด ์ถ”๊ฐ€๋˜์—ˆ์Šต๋‹ˆ๋‹ค.
  • ์ปดํŒŒ์ผ๋Ÿฌ๋Š” ์„ธ ๋ฒˆ์งธ๋ฅผ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค. ๋ ˆ๋ฒจ ๋Œ€์ƒ ํ”Œ๋žซํผ aarch64-uwp-windows-msvc, i686-uwp-windows-gnu, i686-uwp-windows-msvc, x86_64-uwp-windows-gnu, x86_64-uwp-windows-msvc ๋Œ€์ƒ, armv7-unknown-linux ์ง€์› -gnueabi, armv7-unknown-linux-musleabi, ์œก๊ฐํ˜•-unknown-linux-musl ๋ฐ riscv32i-unknown-none-elf. ์„ธ ๋ฒˆ์งธ ์ˆ˜์ค€์—๋Š” ๊ธฐ๋ณธ ์ง€์›์ด ํฌํ•จ๋˜์ง€๋งŒ ์ž๋™ํ™”๋œ ํ…Œ์ŠคํŠธ ๋ฐ ๊ณต์‹ ๋นŒ๋“œ ๊ฒŒ์‹œ๋Š” ํฌํ•จ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

์ถœ์ฒ˜ : opennet.ru

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