Rust์ ์๋ ๋ฉ๋ชจ๋ฆฌ ๊ด๋ฆฌ๋ ๊ฐ๋ฐ์๊ฐ ํฌ์ธํฐ ์กฐ์์ผ๋ก๋ถํฐ ํด๋ฐฉ๋๊ณ , After-Free ๋ฉ๋ชจ๋ฆฌ ์ก์ธ์ค, ๋ ํฌ์ธํฐ ์ญ์ฐธ์กฐ, ๋ฒํผ ์ค๋ฒ๋ฐ ๋ฑ๊ณผ ๊ฐ์ ๋ฎ์ ์์ค์ ๋ฉ๋ชจ๋ฆฌ ์กฐ์์ผ๋ก ์ธํด ๋ฐ์ํ๋ ๋ฌธ์ ๋ก๋ถํฐ ๋ณดํธํฉ๋๋ค. ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ๋ฐฐํฌํ๊ณ ์ด์
๋ธ๋ฆฌ๋ฅผ ๋ณด์ฅํ๋ฉฐ ํ๋ก์ ํธ๋ณ ์ข
์์ฑ์ ๊ด๋ฆฌํ๊ธฐ ์ํด ํจํค์ง ๊ด๋ฆฌ์๊ฐ ๊ฐ๋ฐ๋๊ณ ์์ต๋๋ค.
์ฃผ์
- 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