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

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

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

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

  • ์•ˆ์ •๋œ "async" ํ•จ์ˆ˜, async move { ... } ๋ธ”๋ก ๋ฐ ".await" ์—ฐ์‚ฐ์ž๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ํ•˜๋Š” ์ƒˆ๋กœ์šด ๋น„๋™๊ธฐ ํ”„๋กœ๊ทธ๋ž˜๋ฐ ๊ตฌ๋ฌธ์„ ์‚ฌ์šฉํ•˜๋ฉด ๊ธฐ๋ณธ ๋ช…๋ น ํ๋ฆ„์„ ์ฐจ๋‹จํ•˜์ง€ ์•Š๋Š” ํ•ธ๋“ค๋Ÿฌ๋ฅผ ๋” ์‰ฝ๊ฒŒ ์ž‘์„ฑํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด์ „์— ์ œ๊ณต๋œ ๋น„๋™๊ธฐ I/O์šฉ API์— ๋น„ํ•ด async/.await ๊ตฌ๋ฌธ์€ ์ดํ•ดํ•˜๊ธฐ ์‰ฝ๊ณ  ์ฝ๊ธฐ ์‰ฌ์šฐ๋ฉฐ ๋ฃจํ”„, ์กฐ๊ฑด๋ฌธ ๋ฐ ์˜ˆ์™ธ๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ํ•˜๋Š” ์นœ์ˆ™ํ•œ ํ๋ฆ„ ์ œ์–ด ๊ธฐ์ˆ ์„ ์‚ฌ์šฉํ•˜์—ฌ ๋ณต์žกํ•œ ๋น„๋™๊ธฐ ์ƒํ˜ธ ์ž‘์šฉ์„ ๊ตฌํ˜„ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

    Async-await ๊ตฌ๋ฌธ์„ ์‚ฌ์šฉํ•˜๋ฉด ์‹คํ–‰์„ ์ผ์‹œ ์ค‘์ง€ํ•˜๊ณ  ์ œ์–ด๊ถŒ์„ ๋ฉ”์ธ ์Šค๋ ˆ๋“œ๋กœ ๋ฐ˜ํ™˜ํ•œ ๋‹ค์Œ ์ค‘๋‹จ๋œ ๋ถ€๋ถ„๋ถ€ํ„ฐ ์‹คํ–‰์„ ์žฌ๊ฐœํ•  ์ˆ˜ ์žˆ๋Š” ํ•จ์ˆ˜๋ฅผ ๋งŒ๋“ค ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด I/O๋ฅผ ์ฒ˜๋ฆฌํ•  ๋•Œ ์ด๋Ÿฌํ•œ ์ผ์‹œ ์ค‘์ง€๊ฐ€ ํ•„์š”ํ•˜๋ฉฐ, ๋‹ค์Œ ๋ฐ์ดํ„ฐ ์กฐ๊ฐ์ด ๋„์ฐฉํ•  ๋•Œ๊นŒ์ง€ ๊ธฐ๋‹ค๋ฆฌ๋Š” ๋™์•ˆ ๋‹ค๋ฅธ ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. "async fn" ๋ฐ "async move"๋กœ ์ •์˜๋œ ํ•จ์ˆ˜ ๋ฐ ๋ธ”๋ก์€ ํŠน์„ฑ์„ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค. ๋ฏธ๋ž˜, ์ง€์—ฐ๋œ ๋น„๋™๊ธฐ ๊ณ„์‚ฐ ํ‘œํ˜„์„ ์ •์˜ํ•ฉ๋‹ˆ๋‹ค. ์ง€์—ฐ๋œ ๊ณ„์‚ฐ์„ ์ง์ ‘ ์‹œ์ž‘ํ•˜๊ณ  ".await" ์—ฐ์‚ฐ์ž๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๊ฒฐ๊ณผ๋ฅผ ์–ป์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. .await๊ฐ€ ํ˜ธ์ถœ๋  ๋•Œ๊นŒ์ง€ ์–ด๋–ค ์ž‘์—…๋„ ์ˆ˜ํ–‰๋˜๊ฑฐ๋‚˜ ์‚ฌ์ „ ๊ณ„ํš๋˜์ง€ ์•Š์œผ๋ฏ€๋กœ ์ถ”๊ฐ€ ์˜ค๋ฒ„ํ—ค๋“œ ์—†์ด ๋ณต์žกํ•œ ์ค‘์ฒฉ ๊ตฌ์„ฑ์„ ์ƒ์„ฑํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

    ๋น„๋™๊ธฐ fn first_function() -> u32 { .. }
    ...
    future = first_function();
    ...
    ๊ฒฐ๊ณผ๋ฅผ ๋ณด์ž: u32 = future.await;

  • ์•ˆ์ •๋œ "#![feature(bind_by_move_pattern_guards)]", ๋ฐ”์ธ๋”ฉ ์œ ํ˜•์˜ ๋ณ€์ˆ˜ ์‚ฌ์šฉ ํ—ˆ์šฉ "์ด๋™"๋ฅผ ํ…œํ”Œ๋ฆฟ์— ํฌํ•จํ•˜๊ณ  ํ‘œํ˜„์‹์˜ "if" ์„น์…˜์—์„œ ์ด๋Ÿฌํ•œ ๋ณ€์ˆ˜์— ๋Œ€ํ•œ ์ฐธ์กฐ๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.์ผ์น˜". ์˜ˆ๋ฅผ ๋“ค์–ด ์ด์ œ ๋‹ค์Œ ๊ตฌ์„ฑ์ด ํ—ˆ์šฉ๋ฉ๋‹ˆ๋‹ค.

    fn ๋ฉ”์ธ() {
    ๋ฐฐ์—ดํ•˜์ž: Box<[u8; 4]> = Box::new([1, 2, 3, 4]);

    ์ผ์น˜ ๋ฐฐ์—ด {
    nums
    if nums.iter().sum::() == 10

    => {
    ๋“œ๋กญ(์ˆซ์ž);
    }
    _ => ์—ฐ๊ฒฐํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค!(),
    }
    }

  • ํ‘œ์‹œ ํ—ˆ์šฉ ์†์„ฑ ํ•จ์ˆ˜ ๋งค๊ฐœ๋ณ€์ˆ˜, ํด๋กœ์ €, ํ•จ์ˆ˜ ํฌ์ธํ„ฐ๋ฅผ ์ •์˜ํ•  ๋•Œ. Lint(ํ—ˆ์šฉ, ๊ฒฝ๊ณ , ๊ฑฐ๋ถ€ ๋ฐ ๊ธˆ์ง€)๋ฅผ ํ†ตํ•ด ์ง„๋‹จ์„ ์ œ์–ดํ•˜๋Š” โ€‹โ€‹์กฐ๊ฑด๋ถ€ ์ปดํŒŒ์ผ ์†์„ฑ(cfg, cfg_attr)๊ณผ ๋ณด์กฐ ๋งคํฌ๋กœ ํ˜ธ์ถœ ์†์„ฑ์ด ์ง€์›๋ฉ๋‹ˆ๋‹ค.

    fn ๋ Œ(
    #[cfg(windows)] Slice: &[u16], // Windows์—์„œ๋Š” ๋งค๊ฐœ๋ณ€์ˆ˜๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.
    #[cfg(not(windows))] Slice: &[u8], // ๋‹ค๋ฅธ OS์—์„œ ์‚ฌ์šฉ
    ) -> ์‚ฌ์šฉ {
    ์Šฌ๋ผ์ด์Šค.len()
    }

  • NLL(Non-Lexical Lifetimes) ๊ธฐ๋ฒ•์„ ์ด์šฉํ•œ ๋ณ€์ˆ˜ ์ฐจ์šฉ(borrow checker) ๊ฒ€์‚ฌ ์‹œ ํ™•์ธ๋œ ๋ฌธ์ œ์ ์— ๋Œ€ํ•œ ๊ฒฝ๊ณ , ๋ฒˆ์—ญ ์น˜๋ช…์ ์ธ ์˜ค๋ฅ˜์˜ ๋ฒ”์ฃผ์— ์†ํ•ฉ๋‹ˆ๋‹ค. ๋นŒ๋ฆฐ ๋ณ€์ˆ˜์˜ ์ˆ˜๋ช…์„ ๊ณ ๋ คํ•˜๋Š” ์ƒˆ๋กœ์šด ๋ฉ”์ปค๋‹ˆ์ฆ˜์„ ๊ธฐ๋ฐ˜์œผ๋กœ ํ•œ ๊ฒ€์ฆ ์‹œ์Šคํ…œ์„ ํ†ตํ•ด ์ด์ „ ๊ฒ€์ฆ ์ฝ”๋“œ์—์„œ๋Š” ๋ฐœ๊ฒฌํ•  ์ˆ˜ ์—†์—ˆ๋˜ ๋ช‡ ๊ฐ€์ง€ ๋ฌธ์ œ๋ฅผ ์‹๋ณ„ํ•  ์ˆ˜ ์žˆ๊ฒŒ ๋˜์—ˆ๋‹ค๋Š” ์ ์„ ์ƒ๊ธฐํ•ด ๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค. ์ด๋Ÿฌํ•œ ๊ฒ€์‚ฌ์— ๋Œ€ํ•œ ์˜ค๋ฅ˜ ์ถœ๋ ฅ์€ ์ด์ „์— ์ž‘๋™ํ–ˆ๋˜ ์ฝ”๋“œ์™€์˜ ํ˜ธํ™˜์„ฑ์— ์˜ํ–ฅ์„ ๋ฏธ์น  ์ˆ˜ ์žˆ์œผ๋ฏ€๋กœ ์ฒ˜์Œ์—๋Š” ์˜ค๋ฅ˜ ๋Œ€์‹  ๊ฒฝ๊ณ ๊ฐ€ ๋ฐœํ–‰๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ์ด์ œ Rust 2018 ๋ชจ๋“œ์—์„œ ์‹คํ–‰ํ•  ๋•Œ ๊ฒฝ๊ณ ๊ฐ€ ์˜ค๋ฅ˜๋กœ ๋Œ€์ฒด๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ๋‹ค์Œ ๋ฆด๋ฆฌ์Šค์—์„œ๋Š” ์˜ค๋ฅ˜ ์ถœ๋ ฅ์ด Rust 2015 ๋ชจ๋“œ์—์„œ๋„ ๊ตฌํ˜„๋˜์–ด ๋งˆ์นจ๋‚ด ์˜ค๋ž˜๋œ ๋นŒ๋ฆผ ๊ฒ€์‚ฌ๊ธฐ๊ฐ€ ์ œ๊ฑฐ๋  ๊ฒƒ์ž…๋‹ˆ๋‹ค.
  • ์ƒ์ˆ˜ ๋Œ€์‹  ๋ชจ๋“  ์ปจํ…์ŠคํŠธ์—์„œ ์‚ฌ์šฉํ•  ๊ฐ€๋Šฅ์„ฑ์„ ๊ฒฐ์ •ํ•˜๋Š” "const" ์†์„ฑ์€ Vec::new, String::new, LinkedList::new, str::len, [T]::len ํ•จ์ˆ˜์— ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค. , str::as_bytes,
    ABS, Wrapping_abs ๋ฐ Overflowing_abs;

  • ์•ˆ์ •ํ™”๋œ ๋ฉ”์†Œ๋“œ๋ฅผ ํฌํ•จํ•˜์—ฌ API์˜ ์ƒˆ๋กœ์šด ๋ถ€๋ถ„์ด ์•ˆ์ • ์นดํ…Œ๊ณ ๋ฆฌ๋กœ ์ด์ „๋˜์—ˆ์Šต๋‹ˆ๋‹ค.
    Pin::into_inner, Instant::checked_duration_since ๋ฐ Instant::saturating_duration_since;

  • ์ด์ œ ํ™”๋ฌผ ํŒจํ‚ค์ง€ ๊ด€๋ฆฌ์ž๋Š” ๊ตฌ์„ฑ ํŒŒ์ผ์— ".toml" ํ™•์žฅ์ž๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. Cargo์—์„œ ์ง์ ‘ ํ‘œ์ค€ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ๊ตฌ์ถ•ํ•˜๊ธฐ ์œ„ํ•œ ์˜ˆ๋น„ ์ง€์›์ด ์ถ”๊ฐ€๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ๋…ผ์Ÿ์˜ ์—ฌ์ง€๊ฐ€ ์žˆ๋Š” "--all" ํ”Œ๋ž˜๊ทธ๋ฅผ ๋Œ€์ฒดํ•˜์—ฌ "--workspace" ํ”Œ๋ž˜๊ทธ๋ฅผ ์ถ”๊ฐ€ํ–ˆ์Šต๋‹ˆ๋‹ค. ๋ฉ”ํƒ€๋ฐ์ดํ„ฐ์— ์ƒˆ ํ•„๋“œ๊ฐ€ ์ถ”๊ฐ€๋˜์—ˆ์Šต๋‹ˆ๋‹ค.๊ฒŒ์‹œ"๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด git ํƒœ๊ทธ์™€ ๋ฒ„์ „ ๋ฒˆํ˜ธ๋ฅผ ์ง€์ •ํ•˜์—ฌ ์ข…์†์„ฑ์„ ๊ฒŒ์‹œํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋‹ค์–‘ํ•œ ์ปดํŒŒ์ผ ๋‹จ๊ณ„์˜ ์‹คํ–‰ ์‹œ๊ฐ„์— ๋Œ€ํ•œ HTML ๋ณด๊ณ ์„œ๋ฅผ ์ƒ์„ฑํ•˜๊ธฐ ์œ„ํ•ด ํ…Œ์ŠคํŠธ ์˜ต์…˜ "-Ztimings"๋ฅผ ์ถ”๊ฐ€ํ–ˆ์Šต๋‹ˆ๋‹ค.
  • Rustc ์ปดํŒŒ์ผ๋Ÿฌ์—์„œ ์ง„๋‹จ ๋ฉ”์‹œ์ง€์—๋Š” ํ„ฐ๋ฏธ๋„์— ๋งž์ง€ ์•Š๋Š” ์ฝ”๋“œ ๊ผฌ๋ฆฌ๋ฅผ ์ž๋ฅด๋Š” ๊ฒƒ์ด ํฌํ•จ๋ฉ๋‹ˆ๋‹ค. ๋Œ€์ƒ ํ”Œ๋žซํผ์— ๋Œ€ํ•œ ์„ธ ๋ฒˆ์งธ ์ˆ˜์ค€์˜ ์ง€์› ์ œ๊ณต
    i686-unknown-uefi ๋ฐ sparc64-unknown-openbsd. ์„ธ ๋ฒˆ์งธ ์ˆ˜์ค€์—๋Š” ๊ธฐ๋ณธ ์ง€์›์ด ํฌํ•จ๋˜์ง€๋งŒ ์ž๋™ํ™”๋œ ํ…Œ์ŠคํŠธ ๋ฐ ๊ณต์‹ ๋นŒ๋“œ ๊ฒŒ์‹œ๋Š” ํฌํ•จ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

์ถœ์ฒ˜ : opennet.ru

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