Mozilla ํ๋ก์ ํธ์ ์ํด ์ค๋ฆฝ๋์์ง๋ง ํ์ฌ๋ ๋ ๋ฆฝ์ ์ธ ๋น์๋ฆฌ ์กฐ์ง์ธ Rust Foundation์ ํ์์ผ๋ก ๊ฐ๋ฐ๋ Rust 1.73 ๋ฒ์ฉ ํ๋ก๊ทธ๋๋ฐ ์ธ์ด์ ์ถ์๊ฐ ๋ฐํ๋์์ต๋๋ค. ์ด ์ธ์ด๋ ๋ฉ๋ชจ๋ฆฌ ์์ ์ ์ค์ ์ ๋๊ณ ๊ฐ๋น์ง ์์ง๊ธฐ ๋ฐ ๋ฐํ์(๋ฐํ์์ ํ์ค ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ๊ธฐ๋ณธ ์ด๊ธฐํ ๋ฐ ์ ์ง ๊ด๋ฆฌ๋ก ์ถ์๋จ)์ ์ฌ์ฉ์ ํผํ๋ฉด์ ๋์ ์์ ๋ณ๋ ฌ์ฑ์ ๋ฌ์ฑํ ์ ์๋ ์๋จ์ ์ ๊ณตํฉ๋๋ค.
Rust์ ๋ฉ๋ชจ๋ฆฌ ์ฒ๋ฆฌ ๋ฐฉ๋ฒ์ ํฌ์ธํฐ๋ฅผ ์กฐ์ํ ๋ ๊ฐ๋ฐ์๋ฅผ ์ค๋ฅ๋ก๋ถํฐ ๋ณดํธํ๊ณ ๋ฉ๋ชจ๋ฆฌ ์์ญ์ด ํด์ ๋ ํ ์ก์ธ์ค, null ํฌ์ธํฐ ์ญ์ฐธ์กฐ, ๋ฒํผ ์ค๋ฒ๋ฐ ๋ฑ๊ณผ ๊ฐ์ ์ ์์ค ๋ฉ๋ชจ๋ฆฌ ์ฒ๋ฆฌ๋ก ์ธํด ๋ฐ์ํ๋ ๋ฌธ์ ๋ก๋ถํฐ ๋ณดํธํฉ๋๋ค. ๋ผ์ด๋ธ๋ฌ๋ฆฌ ๋ฐฐํฌ, ๋น๋ ์ ๊ณต ๋ฐ ์ข ์์ฑ ๊ด๋ฆฌ๋ฅผ ์ํด ํ๋ก์ ํธ๋ Cargo ํจํค์ง ๊ด๋ฆฌ์๋ฅผ ๊ฐ๋ฐํฉ๋๋ค. crates.io ์ ์ฅ์๋ ๋ผ์ด๋ธ๋ฌ๋ฆฌ ํธ์คํ ์ ์ํด ์ง์๋ฉ๋๋ค.
๋ฉ๋ชจ๋ฆฌ ์์ ์ ์ปดํ์ผ ์๊ฐ์ ์ฐธ์กฐ ํ์ธ, ๊ฐ์ฒด ์์ ๊ถ ์ถ์ , ๊ฐ์ฒด ์๋ช (๋ฒ์) ์ถ์ ๋ฐ ์ฝ๋ ์คํ ์ค ๋ฉ๋ชจ๋ฆฌ ์ก์ธ์ค์ ์ ํ์ฑ ํ๊ฐ๋ฅผ ํตํด Rust์์ ์ ๊ณต๋ฉ๋๋ค. Rust๋ ๋ํ ์ ์ ์ค๋ฒํ๋ก์ ๋ํ ๋ณดํธ ๊ธฐ๋ฅ์ ์ ๊ณตํ๊ณ , ์ฌ์ฉํ๊ธฐ ์ ์ ๋ณ์ ๊ฐ์ ํ์ ์ด๊ธฐํ๊ฐ ํ์ํ๋ฉฐ, ํ์ค ๋ผ์ด๋ธ๋ฌ๋ฆฌ์์ ์ค๋ฅ๋ฅผ ๋ ์ ์ฒ๋ฆฌํ๊ณ , ๊ธฐ๋ณธ์ ์ผ๋ก ๋ถ๋ณ ์ฐธ์กฐ ๋ฐ ๋ณ์ ๊ฐ๋ ์ ์ ์ฉํ๊ณ , ๊ฐ๋ ฅํ ์ ์ ์ ํ ์ง์ ์ ์ ๊ณตํ์ฌ ๋ ผ๋ฆฌ์ ์ค๋ฅ๋ฅผ ์ต์ํํฉ๋๋ค.
์ฃผ์ ํ์ :
- ๊ธฐ๋ณธ ํ๋ก๊ทธ๋จ ์ถฉ๋ ์ฒ๋ฆฌ๊ธฐ(ํจ๋)๊ฐ ๋ฐํํ๋ ๋ฉ์์ง ํ์์ด ๋ค์ ์ค๊ณ๋์์ต๋๋ค. "panic!" ๋งคํฌ๋ก์ ์ง์ ๋ ํ
์คํธ ์ด์ ๋ฐ์ดํ ์์ด ๋ณ๋์ ์ค์ ํ์๋๋ฏ๋ก ๋ฉ์์ง๋ฅผ ๋ ์ฝ๊ฒ ์ฝ์ ์ ์๊ณ ์ค์ฒฉ๋ ๋ฐ์ดํ๊ฐ ์๊ฑฐ๋ ์ฌ๋ฌ ์ค์ ๊ฑธ์ณ ๋ถํ ๋ ๋ ํผ๋์ด ์ฌ๋ผ์ง๋๋ค. fn main() { let file = "ferris.txt"; ๋นํฉ!("์๋ผ! {ํ์ผ:?}์(๋ฅผ) ์ฐพ์ ์ ์์ต๋๋ค!"); } '์๋ผ!'์ ๋นํฉํ ์ค๋ ๋ 'main'์ด ์์์ต๋๋ค. "ferris.txt"๋ฅผ ์ฐพ์ ์ ์์ต๋๋ค!', src/main.rs:3:5 'main' ์ค๋ ๋๊ฐ src/main.rs:3:5์์ ํจ๋ ์ํ์ ๋น ์ก์ต๋๋ค. ์ด๋ฐ! "ferris.txt"๋ฅผ ์ฐพ์ ์ ์์ต๋๋ค!
"assert_eq" ๋ฐ "assert_ne" ๋งคํฌ๋ก๊ฐ ํธ๋ฆฌ๊ฑฐ๋ ๋ ํ์๋๋ ๋ฉ์์ง ์ถ๋ ฅ๋ ์ฌ์์ ๋์์ต๋๋ค. fn main() { ์ฃผ์ฅ_eq!("๐ฆ", "๐", "ํ๋ฆฌ์ค๋ ๋ฌผ๊ณ ๊ธฐ๊ฐ ์๋๋๋ค"); } 'assertion failed: `(left == right)`์ ๋นํฉํ ์ค๋ ๋ 'main'์ด ์์์ต๋๋ค. left: `"๐ฆ"`, right: `"๐"`: ferris is not a fish', src/main.rs: 2:5 ์ค๋ ๋ 'main'์ด src/main.rs:2:5์์ ํจ๋ ์ํ: `left == right` ์ฃผ์ฅ ์คํจ: Ferris๋ ๋ฌผ๊ณ ๊ธฐ๊ฐ ์๋๋๋ค. ์ผ์ชฝ: โ๐ฆโ ์ค๋ฅธ์ชฝ: โ๐โ
- RFC 3184์ ๋ฐ๋ผ ์ค๋ ๋ ๋ก์ปฌ(thread_local) LocalKey ์ ์ฅ์ ํค๋ฅผ ์ง์ ์กฐ์ํ๋ ๊ธฐ๋ฅ์ด ์ถ๊ฐ๋์์ต๋๋ค. > ๋ฐ ๋ก์ปฌํค > "with(|inner| ...)" ํด๋ก์ ๋ฅผ ์ฌ์ฉํ๋ ๋์ get(), set(), take() ๋ฐ replacement() ๋ฉ์๋๋ฅผ ์ฌ์ฉํ์ฌ ์ถ๊ฐ ์ด๊ธฐํ ์ฝ๋๋ฅผ ์ํํ ํ์๊ฐ ์์ต๋๋ค. โthread_local!โ ๋งคํฌ๋ก๋ฅผ ์ฌ์ฉํ ๋ ์ ์ค๋ ๋์ ๋ํด ์ง์ ๋ ๊ธฐ๋ณธ๊ฐ ์ค๋ ๋_๋ก์ปฌ! { ์ ์ ์ฌํญ: ์ > = ์ ::new(Vec::new()); } fn f() { // THINGS.with(|i| i.set(vec![32, 1, 2])); // THINGS.set(vec![3, 1, 2])์ด ๋์์ต๋๋ค. // ... // let v = THINGS.with(|i| i.take()); // let v: Vec๊ฐ ๋์์ต๋๋ค. = THINGS.take(); }
- API์ ์๋ก์ด ๋ถ๋ถ์ด ์์ ํ๋ ํน์ฑ์ ๋ฉ์๋ ๋ฐ ๊ตฌํ์ ํฌํจํ์ฌ ์์ ์ ์ธ ๋ฒ์ฃผ๋ก ์ด๋๋์์ต๋๋ค.
- ์๋ช ๋์ง ์์ {integer}::div_ceil
- ๋ถํธ ์๋ {integer}::next_multiple_of
- ์๋ช ๋์ง ์์ {integer}::checked_next_multiple_of
- ํ์ค::ffi::FromBytesUntilNulError
- ํ์ค::os::์ ๋์ค::fs::chown
- ํ์ค::os::์ ๋์ค::fs::fchown
- ํ์ค::os::์ ๋์ค::fs::lfchown
- ๋ก์ปฌํค:: >::์ป๋ค
- ๋ก์ปฌํค:: >::์ค์
- ๋ก์ปฌํค:: >::์ทจํ๋ค
- ๋ก์ปฌํค:: >::๋ฐ๊พธ๋ค
- ๋ก์ปฌํค:: >::with_borrow
- ๋ก์ปฌํค:: >::with_borrow_mut
- ๋ก์ปฌํค:: >::์ค์
- ๋ก์ปฌํค:: >::์ทจํ๋ค
- ๋ก์ปฌํค:: >::๋ฐ๊พธ๋ค
- ์์ ๋์ ๋ชจ๋ ์ปจํ
์คํธ์์ ์ฌ์ฉํ ๊ฐ๋ฅ์ฑ์ ๊ฒฐ์ ํ๋ "const" ์์ฑ์ ํจ์์์ ์ฌ์ฉ๋ฉ๋๋ค.
- rc::์ฝํจ::์
- ๋๊ธฐํ::์ฝํจ::์
- NonNull::as_ref
- ์ปดํ์ผ๋ฌ๋ GCC ๋ฐ Clang๊ณผ ์ ์ฌํ๊ฒ ".comment" ์น์ ์ ๋ฒ์ ์ ๋ณด ๊ธฐ๋ก์ ์ ๊ณตํฉ๋๋ค.
- ์ธ ๋ฒ์งธ ์์ค์ ์ง์์ aarch64-unknown-teeos, csky-unknown-linux-gnuabiv2, riscv64-linux-android, riscv64gc-unknown-hermit, x86_64-unikraft-linux-musl ๋ฐ x86_64-unknown-linux ํ๋ซํผ์ ๋ํด ๊ตฌํ๋์์ต๋๋ค. -์คํธ์ค. ์ธ ๋ฒ์งธ ์์ค์๋ ๊ธฐ๋ณธ ์ง์์ด ํฌํจ๋์ง๋ง ์๋ํ๋ ํ ์คํธ, ๊ณต์ ๋น๋ ๊ฒ์ ๋๋ ์ฝ๋ ๋น๋ ๊ฐ๋ฅ ์ฌ๋ถ ํ์ธ์ ํฌํจ๋์ง ์์ต๋๋ค.
- ๋์ ํ๋ซํผ wasm32-wasi-preview1-threads์ ๋ํ ๋ ๋ฒ์งธ ์์ค์ ์ง์์ด ๊ตฌํ๋์์ต๋๋ค. ๋ ๋ฒ์งธ ์์ค์ ์ง์์๋ ์กฐ๋ฆฝ ๋ณด์ฆ์ด ํฌํจ๋ฉ๋๋ค.
์ถ์ฒ : opennet.ru