Mozilla ํ๋ก์ ํธ์ ์ํด ์ค๋ฆฝ๋์์ง๋ง ํ์ฌ๋ ๋ ๋ฆฝ์ ์ธ ๋น์๋ฆฌ ์กฐ์ง์ธ Rust Foundation์ ํ์์ผ๋ก ๊ฐ๋ฐ๋ Rust 1.59 ๋ฒ์ฉ ํ๋ก๊ทธ๋๋ฐ ์ธ์ด์ ์ถ์๊ฐ ๋ฐํ๋์์ต๋๋ค. ์ด ์ธ์ด๋ ๋ฉ๋ชจ๋ฆฌ ์์ ์ ์ค์ ์ ๋๊ณ ๊ฐ๋น์ง ์์ง๊ธฐ ๋ฐ ๋ฐํ์(๋ฐํ์์ ํ์ค ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ๊ธฐ๋ณธ ์ด๊ธฐํ ๋ฐ ์ ์ง ๊ด๋ฆฌ๋ก ์ถ์๋จ)์ ์ฌ์ฉ์ ํผํ๋ฉด์ ๋์ ์์ ๋ณ๋ ฌ์ฑ์ ๋ฌ์ฑํ ์ ์๋ ์๋จ์ ์ ๊ณตํฉ๋๋ค.
Rust์ ๋ฉ๋ชจ๋ฆฌ ์ฒ๋ฆฌ ๋ฐฉ๋ฒ์ ํฌ์ธํฐ๋ฅผ ์กฐ์ํ ๋ ๊ฐ๋ฐ์๋ฅผ ์ค๋ฅ๋ก๋ถํฐ ๋ณดํธํ๊ณ ๋ฉ๋ชจ๋ฆฌ ์์ญ์ด ํด์ ๋ ํ ์ก์ธ์ค, null ํฌ์ธํฐ ์ญ์ฐธ์กฐ, ๋ฒํผ ์ค๋ฒ๋ฐ ๋ฑ๊ณผ ๊ฐ์ ์ ์์ค ๋ฉ๋ชจ๋ฆฌ ์ฒ๋ฆฌ๋ก ์ธํด ๋ฐ์ํ๋ ๋ฌธ์ ๋ก๋ถํฐ ๋ณดํธํฉ๋๋ค. ๋ผ์ด๋ธ๋ฌ๋ฆฌ ๋ฐฐํฌ, ๋น๋ ์ ๊ณต ๋ฐ ์ข ์์ฑ ๊ด๋ฆฌ๋ฅผ ์ํด ํ๋ก์ ํธ๋ Cargo ํจํค์ง ๊ด๋ฆฌ์๋ฅผ ๊ฐ๋ฐํฉ๋๋ค. crates.io ์ ์ฅ์๋ ๋ผ์ด๋ธ๋ฌ๋ฆฌ ํธ์คํ ์ ์ํด ์ง์๋ฉ๋๋ค.
๋ฉ๋ชจ๋ฆฌ ์์ ์ ์ปดํ์ผ ์๊ฐ์ ์ฐธ์กฐ ํ์ธ, ๊ฐ์ฒด ์์ ๊ถ ์ถ์ , ๊ฐ์ฒด ์๋ช (๋ฒ์) ์ถ์ ๋ฐ ์ฝ๋ ์คํ ์ค ๋ฉ๋ชจ๋ฆฌ ์ก์ธ์ค์ ์ ํ์ฑ ํ๊ฐ๋ฅผ ํตํด Rust์์ ์ ๊ณต๋ฉ๋๋ค. Rust๋ ๋ํ ์ ์ ์ค๋ฒํ๋ก์ ๋ํ ๋ณดํธ ๊ธฐ๋ฅ์ ์ ๊ณตํ๊ณ , ์ฌ์ฉํ๊ธฐ ์ ์ ๋ณ์ ๊ฐ์ ํ์ ์ด๊ธฐํ๊ฐ ํ์ํ๋ฉฐ, ํ์ค ๋ผ์ด๋ธ๋ฌ๋ฆฌ์์ ์ค๋ฅ๋ฅผ ๋ ์ ์ฒ๋ฆฌํ๊ณ , ๊ธฐ๋ณธ์ ์ผ๋ก ๋ถ๋ณ ์ฐธ์กฐ ๋ฐ ๋ณ์ ๊ฐ๋ ์ ์ ์ฉํ๊ณ , ๊ฐ๋ ฅํ ์ ์ ์ ํ ์ง์ ์ ์ ๊ณตํ์ฌ ๋ ผ๋ฆฌ์ ์ค๋ฅ๋ฅผ ์ต์ํํฉ๋๋ค.
์ฃผ์ ํ์ :
- ๋ฎ์ ์์ค์์ ์คํ์ ์ ์ดํด์ผ ํ๊ฑฐ๋ ํน์ํ ๊ธฐ๊ณ ๋ช ๋ น์ด๋ฅผ ์ฌ์ฉํ ์ ์๋ ์ ํ๋ฆฌ์ผ์ด์ ์์ ์๊ตฌ๋๋ ์ด์ ๋ธ๋ฌ ์ธ์ํธ๋ฅผ ์ฌ์ฉํ ์ ์๋ ๊ธฐ๋ฅ์ ์ ๊ณตํฉ๋๋ค. ์ด์ ๋ธ๋ฌ ์ธ์ํธ๋ "asm!"์ ์ฌ์ฉํ์ฌ ์ถ๊ฐ๋ฉ๋๋ค. ๋งคํฌ๋ก. ๊ทธ๋ฆฌ๊ณ "global_asm!" Rust์ ๋ฌธ์์ด ๋์ฒด์ ์ฌ์ฉ๋๋ ๊ฒ๊ณผ ๋น์ทํ ๋ฌธ์์ด ํ์ ๊ตฌ๋ฌธ์ ์ฌ์ฉํ์ฌ ๋ ์ง์คํฐ ์ด๋ฆ์ ์ง์ ํฉ๋๋ค. ์ปดํ์ผ๋ฌ๋ x86, x86-64, ARM, AArch64 ๋ฐ RISC-V ์ํคํ ์ฒ์ ๋ํ ์ด์ ๋ธ๋ฌ ๋ช ๋ น์ด๋ฅผ ์ง์ํฉ๋๋ค. ์ฝ์ ์: std::arch::asm์ ์ฌ์ฉํฉ๋๋ค. // ์ด๋๊ณผ ์ถ๊ฐ๋ฅผ ์ฌ์ฉํ์ฌ x์ 6์ ๊ณฑํฉ๋๋ค. let mut x: u64 = 4; ์์ ํ์ง ์์ { asm!( "mov {tmp}, {x}", "shl {tmp}, 1", "shl {x}, 2", "add {x}, {tmp}", x = inout(reg) x, tmp = out(reg) _, ); } assert_eq!(x, 4 * 6);
- ํํ์์ ์ผ์ชฝ์ ์ฌ๋ฌ ์ ํ, ์ฌ๋ผ์ด์ค ๋๋ ๊ตฌ์กฐ๊ฐ ์ง์ ๋๋ ๋น๊ตฌ์กฐํ(๋ณ๋ ฌ) ํ ๋น์ ๋ํ ์ง์์ด ์ถ๊ฐ๋์์ต๋๋ค. ์๋ฅผ ๋ค์ด: let (a, b, c, d, e); (a, b) = (1, 2); [c, .., d, _] = [1, 2, 3, 4, 5]; ๊ตฌ์กฐ์ฒด { e, .. } = ๊ตฌ์กฐ์ฒด { e: 5, f: 3 }; assert_eq!([1, 2, 1, 4, 5], [a, b, c, d, e]);
- const ์ ๋ค๋ฆญ์ ๋ํ ๊ธฐ๋ณธ๊ฐ์ ์ง์ ํ๋ ๊ธฐ๋ฅ ์ ๊ณต: struct ArrayStorage { arr: [T; N], } ๊ตฌํ ์ด๋ ์ด ์คํ ๋ฆฌ์ง { fn new(a: T, b: T) -> ArrayStorage { ArrayStorage { ๋ฐฐ์ด: [a, b], } } }
- Cargo ํจํค์ง ๊ด๋ฆฌ์๋ ์ด์ ์ปดํ์ผ๋ฌ ์ค๋ฅ(์: ์์ ๋ธ๋ก์์ ํจํน๋ ๊ตฌ์กฐ์ ํ๋๋ฅผ ๋น๋ฆฌ๋ ๊ฒ์ ํ์ฉํ๋ ์ค๋ฅ)๋ก ์ธํด ์ข ์์ฑ์์ ์๋ชป๋ ๊ตฌ๋ฌธ์ ์ฌ์ฉํ๋ ๊ฒฝ์ฐ ๊ฒฝ๊ณ ๋ฅผ ์ ๊ณตํฉ๋๋ค. ์ด๋ฌํ ๊ตฌ์กฐ์ ๋ํ ์ง์์ ํฅํ Rust ๋ฒ์ ์์ ์ ๊ฑฐ๋ ์์ ์ ๋๋ค.
- cargo์ rustc์๋ ๋ณ๋์ ์ ํธ๋ฆฌํฐ๋ฅผ ํธ์ถํ์ง ์๊ณ ๋ ๋๋ฒ๊ทธ ์ ๋ณด(strip = "debuginfo")์ ์ฌ๋ณผ(strip = "symbols")์ ์ ๊ฑฐํ ์คํ ํ์ผ์ ์์ฑํ๋ ๋ด์ฅ ๊ธฐ๋ฅ์ด ์์ต๋๋ค. ์ฒญ์ ์ค์ ์ Cargo.toml์ "strip" ๋งค๊ฐ๋ณ์๋ฅผ ํตํด ๊ตฌํ๋ฉ๋๋ค: [profile.release] strip = "debuginfo", "symbols"
- ์ฆ๋ถ ์ปดํ์ผ์ ๊ธฐ๋ณธ์ ์ผ๋ก ๋นํ์ฑํ๋์ด ์์ต๋๋ค. ์ ์๋ ์ด์ ๋ ์ถฉ๋๊ณผ ์ญ์ง๋ ฌํ ์ค๋ฅ๋ฅผ ์ผ์ผํค๋ ์ปดํ์ผ๋ฌ ๋ฒ๊ทธ์ ๋ํ ์์ ํด๊ฒฐ์ฑ ์ ๋๋ค. ํด๋น ๋ฒ๊ทธ์ ๋ํ ์์ ์์ด ์ด๋ฏธ ์ค๋น๋์์ผ๋ฉฐ, ๋ค์ ๋ฆด๋ฆฌ์ค์ ํฌํจ๋ ์์ ์ ๋๋ค. ์ฆ๋ถ ์ปดํ์ผ์ ๋ฐํํ๋ ค๋ฉด RUSTC_FORCE_INCREMENTAL=1 ํ๊ฒฝ ๋ณ์๋ฅผ ์ฌ์ฉํ ์ ์์ต๋๋ค.
- API์ ์๋ก์ด ๋ถ๋ถ์ด ์์ ํ๋ ํน์ฑ์ ๋ฉ์๋ ๋ฐ ๊ตฌํ์ ํฌํจํ์ฌ ์์ ์ ์ธ ๋ฒ์ฃผ๋ก ์ด๋๋์์ต๋๋ค.
- std::thread::available_parallelism
- ๊ฒฐ๊ณผ::๋ณต์ฌ๋จ
- ๊ฒฐ๊ณผ::๋ณต์ ๋จ
- ์์น::asm!
- ์์น::๊ธ๋ก๋ฒ_asm!
- ops::ControlFlow::is_break
- ops::ControlFlow::is_continue
- u8์ฉ TryFrom
- char::TryFromCharError(๋ณต์ , ๋๋ฒ๊ทธ, ํ์, ๋ถ๋ถ ๋ฐฉ์ ์, ๋ณต์ฌ, ๋ฐฉ์ ์, ์ค๋ฅ)
- iter::zip
- NonZeroU8::XNUMX์ ๊ฑฐ๋ญ์ ๊ณฑ
- NonZeroU16::XNUMX์ ๊ฑฐ๋ญ์ ๊ณฑ
- NonZeroU32::XNUMX์ ๊ฑฐ๋ญ์ ๊ณฑ
- NonZeroU64::XNUMX์ ๊ฑฐ๋ญ์ ๊ณฑ
- NonZeroU128::XNUMX์ ๊ฑฐ๋ญ์ ๊ณฑ
- ToLowercase ๊ตฌ์กฐ์ ๋ํ DoubleEndedIterator
- ToUppercase ๊ตฌ์กฐ์ฒด์ ๋ํ DoubleEndedIterator
- [T]์ ๋ํด <&mut [T]>๋ฅผ ์๋ํฉ๋๋ค. N]
- UnwindSafe for Once ๊ตฌ์กฐ
- RefUnwindSafe for Once
- ์ปดํ์ผ๋ฌ ๋ด์ฅ armv8 neon ์ง์ ๊ธฐ๋ฅ aarch64
- ์์ ๋์ ๋ชจ๋ ์ปจํ
์คํธ์์ ์ฌ์ฉํ ๊ฐ๋ฅ์ฑ์ ๊ฒฐ์ ํ๋ "const" ์์ฑ์ ํจ์์์ ์ฌ์ฉ๋ฉ๋๋ค.
- mem::MaybeUninit::as_ptr
- mem::MaybeUninit::assume_init
- mem::MaybeUninit::assume_init_ref
- ffi::CStr::from_bytes_with_nul_unchecked
์ถ์ฒ : opennet.ru
