Mozilla ํ๋ก์ ํธ์ ์ํด ์ค๋ฆฝ๋์์ง๋ง ํ์ฌ๋ ๋ ๋ฆฝ์ ์ธ ๋น์๋ฆฌ ์กฐ์ง์ธ Rust Foundation์ ํ์์ผ๋ก ๊ฐ๋ฐ๋ ๋ฒ์ฉ ํ๋ก๊ทธ๋๋ฐ ์ธ์ด Rust 1.58์ ์ถ์๊ฐ ๋ฐํ๋์์ต๋๋ค. ์ด ์ธ์ด๋ ๋ฉ๋ชจ๋ฆฌ ์์ ์ ์ค์ ์ ๋๊ณ ์๋ ๋ฉ๋ชจ๋ฆฌ ๊ด๋ฆฌ๋ฅผ ์ ๊ณตํ๋ฉฐ ๊ฐ๋น์ง ์์ง๊ธฐ๋ ๋ฐํ์์ ์ฌ์ฉํ์ง ์๊ณ ๋์ ์์ ๋ณ๋ ฌ์ฑ์ ๋ฌ์ฑํ ์ ์๋ ์๋จ์ ์ ๊ณตํฉ๋๋ค(๋ฐํ์์ ํ์ค ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ๊ธฐ๋ณธ ์ด๊ธฐํ ๋ฐ ์ ์ง ๊ด๋ฆฌ๋ก ๋จ์ถ๋ฉ๋๋ค).
Rust์ ์๋ ๋ฉ๋ชจ๋ฆฌ ๊ด๋ฆฌ๋ ํฌ์ธํฐ๋ฅผ ์กฐ์ํ ๋ ์ค๋ฅ๋ฅผ ์ ๊ฑฐํ๊ณ ๋ฉ๋ชจ๋ฆฌ ์์ญ์ด ํด์ ๋ ํ ๋ฉ๋ชจ๋ฆฌ ์์ญ์ ์ก์ธ์คํ๋ ๊ฒ, ๋ ํฌ์ธํฐ ์ญ์ฐธ์กฐ, ๋ฒํผ ์ค๋ฒ๋ฐ ๋ฑ๊ณผ ๊ฐ์ ์ ์์ค ๋ฉ๋ชจ๋ฆฌ ์กฐ์์ผ๋ก ์ธํด ๋ฐ์ํ๋ ๋ฌธ์ ๋ก๋ถํฐ ๋ณดํธํฉ๋๋ค. ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ๋ฐฐํฌํ๊ณ ์ด์ ๋ธ๋ฆฌ๋ฅผ ๋ณด์ฅํ๋ฉฐ ์ข ์์ฑ์ ๊ด๋ฆฌํ๊ธฐ ์ํด ํ๋ก์ ํธ๋ Cargo ํจํค์ง ๊ด๋ฆฌ์๋ฅผ ๊ฐ๋ฐํ๊ณ ์์ต๋๋ค. crates.io ์ ์ฅ์๋ ๋ผ์ด๋ธ๋ฌ๋ฆฌ ํธ์คํ ์ ์ํด ์ง์๋ฉ๋๋ค.
์ฃผ์ ํ์ :
- ์ค ์์ ์ง์ ๋ธ๋ก์์๋ ์ค ๋ค์ ๋ช
์์ ์ผ๋ก ๋์ด๋ ๋ณ์๋ฅผ ๋ฒํธ์ ์ด๋ฆ์ผ๋ก ๋์ฒดํ๋ ์ด์ ๊ธฐ๋ฅ ์ธ์๋ ์ค์ "{์๋ณ์}"๋ผ๋ ํํ์ ์ถ๊ฐํ์ฌ ์์์ ์๋ณ์๋ฅผ ๋์ฒดํ๋ ๊ธฐ๋ฅ์ด ๊ตฌํ๋์์ต๋๋ค. ์: // ์ด์ ์ ์ง์๋ ๊ตฌ์ฑ: println!("Hello, {}!", get_person()); println!("์๋
ํ์ธ์, {0} ๋!", get_person()); println!("์๋
ํ์ธ์, {person} ๋!", person = get_person()); // ์ด์ ์ง์ ํ ์ ์์ต๋๋ค. let person = get_person(); println!("์๋
ํ์ธ์, {์ฌ๋} ๋!");
ํ์ ์ง์ ์ต์ ์์ ์๋ณ์๋ฅผ ์ง์ ์ง์ ํ ์๋ ์์ต๋๋ค. let (๋๋น, ์ ๋ฐ๋) = get_format(); for (์ด๋ฆ, ์ ์) in get_scores() { println!("{name}: {score:width$.precision$}"); }
์๋ก์ด ๋์ฒด๋ "panic!" ๋งคํฌ๋ก๋ฅผ ์ ์ธํ๊ณ ๋ฌธ์์ด ํ์ ์ ์๋ฅผ ์ง์ํ๋ ๋ชจ๋ ๋งคํฌ๋ก์์ ์๋ํฉ๋๋ค. Rust ์ธ์ด์ 2015 ๋ฐ 2018 ๋ฒ์ ์์๋ ๋นํฉ!("{ident}")์ด ์ผ๋ฐ ๋ฌธ์์ด๋ก ์ฒ๋ฆฌ๋ฉ๋๋ค(Rust 2021์์๋ ๋์ฒด๊ฐ ์๋ํจ).
- Windows ํ๋ซํผ์ std::process::Command ๊ตฌ์กฐ ๋์์ด ๋ณ๊ฒฝ๋์ด ๋ช ๋ น์ ์คํํ ๋ ๋ณด์์์ ์ด์ ๋ก ๋ ์ด์ ํ์ฌ ๋๋ ํฐ๋ฆฌ์์ ์คํ ํ์ผ์ ์ฐพ์ง ์์ต๋๋ค. ํ์ฌ ๋๋ ํฐ๋ฆฌ๋ ์ ๋ขฐํ ์ ์๋ ๋๋ ํฐ๋ฆฌ์์ ํ๋ก๊ทธ๋จ์ด ์คํ๋ ๊ฒฝ์ฐ ์ ์ฑ์ฝ๋ ์คํ์ ์ฌ์ฉ๋ ์ ์์ผ๋ฏ๋ก ์ ์ธ๋ฉ๋๋ค(CVE-2021-3013). ์๋ก์ด ์คํ ๊ฐ๋ฅ ๊ฐ์ง ๋ ผ๋ฆฌ์๋ Rust ๋๋ ํฐ๋ฆฌ, ์ ํ๋ฆฌ์ผ์ด์ ๋๋ ํฐ๋ฆฌ, Windows ์์คํ ๋๋ ํฐ๋ฆฌ ๋ฐ PATH ํ๊ฒฝ ๋ณ์์ ์ง์ ๋ ๋๋ ํฐ๋ฆฌ ๊ฒ์์ด ํฌํจ๋ฉ๋๋ค.
- ํ์ค ๋ผ์ด๋ธ๋ฌ๋ฆฌ์์๋ ๋ฐํ ๊ฐ์ด ๋ฌด์๋๋ฉด ๊ฒฝ๊ณ ๋ฅผ ๋ฐํํ๋๋ก "#[must_use]"๋ผ๊ณ ํ์๋ ํจ์ ์๋ฅผ ํ์ฅํ์ต๋๋ค. ์ด๋ ํจ์๊ฐ ์ ๊ฐ์ ๋ฐํํ๋ ๊ฒ์ด ์๋๋ผ ๊ฐ์ ๋ณ๊ฒฝํ ๊ฒ์ด๋ผ๊ณ ๊ฐ์ ํ์ฌ ๋ฐ์ํ๋ ์ค๋ฅ๋ฅผ ์๋ณํ๋ ๋ฐ ๋์์ด ๋ฉ๋๋ค.
- API์ ์๋ก์ด ๋ถ๋ถ์ด ์์ ํ๋ ํน์ฑ์ ๋ฉ์๋ ๋ฐ ๊ตฌํ์ ํฌํจํ์ฌ ์์ ์ ์ธ ๋ฒ์ฃผ๋ก ์ด๋๋์์ต๋๋ค.
- ๋ฉํ๋ฐ์ดํฐ::is_symlink
- ๊ฒฝ๋ก::is_symlink
- {integer}::saturating_div
- ์ต์ ::unwrap_unchecked
- ๊ฒฐ๊ณผ::unwrap_unchecked
- ๊ฒฐ๊ณผ::unwrap_err_unchecked
- ์์ ๋์ ๋ชจ๋ ์ปจํ
์คํธ์์ ์ฌ์ฉํ ๊ฐ๋ฅ์ฑ์ ๊ฒฐ์ ํ๋ "const" ์์ฑ์ ํจ์์์ ์ฌ์ฉ๋ฉ๋๋ค.
- ๊ธฐ๊ฐ::์๋ก ๋ง๋ค๊ธฐ
- ๊ธฐ๊ฐ::checked_add
- ๊ธฐ๊ฐ::saturating_add
- ๊ธฐ๊ฐ::checked_sub
- ๊ธฐ๊ฐ::saturating_sub
- ๊ธฐ๊ฐ::checked_mul
- ๊ธฐ๊ฐ::saturating_mul
- ๊ธฐ๊ฐ::checked_div
- "const" ์ปจํ ์คํธ์์ "*const T" ํฌ์ธํฐ์ ์ญ์ฐธ์กฐ๊ฐ ํ์ฉ๋ฉ๋๋ค.
- Cargo ํจํค์ง ๊ด๋ฆฌ์์์ Rust_version ํ๋๊ฐ ํจํค์ง ๋ฉํ๋ฐ์ดํฐ์ ์ถ๊ฐ๋์๊ณ "--message-format" ์ต์ ์ด "cargo install" ๋ช ๋ น์ ์ถ๊ฐ๋์์ต๋๋ค.
- ์ปดํ์ผ๋ฌ๋ CFI(์ ์ด ํ๋ฆ ๋ฌด๊ฒฐ์ฑ) ๋ณดํธ ๋ฉ์ปค๋์ฆ์ ๋ํ ์ง์์ ๊ตฌํํฉ๋๋ค. ์ด ๋ฉ์ปค๋์ฆ์ ๊ฐ ๊ฐ์ ํธ์ถ ์ ์ ๊ฒ์ฌ๋ฅผ ์ถ๊ฐํ์ฌ ์ ์ฌ์ ์ผ๋ก ์ ์์ ์ธ ์คํ ์์(์ ์ด ํ๋ฆ)๋ฅผ ์๋ฐํ ์ ์๋ ์ ์๋์ง ์์ ๋์์ ์ผ๋ถ ํํ๋ฅผ ๊ฐ์งํฉ๋๋ค. ํจ์์ ๋ฉ๋ชจ๋ฆฌ์ ์ ์ฅ๋ ํฌ์ธํฐ๋ฅผ ๋ณ๊ฒฝํ๋ ์ต์คํ๋ก์ ์ฌ์ฉ.
- ์ปดํ์ผ๋ฌ๋ ํ ์คํธ ์ค์ ์ฝ๋ ์ ์ฉ ๋ฒ์๋ฅผ ํ๊ฐํ๋ ๋ฐ ์ฌ์ฉ๋๋ LLVM ์ ์ฉ ๋ฒ์ ๋น๊ต ํ์ ๋ฒ์ 5 ๋ฐ 6์ ๋ํ ์ง์์ ์ถ๊ฐํ์ต๋๋ค.
- ์ปดํ์ผ๋ฌ์์๋ LLVM์ ์ต์ ๋ฒ์ ์ ๋ํ ์๊ตฌ ์ฌํญ์ด LLVM 12์ผ๋ก ์ํฅ ์กฐ์ ๋์์ต๋๋ค.
- x86_64-unknown-none ํ๋ซํผ์ ๋ํ ์ธ ๋ฒ์งธ ์์ค์ ์ง์์ด ๊ตฌํ๋์์ต๋๋ค. ์ธ ๋ฒ์งธ ์์ค์๋ ๊ธฐ๋ณธ ์ง์์ด ํฌํจ๋์ง๋ง ์๋ํ๋ ํ ์คํธ, ๊ณต์ ๋น๋ ๊ฒ์ ๋๋ ์ฝ๋ ๋น๋ ๊ฐ๋ฅ ์ฌ๋ถ ํ์ธ์ ํฌํจ๋์ง ์์ต๋๋ค.
๋ํ Microsoft๊ฐ Rust ์ธ์ด๋ฅผ ์ฌ์ฉํ์ฌ Windows OS์ฉ ์ ํ๋ฆฌ์ผ์ด์
์ ๊ฐ๋ฐํ ์ ์๋ Windows์ฉ Rust 0.30 ๋ผ์ด๋ธ๋ฌ๋ฆฌ ๋ฆด๋ฆฌ์ค๋ฅผ ๋ฐํํ๋ค๋ ์ฌ์ค์ ์ฃผ๋ชฉํ ์ ์์ต๋๋ค. ์ด ์ธํธ์๋ Rust ํ๋ก๊ทธ๋จ์์ Win API์ ์ก์ธ์คํ ์ ์๋ ๋ ๊ฐ์ ์์ ํจํค์ง(windows ๋ฐ windows-sys)๊ฐ ํฌํจ๋์ด ์์ต๋๋ค. API ์ง์์ ์ํ ์ฝ๋๋ API๋ฅผ ์ค๋ช
ํ๋ ๋ฉํ๋ฐ์ดํฐ์์ ๋์ ์ผ๋ก ์์ฑ๋๋ฏ๋ก ๊ธฐ์กด Win API ํธ์ถ๋ฟ๋ง ์๋๋ผ ํฅํ ๋ํ๋ ํธ์ถ์ ๋ํ ์ง์์ ๊ตฌํํ ์ ์์ต๋๋ค. ์ ๋ฒ์ ์ UWP(Universal Windows Platform) ๋์ ํ๋ซํผ์ ๋ํ ์ง์์ ์ถ๊ฐํ๊ณ ํธ๋ค ๋ฐ ๋๋ฒ๊ทธ ์ ํ์ ๊ตฌํํฉ๋๋ค.
์ถ์ฒ : opennet.ru