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

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

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

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

  • " ์†์„ฑ์„ ์‚ฌ์šฉํ•˜์—ฌ ๊ตฌ์กฐ(struct) ๋ฐ ์—ด๊ฑฐํ˜•(Variant ๋ธ”๋ก์ด ์žˆ๋Š” enum)์„ ํ‘œ์‹œํ•˜๋Š” ๊ธฐ๋Šฅ์ด ์ถ”๊ฐ€๋˜์—ˆ์Šต๋‹ˆ๋‹ค.#[๋น„์ „์ œ์ ]", ์–ด๋А ๊ทธ๊ฒƒ์€ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค ์„ ์–ธ๋œ ๊ตฌ์กฐ์ฒด์™€ ์—ด๊ฑฐํ˜•์— ํ–ฅํ›„ ์ƒˆ๋กœ์šด ํ•„๋“œ์™€ ๋ณ€ํ˜•์„ ์ถ”๊ฐ€ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด, ๊ณต๊ฐœ์ ์œผ๋กœ ์„ ์–ธ๋œ ํ•„๋“œ๊ฐ€ ์žˆ๋Š” ๊ตฌ์กฐ์ฒด๋ฅผ ๊ฐ€์ง„ ๋ชจ๋“ˆ ๊ฐœ๋ฐœ์ž๋Š” "#[non_exhaustive]"๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ํ–ฅํ›„ ์ƒˆ๋กœ์šด ํ•„๋“œ๊ฐ€ ์ถ”๊ฐ€๋  ์ˆ˜ ์žˆ๋Š” ๊ตฌ์กฐ์ฒด๋ฅผ ํ‘œ์‹œํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ง€๊ธˆ๊นŒ์ง€๋Š” ์ด๋Ÿฌํ•œ ์ƒํ™ฉ์—์„œ ๊ฐœ๋ฐœ์ž๋Š” ํ•„๋“œ๋ฅผ ๋น„๊ณต๊ฐœ๋กœ ์„ ์–ธํ• ์ง€, ์•„๋‹ˆ๋ฉด ๋ณ€๊ฒฝ ๋ถˆ๊ฐ€๋Šฅํ•œ ํ•„๋“œ ๋ชฉ๋ก์— ๋ฐ”์ธ๋”ฉํ• ์ง€ ์„ ํƒํ•ด์•ผ ํ–ˆ์Šต๋‹ˆ๋‹ค. ์ƒˆ๋กœ์šด ์†์„ฑ์€ ์ด๋Ÿฌํ•œ ์ œํ•œ์„ ์ œ๊ฑฐํ•˜๊ณ  ์ด์ „์— ์ปดํŒŒ์ผ๋œ ์™ธ๋ถ€ ์ฝ”๋“œ๋ฅผ ์†์ƒ์‹œํ‚ฌ ์œ„ํ—˜ ์—†์ด ํ–ฅํ›„ ์ƒˆ๋กœ์šด ํ•„๋“œ๋ฅผ ์ถ”๊ฐ€ํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•ฉ๋‹ˆ๋‹ค. ํฌ๋ ˆ์ดํŠธ ํŒจํ‚ค์ง€์—์„œ "match" ์„น์…˜์˜ ๋ณ€ํ˜•์„ ๋น„๊ตํ•  ๋•Œ, ํ–ฅํ›„ ์ถ”๊ฐ€๋  ์ˆ˜ ์žˆ๋Š” ํ•„๋“œ๋ฅผ ํฌํ•จํ•˜๊ธฐ ์œ„ํ•ด "_ => {...}" ๋งˆ์Šคํฌ๋ฅผ ๋ช…์‹œ์ ์œผ๋กœ ์ •์˜ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋ ‡์ง€ ์•Š์œผ๋ฉด ์ƒˆ ํ•„๋“œ๋ฅผ ์ถ”๊ฐ€ํ•  ๋•Œ ์˜ค๋ฅ˜๊ฐ€ ํ‘œ์‹œ๋ฉ๋‹ˆ๋‹ค.
  • ์ถ”๊ฐ€๋จ mac!() ์ ˆ์ฐจ์  ๋งคํฌ๋กœ๋ฅผ ํƒ€์ž… ์ปจํ…์ŠคํŠธ์—์„œ ํ˜ธ์ถœํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด, "expand_to_type"์ด ์ ˆ์ฐจ์  ๋งคํฌ๋กœ์ธ ๊ฒฝ์šฐ ์ด์ œ "type Foo = expand_to_type!(bar);"๋ผ๊ณ  ์ž‘์„ฑํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  • "extern { โ€ฆ }" ๋ธ”๋ก์—์„œ ์ถ”๊ฐ€ "bang!()" ๋งคํฌ๋กœ๋ฅผ ํฌํ•จํ•œ ์ ˆ์ฐจ์  ๋ฐ ์†์„ฑ ๋งคํฌ๋กœ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ธฐ๋Šฅ(์˜ˆ:

    ๋งคํฌ๋กœ_๊ทœ์น™!ํ•ญ๋ชฉ ๋งŒ๋“ค๊ธฐ { ($name:ident) => { fn $name(); } }

    ์™ธ๋ถ€ {
    make_item!(์•ŒํŒŒ);
    make_item!(๋ฒ ํƒ€);
    }

    ์™ธ๋ถ€ "C" {
    #[๋‚ด_์•„์ด๋ดํ‹ฐํ‹ฐ_๋งคํฌ๋กœ] fn foo();
    }

  • ๋งคํฌ๋กœ์—์„œ ๊ตฌํ˜„ "macro_rules!" ์š”์†Œ๋ฅผ ์ƒ์„ฑํ•˜๋Š” ๊ธฐ๋Šฅ์ž…๋‹ˆ๋‹ค. "macro_rules!" ์ƒ์„ฑ์€ ํ•จ์ˆ˜ํ˜• ๋งคํฌ๋กœ("mac!()")์™€ ์†์„ฑํ˜• ๋งคํฌ๋กœ( "#[mac]") ๋ชจ๋‘์—์„œ ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค.
  • $m:meta ๋งคํ•‘ ์š”์†Œ์—์„œ ์ถ”๊ฐ€ ์ž„์˜์˜ ํ† ํฐ ์—ด๊ฑฐํ˜• ๊ฐ’('[TOKEN_STREAM]', '{TOKEN_STREAM}' ๋ฐ '(TOKEN_STREAM)')์— ๋Œ€ํ•œ ์ง€์›, ์˜ˆ:

    ๋งคํฌ๋กœ_๊ทœ์น™! ๋ฉ”ํƒ€_์ˆ˜๋ฝ { ($m:meta) => {} }
    ๋ฉ”ํƒ€๋ฅผ ์ˆ˜๋ฝํ•˜์„ธ์š”!(my::path);
    ๋ฉ”ํƒ€ ์ˆ˜๋ฝ!(my::path = "lit" );
    ๋ฉ”ํƒ€ ์ˆ˜๋ฝ!(my::path(abc));
    ๋ฉ”ํƒ€ ์ˆ˜๋ฝ!(my::path[abc]);
    ๋ฉ”ํƒ€ ์ˆ˜๋ฝ!(my::path {abc});

  • Rust 2015 ๋ชจ๋“œ์—์„œ๋Š” NLL(๋น„์–ดํœ˜์  ์ˆ˜๋ช…) ๊ธฐ๋ฒ•์„ ์‚ฌ์šฉํ•˜์—ฌ ๋นŒ๋ฆผ ๊ฒ€์‚ฌ๊ธฐ์—์„œ ๊ฐ์ง€๋œ ๋ฌธ์ œ์— ๋Œ€ํ•œ ์˜ค๋ฅ˜ ์ถœ๋ ฅ์ด ํ™œ์„ฑํ™”๋ฉ๋‹ˆ๋‹ค. ์ด์ „์—๋Š” Rust 2018 ๋ชจ๋“œ์—์„œ ์‹คํ–‰ํ•  ๋•Œ ๊ฒฝ๊ณ ๊ฐ€ ์˜ค๋ฅ˜๋กœ ๋Œ€์ฒด๋˜์—ˆ์Šต๋‹ˆ๋‹ค.
    ๋ณ€๊ฒฝ ์‚ฌํ•ญ์ด Rust 2015 ๋ชจ๋“œ๋กœ ํ™•์žฅ๋œ ํ›„ ๊ฐœ๋ฐœ์ž๋Š” ๋งˆ์นจ๋‚ด ๋‹ค์Œ์„ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค. ํƒˆ์ถœ ์˜ค๋ž˜๋œ ๋Œ€์ถœ ๊ฒ€์‚ฌ๊ธฐ์—์„œ.

    ๋นŒ๋ฆฐ ๋ณ€์ˆ˜์˜ ์ˆ˜๋ช…์„ ๊ณ„์‚ฐํ•˜๋Š” ์ƒˆ๋กœ์šด ๋ฉ”์ปค๋‹ˆ์ฆ˜์„ ๊ธฐ๋ฐ˜์œผ๋กœ ํ•œ ๊ฒ€์ฆ ์‹œ์Šคํ…œ์€ ๊ธฐ์กด ๊ฒ€์ฆ ์ฝ”๋“œ์—์„œ๋Š” ๋ฐœ๊ฒฌ๋˜์ง€ ์•Š์•˜๋˜ ๋ช‡ ๊ฐ€์ง€ ๋ฌธ์ œ์ ์„ ํŒŒ์•…ํ•  ์ˆ˜ ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค. ์ด๋Ÿฌํ•œ ๊ฒ€์ฆ ๊ณผ์ •์—์„œ ๋ฐœ์ƒํ•˜๋Š” ์˜ค๋ฅ˜๋Š” ๊ธฐ์กด ์ฝ”๋“œ์™€์˜ ํ˜ธํ™˜์„ฑ์— ์˜ํ–ฅ์„ ๋ฏธ์น  ์ˆ˜ ์žˆ์œผ๋ฏ€๋กœ, ์ฒ˜์Œ์—๋Š” ์˜ค๋ฅ˜ ๋Œ€์‹  ๊ฒฝ๊ณ ๊ฐ€ ํ‘œ์‹œ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

  • ์ƒ์ˆ˜ ๋Œ€์‹  ๋ชจ๋“  ์ปจํ…์ŠคํŠธ์—์„œ ์‚ฌ์šฉ ๊ฐ€๋Šฅ์„ฑ์„ ๊ฒฐ์ •ํ•˜๋Š” "const" ํ”Œ๋ž˜๊ทธ๋Š” is_power_of_two ํ•จ์ˆ˜(๋ถ€ํ˜ธ ์—†๋Š” ์ •์ˆ˜์˜ ๊ฒฝ์šฐ)์— ์ ์šฉ๋ฉ๋‹ˆ๋‹ค.
  • API์˜ ์ƒˆ๋กœ์šด ๋ถ€๋ถ„์ด ์•ˆ์ •์ ์ธ ์นดํ…Œ๊ณ ๋ฆฌ๋กœ ์ด๋™๋˜์—ˆ์œผ๋ฉฐ, ์—ฌ๊ธฐ์—๋Š” ์•ˆ์ •ํ™”๋œ todo!() ๋งคํฌ๋กœ์™€ slice::repeat, mem::take, BTreeMap::get_key_value, HashMap::get_key_value ๋ฉ”์„œ๋“œ๊ฐ€ ํฌํ•จ๋ฉ๋‹ˆ๋‹ค.
    ์˜ต์…˜::as_deref, ์˜ต์…˜::as_deref_mut, ์˜ต์…˜::flatten, UdpSocket::peer_addr, {f32,f64}::to_be_bytes, {f32,f64}::to_le_bytes,{f32,f64}::to_ne_bytes, {f32,f64}::from_be_bytes, {f32,f64}::from_le_bytes, ๊ทธ๋ฆฌ๊ณ  {f32,f64}::from_ne_bytes.
  • ํ™”๋ฌผ ํŒจํ‚ค์ง€ ๊ด€๋ฆฌ์ž์—์„œ
    ๊ตฌํ˜„ ์ปดํŒŒ์ผ๋Ÿฌ ๊ฒฝ๊ณ ๋ฅผ ๋””์Šคํฌ์— ์บ์‹ฑํ•ฉ๋‹ˆ๋‹ค. "cargo metadata" ๋ช…๋ น์— ์ด์ œ "โ€”ํ•„ํ„ฐ ํ”Œ๋žซํผ์ข…์†์„ฑ ํ•ด๊ฒฐ ๊ทธ๋ž˜ํ”„์—์„œ ์ง€์ •๋œ ๋Œ€์ƒ ํ”Œ๋žซํผ์— ๋ฐ”์ธ๋”ฉ๋œ ํŒจํ‚ค์ง€๋งŒ ํ‘œ์‹œํ•ฉ๋‹ˆ๋‹ค. ์œ ํšจํ•œ TLS ๋ฒ„์ „์„ ์ •์˜ํ•˜๊ธฐ ์œ„ํ•ด http.ssl-version ๊ตฌ์„ฑ ๋งค๊ฐœ๋ณ€์ˆ˜๋ฅผ ์ถ”๊ฐ€ํ–ˆ์Šต๋‹ˆ๋‹ค.
    "์„น์…˜์„ ๊ฒŒ์‹œํ•˜๋Š” ๊ธฐ๋Šฅ์ด ์ถ”๊ฐ€๋˜์—ˆ์Šต๋‹ˆ๋‹ค.๊ฐœ๋ฐœ ์ข…์†์„ฑ"๋ฒ„์ „" ํ‚ค๋ฅผ ์ง€์ •ํ•˜์ง€ ์•Š๊ณ .
  • rustc ์ปดํŒŒ์ผ๋Ÿฌ๋Š” thumbv7neon-unknown-linux-musleabihf, aarch64-unknown-none-softfloat, mips64-unknown-linux-muslabi64, mips64el-unknown-linux-muslabi64 ๋Œ€์ƒ ํ”Œ๋žซํผ์— ๋Œ€ํ•ด ๋ ˆ๋ฒจ XNUMX ์ง€์›์„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค. ๋ ˆ๋ฒจ XNUMX์€ ๊ธฐ๋ณธ์ ์ธ ์ง€์›์„ ์˜๋ฏธํ•˜์ง€๋งŒ, ์ž๋™ํ™”๋œ ํ…Œ์ŠคํŠธ๋‚˜ ๊ณต์‹ ๋นŒ๋“œ๋Š” ์ œ๊ณต๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

์ถœ์ฒ˜ : opennet.ru

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