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

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

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

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

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

    .cargo/config($HOME ๋˜๋Š” ํŒจํ‚ค์ง€ ๋””๋ ‰ํ„ฐ๋ฆฌ์— ์žˆ์Œ)์— ์™ธ๋ถ€ ๋ ˆ์ง€์ŠคํŠธ๋ฆฌ๋ฅผ ์ถ”๊ฐ€ํ•˜๋ ค๋ฉด
    ์„ ์œ„ํ•ด ์ œ๊ณต๋˜์—ˆ๋‹ค ์„น์…˜ โ€œ[registries]โ€, ์™ธ๋ถ€ ๋ ˆ์ง€์ŠคํŠธ๋ฆฌ๋ฅผ ์‚ฌ์šฉํ•˜๊ธฐ ์œ„ํ•ด Cargo.toml์˜ ๊ฐ ์ข…์†์„ฑ ์„ค๋ช…์— โ€œregistryโ€ ์˜ต์…˜์ด ํ‘œ์‹œ๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ์ถ”๊ฐ€ ๋ ˆ์ง€์ŠคํŠธ๋ฆฌ์— ์—ฐ๊ฒฐํ•˜๋ ค๋ฉด ~/.cargo/credentials ํŒŒ์ผ์— ์ธ์ฆ ํ† ํฐ์„ ๋„ฃ๊ณ  ๋‹ค์Œ ๋ช…๋ น์„ ์‹คํ–‰ํ•˜์„ธ์š”.
    "cargo login --registry=my-registry" ๋ฐ ํŒจํ‚ค์ง€ ๊ฒŒ์‹œ -
    "ํ™”๋ฌผ ๊ฒŒ์‹œ -registry=my-registry";

  • "?" ์—ฐ์‚ฐ์ž ์‚ฌ์šฉ์— ๋Œ€ํ•œ ์ „์ฒด ์ง€์›์ด ์ถ”๊ฐ€๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ํ…Œ์ŠคํŠธ ์ค‘ ๋ฌธ์„œ ํ…Œ์ŠคํŠธ, ๋ฌธ์„œ์˜ ์˜ˆ์ œ ์ฝ”๋“œ๋ฅผ ํ…Œ์ŠคํŠธ๋กœ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด์ „ ์šด์˜์ž
    "?" "fn main()" ํ•จ์ˆ˜ ๋˜๋Š” "#[test]" ํ•จ์ˆ˜๊ฐ€ ์žˆ๋Š” ๊ฒฝ์šฐ์—๋งŒ ํ…Œ์ŠคํŠธ ์‹คํ–‰ ์ค‘ ์˜ค๋ฅ˜๋ฅผ ์ฒ˜๋ฆฌํ•˜๋Š” ๋ฐ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

  • ์ ˆ์ฐจ์  ๋งคํฌ๋กœ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ •์˜๋œ ์‚ฌ์šฉ์ž ์ •์˜ ์†์„ฑ์—์„œ ์ œ๊ณต๋œ ์ž„์˜์˜ ํ† ํฐ ์„ธํŠธ("#[attr($tokens)]", "#[attr[$tokens]] ๋ฐ #[attr{$tokens}]")๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ธฐ๋Šฅ. ์ด์ „์—๋Š” ๋ฌธ์ž์—ด ๋ฆฌํ„ฐ๋Ÿด(์˜ˆ: โ€œ#[foo(bar, baz(quux, foo = โ€œbarโ€))]โ€์„ ์‚ฌ์šฉํ•˜์—ฌ ํŠธ๋ฆฌ/์žฌ๊ท€ ํ˜•์‹์œผ๋กœ๋งŒ ์š”์†Œ๋ฅผ ์ง€์ •ํ•  ์ˆ˜ ์žˆ์—ˆ์ง€๋งŒ ์ด์ œ๋Š” ์—ด๊ฑฐํ˜•(' #[range(0. .10)]') ๋ฐ "#[bound(T: MyTrait)]"์™€ ๊ฐ™์€ ๊ตฌ์„ฑ;
  • ์•ˆ์ •ํ™”๋œ ์œ ํ˜•(ํŠน์„ฑ) TryFrom ะธ TryInto, ์˜ค๋ฅ˜ ์ฒ˜๋ฆฌ๋ฅผ ํ†ตํ•ด ์œ ํ˜• ๋ณ€ํ™˜์ด ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด, ์ •์ˆ˜ ์œ ํ˜•์„ ์‚ฌ์šฉํ•˜๋Š” from_be_bytes์™€ ๊ฐ™์€ ๋ฉ”์†Œ๋“œ๋Š” ๋ฐฐ์—ด์„ ์ž…๋ ฅ์œผ๋กœ ์‚ฌ์šฉํ•˜์ง€๋งŒ ๋ฐ์ดํ„ฐ๋Š” ์ข…์ข… Slice ์œ ํ˜•์œผ๋กœ ์ œ๊ณต๋˜๋ฉฐ ๋ฐฐ์—ด๊ณผ ์Šฌ๋ผ์ด์Šค ๊ฐ„ ๋ณ€ํ™˜์€ ์ˆ˜๋™์œผ๋กœ ์ˆ˜ํ–‰ํ•˜๊ธฐ๊ฐ€ ์–ด๋ ต์Šต๋‹ˆ๋‹ค. ์ƒˆ๋กœ์šด ํŠน์„ฑ์˜ ๋„์›€์œผ๋กœ ์ง€์ •๋œ ์ž‘์—…์€ .try_into() ํ˜ธ์ถœ์„ ํ†ตํ•ด ์ฆ‰์‹œ ์ˆ˜ํ–‰๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค(์˜ˆ: "let num = u32::from_be_bytes(slice.try_into()?)"). ํ•ญ์ƒ ์„ฑ๊ณตํ•˜๋Š” ๋ณ€ํ™˜(์˜ˆ: u8 ์œ ํ˜•์—์„œ u32 ์œ ํ˜•์œผ๋กœ)์˜ ๊ฒฝ์šฐ ์˜ค๋ฅ˜ ์œ ํ˜•์ด ์ถ”๊ฐ€๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ์™„๋ฒฝํ•œ, ํˆฌ๋ช…ํ•œ ์‚ฌ์šฉ ๊ฐ€๋Šฅ
    "From"์˜ ๋ชจ๋“  ๊ธฐ์กด ๊ตฌํ˜„์— ๋Œ€ํ•ด TryFrom;

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

  • 8~64๋น„ํŠธ ํฌ๊ธฐ ๋ฒ”์œ„์˜ ์•ˆ์ •ํ™”๋œ ๋ถ€ํ˜ธ ์žˆ๋Š” ๋ฐ ๋ถ€ํ˜ธ ์—†๋Š” ์›์ž ์ •์ˆ˜ ์œ ํ˜•(์˜ˆ: AtomicU8) ๋ฐ ์„œ๋ช…๋œ ์œ ํ˜• NonZeroI[8|16|32|64|128].
  • Any::type_id, Error::type_id, Slice::sort_by_cached_key, str::escape_*, str::split_ascii_whitespace, Instant::checked_[add|sub๋ฅผ ํฌํ•จํ•˜์—ฌ API์˜ ์ƒˆ๋กœ์šด ๋ถ€๋ถ„์ด ์•ˆ์ •์ ์ธ ๋ฒ”์ฃผ๋กœ ์ด๋™๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ] ๋ฐ SystemTime ๋ฉ”์†Œ๋“œ๊ฐ€ ์•ˆ์ •ํ™”๋˜์—ˆ์Šต๋‹ˆ๋‹ค:::checked_[add|sub]. iter::from_fn ๋ฐ iter::successors ํ•จ์ˆ˜๊ฐ€ ์•ˆ์ •ํ™”๋˜์—ˆ์Šต๋‹ˆ๋‹ค.
  • ๋ชจ๋“  ์ •์ˆ˜ ์œ ํ˜•์— ๋Œ€ํ•ดchecked_pow, saturating_pow, Wrapping_pow ๋ฐ Overflowing_pow ๋ฉ”์†Œ๋“œ๊ฐ€ ๊ตฌํ˜„๋ฉ๋‹ˆ๋‹ค.
  • "-C linker-plugin-lto" ๋นŒ๋“œ ์˜ต์…˜์„ ์ง€์ •ํ•˜์—ฌ ์—ฐ๊ฒฐ ๋‹จ๊ณ„์—์„œ ์ตœ์ ํ™”๋ฅผ ํ™œ์„ฑํ™”ํ•˜๋Š” ๊ธฐ๋Šฅ์„ ์ถ”๊ฐ€ํ–ˆ์Šต๋‹ˆ๋‹ค.

์ถœ์ฒ˜ : opennet.ru

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