Mozilla ํ๋ก์ ํธ์ ์ํด ์ค๋ฆฝ๋์์ง๋ง ํ์ฌ๋ ๋ ๋ฆฝ์ ์ธ ๋น์๋ฆฌ ์กฐ์ง์ธ Rust Foundation์ ํ์์ผ๋ก ๊ฐ๋ฐ๋ Rust 1.75 ๋ฒ์ฉ ํ๋ก๊ทธ๋๋ฐ ์ธ์ด์ ์ถ์๊ฐ ๋ฐํ๋์์ต๋๋ค. ์ด ์ธ์ด๋ ๋ฉ๋ชจ๋ฆฌ ์์ ์ ์ค์ ์ ๋๊ณ ๊ฐ๋น์ง ์์ง๊ธฐ ๋ฐ ๋ฐํ์(๋ฐํ์์ ํ์ค ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ๊ธฐ๋ณธ ์ด๊ธฐํ ๋ฐ ์ ์ง ๊ด๋ฆฌ๋ก ์ถ์๋จ)์ ์ฌ์ฉ์ ํผํ๋ฉด์ ๋์ ์์ ๋ณ๋ ฌ์ฑ์ ๋ฌ์ฑํ ์ ์๋ ์๋จ์ ์ ๊ณตํฉ๋๋ค.
Rust์ ๋ฉ๋ชจ๋ฆฌ ์ฒ๋ฆฌ ๋ฐฉ๋ฒ์ ํฌ์ธํฐ๋ฅผ ์กฐ์ํ ๋ ๊ฐ๋ฐ์๋ฅผ ์ค๋ฅ๋ก๋ถํฐ ๋ณดํธํ๊ณ ๋ฉ๋ชจ๋ฆฌ ์์ญ์ด ํด์ ๋ ํ ์ก์ธ์ค, null ํฌ์ธํฐ ์ญ์ฐธ์กฐ, ๋ฒํผ ์ค๋ฒ๋ฐ ๋ฑ๊ณผ ๊ฐ์ ์ ์์ค ๋ฉ๋ชจ๋ฆฌ ์ฒ๋ฆฌ๋ก ์ธํด ๋ฐ์ํ๋ ๋ฌธ์ ๋ก๋ถํฐ ๋ณดํธํฉ๋๋ค. ๋ผ์ด๋ธ๋ฌ๋ฆฌ ๋ฐฐํฌ, ๋น๋ ์ ๊ณต ๋ฐ ์ข ์์ฑ ๊ด๋ฆฌ๋ฅผ ์ํด ํ๋ก์ ํธ๋ Cargo ํจํค์ง ๊ด๋ฆฌ์๋ฅผ ๊ฐ๋ฐํฉ๋๋ค. crates.io ์ ์ฅ์๋ ๋ผ์ด๋ธ๋ฌ๋ฆฌ ํธ์คํ ์ ์ํด ์ง์๋ฉ๋๋ค.
๋ฉ๋ชจ๋ฆฌ ์์ ์ ์ปดํ์ผ ์๊ฐ์ ์ฐธ์กฐ ํ์ธ, ๊ฐ์ฒด ์์ ๊ถ ์ถ์ , ๊ฐ์ฒด ์๋ช (๋ฒ์) ์ถ์ ๋ฐ ์ฝ๋ ์คํ ์ค ๋ฉ๋ชจ๋ฆฌ ์ก์ธ์ค์ ์ ํ์ฑ ํ๊ฐ๋ฅผ ํตํด Rust์์ ์ ๊ณต๋ฉ๋๋ค. Rust๋ ๋ํ ์ ์ ์ค๋ฒํ๋ก์ ๋ํ ๋ณดํธ ๊ธฐ๋ฅ์ ์ ๊ณตํ๊ณ , ์ฌ์ฉํ๊ธฐ ์ ์ ๋ณ์ ๊ฐ์ ํ์ ์ด๊ธฐํ๊ฐ ํ์ํ๋ฉฐ, ํ์ค ๋ผ์ด๋ธ๋ฌ๋ฆฌ์์ ์ค๋ฅ๋ฅผ ๋ ์ ์ฒ๋ฆฌํ๊ณ , ๊ธฐ๋ณธ์ ์ผ๋ก ๋ถ๋ณ ์ฐธ์กฐ ๋ฐ ๋ณ์ ๊ฐ๋ ์ ์ ์ฉํ๊ณ , ๊ฐ๋ ฅํ ์ ์ ์ ํ ์ง์ ์ ์ ๊ณตํ์ฌ ๋ ผ๋ฆฌ์ ์ค๋ฅ๋ฅผ ์ต์ํํฉ๋๋ค.
์ฃผ์ ํ์ :
- ๋น๊ณต๊ฐ ํน์ฑ์ "async fn" ๋ฐ "->impl Trait" ํ๊ธฐ๋ฒ์ ์ฌ์ฉํ๋ ๊ธฐ๋ฅ์ด ์ถ๊ฐ๋์์ต๋๋ค. ์๋ฅผ ๋ค์ด, "->impl Trait"์ ์ฌ์ฉํ๋ฉด ๋ฐ๋ณต์๋ฅผ ๋ฐํํ๋ ํน์ฑ ๋ฉ์๋๋ฅผ ์์ฑํ ์ ์์ต๋๋ค. trait Container { fn items(&self) -> impl Iterator; } MyContainer์ฉ impl ์ปจํ
์ด๋ { fn items(&self) -> impl Iterator { self.items.iter().cloned() } }
"async fn"์ ์ฌ์ฉํ์ฌ ํน์ฑ์ ์์ฑํ ์๋ ์์ต๋๋ค. trait HttpService { async fn fetch(&self, url: Url) -> HtmlBody; // ๋ค์์ผ๋ก ํ์ฅ๋ฉ๋๋ค. // fn fetch(&self, url: Url) -> impl Future; }
- ํฌ์ธํฐ๋ฅผ ๊ธฐ์ค์ผ๋ก ๋ฐ์ดํธ ์คํ์
์ ๊ณ์ฐํ๊ธฐ ์ํ API๊ฐ ์ถ๊ฐ๋์์ต๋๋ค. ๋ฒ ์ด ํฌ์ธํฐ("*const T" ๋ฐ "*mut T")๋ก ์์
ํ ๋ ํฌ์ธํฐ์ ์คํ์
์ ์ถ๊ฐํ๋ ์์
์ด ํ์ํ ์ ์์ต๋๋ค. ์ด์ ์๋ ์ด๋ฅผ ์ํด "::add(1)"์ ๊ฐ์ ๊ตฌ์ฑ์ ์ฌ์ฉํ์ฌ "size_of::()" ํฌ๊ธฐ์ ํด๋นํ๋ ๋ฐ์ดํธ ์๋ฅผ ์ถ๊ฐํ๋ ๊ฒ์ด ๊ฐ๋ฅํ์ต๋๋ค. ์๋ก์ด API๋ ์ด ์์
์ ๋จ์ํํ๊ณ ๋จผ์ ์ ํ์ "*const u8" ๋๋ "*mut u8"๋ก ์บ์คํ
ํ์ง ์๊ณ ๋ ๋ฐ์ดํธ ์คํ์
์ ์กฐ์ํ ์ ์๊ฒ ํด์ค๋๋ค.
- ํฌ์ธํฐ::byte_add
- ํฌ์ธํฐ::byte_offset
- ํฌ์ธํฐ::byte_offset_from
- ํฌ์ธํฐ::byte_sub
- ํฌ์ธํฐ::wrapping_byte_add
- ํฌ์ธํฐ::wrapping_byte_offset
- ํฌ์ธํฐ::wrapping_byte_sub
- Rustc ์ปดํ์ผ๋ฌ์ ์ฑ๋ฅ์ ํฅ์์ํค๊ธฐ ์ํ ์ง์์ ์ธ ์์
์
๋๋ค. ๋งํฌ ํ ๋จ๊ณ์์ ์คํ๋๊ณ ์ฌ์ ์ค๋น๋ ์คํ ํ๋กํ์ ์ ๋ณด๋ฅผ ์ฌ์ฉํ๋ BOLT ์ต์ ํ ํ๋ก๊ทธ๋จ์ด ์ถ๊ฐ๋์์ต๋๋ค. BOLT๋ฅผ ์ฌ์ฉํ๋ฉด ํ๋ก์ธ์ ์บ์๋ฅผ ๋ณด๋ค ํจ์จ์ ์ผ๋ก ์ฌ์ฉํ๊ธฐ ์ํด librustc_driver.so ๋ผ์ด๋ธ๋ฌ๋ฆฌ ์ฝ๋์ ๋ ์ด์์์ ๋ณ๊ฒฝํ์ฌ ์ปดํ์ผ๋ฌ ์คํ ์๋๋ฅผ ์ฝ 2% ๋์ผ ์ ์์ต๋๋ค.
LLVM์ ์ต์ ํ ํ์ง์ ํฅ์์ํค๊ธฐ ์ํด "-Ccodegen-units=1" ์ต์ ์ ์ฌ์ฉํ์ฌ Rustc ์ปดํ์ผ๋ฌ๋ฅผ ๊ตฌ์ถํ๋ ๊ฒ์ด ํฌํจ๋์์ต๋๋ค. ์ํ๋ ํ ์คํธ์์๋ "-Ccodegen-units=1" ๋น๋์ ๊ฒฝ์ฐ ์ฑ๋ฅ์ด ์ฝ 1.5% ์ฆ๊ฐํ ๊ฒ์ผ๋ก ๋ํ๋ฌ์ต๋๋ค. ์ถ๊ฐ๋ ์ต์ ํ๋ x86_64-unknown-linux-gnu ํ๋ซํผ์ ๋ํด์๋ง ๊ธฐ๋ณธ์ ์ผ๋ก ํ์ฑํ๋ฉ๋๋ค.
์์ ์ธ๊ธํ ์ต์ ํ๋ Rust๋ก ์์ฑ๋ Android ํ๋ซํผ ๊ตฌ์ฑ ์์์ ๋น๋ ์๊ฐ์ ์ค์ด๊ธฐ ์ํด Google์์ ํ ์คํธํ ๊ฒ์ ๋๋ค. Android๋ฅผ ๋น๋ํ ๋ "-C codegen-units=1"์ ์ฌ์ฉํ๋ฉด ํดํท ํฌ๊ธฐ๊ฐ 5.5% ์ค์ด๋ค๊ณ ์ฑ๋ฅ์ด 1.8% ํฅ์๋๋ ๋์์ ํดํท ์์ฒด์ ๋น๋ ์๊ฐ์ด ๊ฑฐ์ ๋ ๋ฐฐ๋ก ๋์ด๋ฌ์ต๋๋ค.
๋งํฌ ํ์ ๊ฐ๋น์ง ์ปฌ๋ ์ (โ--gc-sectionsโ)์ ํ์ฑํํ๋ฉด ์ฑ๋ฅ์ด ์ต๋ 1.9% ํฅ์๋๊ณ , ๋งํฌ ํ์ ์ต์ ํ(LTO)๋ ์ต๋ 7.7%, ํ๋กํ ๊ธฐ๋ฐ ์ต์ ํ(PGO)๋ ์ต๋ 19.8% ๊ฐ๋ฅํด์ก์ต๋๋ค. ์ต์ข ์ ์ผ๋ก๋ BOLT ์ ํธ๋ฆฌํฐ๋ฅผ ์ฌ์ฉํด ์ต์ ํ๋ฅผ ์ ์ฉํด ๋น๋ ์๋๋ฅผ 24.7%๊น์ง ๋์ผ ์ ์์์ง๋ง, ํดํท ํฌ๊ธฐ๋ 10.9% ๋์ด๋ฌ๋ค.
- API์ ์๋ก์ด ๋ถ๋ถ์ด ์์ ํ๋ ํน์ฑ์ ๋ฉ์๋ ๋ฐ ๊ตฌํ์ ํฌํจํ์ฌ ์์ ์ ์ธ ๋ฒ์ฃผ๋ก ์ด๋๋์์ต๋๋ค.
- ์์*::from_ptr
- ํ์ผ ์๊ฐ
- FileTimesExt
- ํ์ผ::set_modified
- ํ์ผ::set_times
- IpAddr::to_canonical
- Ipv6Addr::to_canonical
- ์ต์ ::as_slice
- ์ต์ ::as_mut_slice
- ํฌ์ธํฐ::byte_add
- ํฌ์ธํฐ::byte_offset
- ํฌ์ธํฐ::byte_offset_from
- ํฌ์ธํฐ::byte_sub
- ํฌ์ธํฐ::wrapping_byte_add
- ํฌ์ธํฐ::wrapping_byte_offset
- ํฌ์ธํฐ::wrapping_byte_sub
- ์์ ๋์ ๋ชจ๋ ์ปจํ
์คํธ์์ ์ฌ์ฉํ ๊ฐ๋ฅ์ฑ์ ๊ฒฐ์ ํ๋ "const" ์์ฑ์ ํจ์์์ ์ฌ์ฉ๋ฉ๋๋ค.
- Ipv6Addr::to_ipv4_mapped
- MaybeUninit::assume_init_read
- MaybeUninit::์ ๋กํ๋จ
- mem::ํ๋ณ
- ๋ฉ๋ชจ๋ฆฌ::์ ๋กํ๋จ
- ์ธ ๋ฒ์งธ ์์ค์ ์ง์์ csky-unknown-linux-gnuabiv2hf, i586-unknown-netbsd ๋ฐ mipsel-unknown-netbsd ํ๋ซํผ์ ๋ํด ๊ตฌํ๋์์ต๋๋ค. ์ธ ๋ฒ์งธ ์์ค์๋ ๊ธฐ๋ณธ ์ง์์ด ํฌํจ๋์ง๋ง ์๋ํ๋ ํ ์คํธ, ๊ณต์ ๋น๋ ๊ฒ์ ๋๋ ์ฝ๋ ๋น๋ ๊ฐ๋ฅ ์ฌ๋ถ ํ์ธ์ ํฌํจ๋์ง ์์ต๋๋ค.
๋ํ, Rust ์ธ์ด๋ก ์์ฑ๋ ํน์ ์ปค๋(unikernel)์ ๊ฐ๋ฐํ๊ณ ์ถ๊ฐ ๊ณ์ธต ์์ด ํ์ดํผ๋ฐ์ด์ ๋๋ ๋ฒ ์ด ํ๋์จ์ด ์์์ ์คํ๋ ์ ์๋ ์์ฒด ํฌํจ ์ ํ๋ฆฌ์ผ์ด์
์ ๊ตฌ์ถํ๊ธฐ ์ํ ๋๊ตฌ๋ฅผ ์ ๊ณตํ๋ Hermit ํ๋ก์ ํธ์ ์ ๋ฒ์ ์ ์ฃผ๋ชฉํ ์ ์์ต๋๋ค. ์ด์ ์ฒด์ ๊ฐ ์์ต๋๋ค. ๋น๋๋๋ฉด ์ ํ๋ฆฌ์ผ์ด์
์ OS ์ปค๋ ๋ฐ ์์คํ
๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ๋ฌถ์ด์ง ์๊ณ ํ์ํ ๋ชจ๋ ๊ธฐ๋ฅ์ ๋
๋ฆฝ์ ์ผ๋ก ๊ตฌํํ๋ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ์ ์ ์ผ๋ก ์ฐ๊ฒฐ๋ฉ๋๋ค. ํ๋ก์ ํธ ์ฝ๋๋ Apache 2.0 ๋ฐ MIT ๋ผ์ด์ผ์ค์ ๋ฐ๋ผ ๋ฐฐํฌ๋ฉ๋๋ค. Rust, Go, Fortran, C ๋ฐ C++๋ก ์์ฑ๋ ์ ํ๋ฆฌ์ผ์ด์
์ ๋
๋ฆฝ ์คํํ ์คํ์ ์ํด ์ด์
๋ธ๋ฆฌ๊ฐ ์ง์๋ฉ๋๋ค. ์ด ํ๋ก์ ํธ๋ ๋ํ QEMU ๋ฐ KVM์ ์ฌ์ฉํ์ฌ Hermit์ ์์ํ ์ ์๋ ์์ฒด ๋ถํธ๋ก๋๋ฅผ ๊ฐ๋ฐ ์ค์
๋๋ค.
์ถ์ฒ : opennet.ru