Mozilla ํ๋ก์ ํธ์์ ๊ฐ๋ฐํ ์์คํ ํ๋ก๊ทธ๋๋ฐ ์ธ์ด Rust 1.34๊ฐ ์ถ์๋์์ต๋๋ค. ์ด ์ธ์ด๋ ๋ฉ๋ชจ๋ฆฌ ์์ ์ ์ค์ ์ ๋๊ณ ์๋ ๋ฉ๋ชจ๋ฆฌ ๊ด๋ฆฌ๋ฅผ ์ ๊ณตํ๋ฉฐ ๊ฐ๋น์ง ์์ง๊ธฐ๋ ๋ฐํ์์ ์ฌ์ฉํ์ง ์๊ณ ๋ ๋์ ์์ ๋ณ๋ ฌ์ฑ์ ๋ฌ์ฑํ ์ ์๋ ์๋จ์ ์ ๊ณตํฉ๋๋ค.
Rust์ ์๋ ๋ฉ๋ชจ๋ฆฌ ๊ด๋ฆฌ๋ ๊ฐ๋ฐ์๊ฐ ํฌ์ธํฐ ์กฐ์์ผ๋ก๋ถํฐ ํด๋ฐฉ๋๊ณ , After-Free ๋ฉ๋ชจ๋ฆฌ ์ก์ธ์ค, ๋ ํฌ์ธํฐ ์ญ์ฐธ์กฐ, ๋ฒํผ ์ค๋ฒ๋ฐ ๋ฑ๊ณผ ๊ฐ์ ๋ฎ์ ์์ค์ ๋ฉ๋ชจ๋ฆฌ ์กฐ์์ผ๋ก ์ธํด ๋ฐ์ํ๋ ๋ฌธ์ ๋ก๋ถํฐ ๋ณดํธํฉ๋๋ค. ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ๋ฐฐํฌํ๊ณ ์ด์ ๋ธ๋ฆฌ๋ฅผ ๋ณด์ฅํ๋ฉฐ ์ข ์์ฑ์ ๊ด๋ฆฌํ๊ธฐ ์ํด ํ๋ก์ ํธ๋ ํ ๋ฒ์ ํด๋ฆญ์ผ๋ก ํ๋ก๊ทธ๋จ์ ํ์ํ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์ป์ ์ ์๋ Cargo ํจํค์ง ๊ด๋ฆฌ์๋ฅผ ๊ฐ๋ฐํ๊ณ ์์ต๋๋ค. crates.io ์ ์ฅ์๋ ๋ผ์ด๋ธ๋ฌ๋ฆฌ ํธ์คํ ์ ์ํด ์ง์๋ฉ๋๋ค.
์ฃผ์ ํ์ :
- Cargo ํจํค์ง ๊ด๋ฆฌ์๋ crates.io ๊ณต๊ฐ ๋ ์ง์คํธ๋ฆฌ์ ๊ณต์กดํ ์ ์๋ ๋์ฒด ํจํค์ง ๋ ์ง์คํธ๋ฆฌ์ ์์
ํ ์ ์๋ ๋๊ตฌ๋ฅผ ์ถ๊ฐํ์ต๋๋ค. ์๋ฅผ ๋ค์ด, ๋
์ ์ ํ๋ฆฌ์ผ์ด์
๊ฐ๋ฐ์๋ ์ด์ Cargo.toml์ ์ข
์์ฑ์ ๋์ดํ ๋ ์ฌ์ฉํ ์ ์๋ ์์ฒด ๊ฐ์ธ ๋ ์ง์คํธ๋ฆฌ๋ฅผ ์ฌ์ฉํ ์ ์๊ณ , ์ ํ์ ๋ํด crates.io์ ์ ์ฌํ ๋ฒ์ ๊ด๋ฆฌ ๋ชจ๋ธ์ ์ ์ฉํ ์ ์์ ๋ฟ๋ง ์๋๋ผ ๋ ํฌ๋ ์ดํธ์ ๋ํ ์ข
์์ฑ์ ์ฐธ์กฐํ ์ ์์ต๋๋ค. io ๋ฐ ์์ ์ ๋ ์ง์คํธ๋ฆฌ์.
~/.cargo/config์ ์ธ๋ถ ๋ ์ง์คํธ๋ฆฌ๋ฅผ ์ถ๊ฐํ๋ ค๋ฉด
์๋ก์ด ์ต์ "my-registry"๊ฐ "[registries]" ์น์ ์ ์ ๊ณต๋๊ณ "other-crate" ์ต์ ์ด ์ถ๊ฐ๋์ด "[dependents]" ์น์ ์ Cargo.toml ์ข ์์ฑ์ ์๋ ์ธ๋ถ ๋ ์ง์คํธ๋ฆฌ๋ฅผ ์ธ๊ธํ ์ ์์ต๋๋ค. ์ถ๊ฐ ๋ ์ง์คํธ๋ฆฌ์ ์ฐ๊ฒฐํ๋ ค๋ฉด ~/.cargo/credentials ํ์ผ์ ์ธ์ฆ ํ ํฐ์ ๋ฃ๊ณ ๋ค์ ๋ช ๋ น์ ์คํํ์ธ์.
"cargo login --registry=my-registry" ๋ฐ ํจํค์ง ๊ฒ์ -
"ํ๋ฌผ ๊ฒ์ -registry=my-registry"; - "?" ์ฐ์ฐ์ ์ฌ์ฉ์ ๋ํ ์ ์ฒด ์ง์์ด ์ถ๊ฐ๋์์ต๋๋ค. doctest์์๋ ๋ฌธ์์ ์์ ์ฝ๋๋ฅผ ํ
์คํธ๋ก ์ฌ์ฉํ ์ ์์ต๋๋ค. ์ด์ ์ด์์
"?" "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 ์ ํ์ผ๋ก)์ ๊ฒฝ์ฐ Infallible ์ค๋ฅ ์ ํ์ด ์ถ๊ฐ๋์ด ๋ค์์ ํฌ๋ช
ํ๊ฒ ์ฌ์ฉํ ์ ์์ต๋๋ค.
"From"์ ๋ชจ๋ ๊ธฐ์กด ๊ตฌํ์ ๋ํด TryFrom; - fork() ํธ์ถ ํ ๋ถ๊ธฐ๋ ํ์ ํ๋ก์ธ์ค์ ์ปจํ
์คํธ์์ ์คํ๋ exec ์ด์ ์ ํธ๋ค๋ฌ ์คํ์ ํ์ฉํ๋ CommandExt::before_exec ํจ์๋ฅผ ๋ ์ด์ ์ฌ์ฉํ์ง ์์ต๋๋ค. ์ด๋ฌํ ์กฐ๊ฑด์์๋ ํ์ผ ์ค๋ช
์ ๋ฐ ๋งคํ๋ ๋ฉ๋ชจ๋ฆฌ ์์ญ๊ณผ ๊ฐ์ ์์ ํ๋ก์ธ์ค์ ์ผ๋ถ ๋ฆฌ์์ค๊ฐ ๋ณต์ ๋ ์ ์์ผ๋ฉฐ, ์ด๋ก ์ธํด ์ ์๋์ง ์์ ๋์์ด ๋ฐ์ํ๊ณ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๊ฐ ์๋ชป ์๋ํ ์ ์์ต๋๋ค.
before_exec ๋์ ์์ ํ์ง ์์ CommandExt::pre_exec ํจ์๋ฅผ ์ฌ์ฉํ๋ ๊ฒ์ด ์ข์ต๋๋ค. - ํฌ๊ธฐ๊ฐ 8~64๋นํธ์ธ ๋ถํธ ์๋ ๋ฐ ๋ถํธ ์๋ ์์ ์ ์ ์ ํ(์: AtomicU8)๊ณผ ๋ถํธ ์๋ ์ ํ NonZeroI[8|16|32|54|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" ๋น๋ ์ต์ ์ ์ง์ ํ์ฌ ์ฐ๊ฒฐ ๋จ๊ณ์์ ์ต์ ํ๋ฅผ ํ์ฑํํ๋ ๊ธฐ๋ฅ์ ์ถ๊ฐํ์ต๋๋ค(rustc๋ Rust ์ฝ๋๋ฅผ LLVM ๋นํธ์ฝ๋๋ก ์ปดํ์ผํ์ฌ LTO ์ต์ ํ๋ฅผ ์ ์ฉํ ์ ์์ต๋๋ค).
์ถ์ฒ : opennet.ru