๋Ÿฌ์ŠคํŠธ 1.53์ด ์ถœ์‹œ๋˜์—ˆ์Šต๋‹ˆ๋‹ค. Google์€ Linux ์ปค๋„์— Rust ์ง€์›์„ ์ถ”๊ฐ€ํ•˜๋Š” ๋ฐ ์ž๊ธˆ์„ ์ง€์›ํ•ฉ๋‹ˆ๋‹ค.

Mozilla ํ”„๋กœ์ ํŠธ์— ์˜ํ•ด ์„ค๋ฆฝ๋˜์—ˆ์ง€๋งŒ ํ˜„์žฌ๋Š” ๋…๋ฆฝ์ ์ธ ๋น„์˜๋ฆฌ ์กฐ์ง์ธ Rust Foundation์˜ ํ›„์›์œผ๋กœ ๊ฐœ๋ฐœ๋œ ์‹œ์Šคํ…œ ํ”„๋กœ๊ทธ๋ž˜๋ฐ ์–ธ์–ด Rust 1.53์˜ ์ถœ์‹œ๊ฐ€ ๋ฐœํ‘œ๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ์ด ์–ธ์–ด๋Š” ๋ฉ”๋ชจ๋ฆฌ ์•ˆ์ „์— ์ค‘์ ์„ ๋‘๊ณ  ์ž๋™ ๋ฉ”๋ชจ๋ฆฌ ๊ด€๋ฆฌ๋ฅผ ์ œ๊ณตํ•˜๋ฉฐ ๊ฐ€๋น„์ง€ ์ˆ˜์ง‘๊ธฐ๋‚˜ ๋Ÿฐํƒ€์ž„์„ ์‚ฌ์šฉํ•˜์ง€ ์•Š๊ณ  ๋†’์€ ์ž‘์—… ๋ณ‘๋ ฌ์„ฑ์„ ๋‹ฌ์„ฑํ•  ์ˆ˜ ์žˆ๋Š” ์ˆ˜๋‹จ์„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค(๋Ÿฐํƒ€์ž„์€ ํ‘œ์ค€ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์˜ ๊ธฐ๋ณธ ์ดˆ๊ธฐํ™” ๋ฐ ์œ ์ง€ ๊ด€๋ฆฌ๋กœ ๋‹จ์ถ•๋ฉ๋‹ˆ๋‹ค).

Rust์˜ ์ž๋™ ๋ฉ”๋ชจ๋ฆฌ ๊ด€๋ฆฌ๋Š” ํฌ์ธํ„ฐ๋ฅผ ์กฐ์ž‘ํ•  ๋•Œ ์˜ค๋ฅ˜๋ฅผ ์ œ๊ฑฐํ•˜๊ณ  ๋ฉ”๋ชจ๋ฆฌ ์˜์—ญ์ด ํ•ด์ œ๋œ ํ›„ ๋ฉ”๋ชจ๋ฆฌ ์˜์—ญ์— ์•ก์„ธ์Šคํ•˜๋Š” ๊ฒƒ, ๋„ ํฌ์ธํ„ฐ ์—ญ์ฐธ์กฐ, ๋ฒ„ํผ ์˜ค๋ฒ„๋Ÿฐ ๋“ฑ๊ณผ ๊ฐ™์€ ์ €์ˆ˜์ค€ ๋ฉ”๋ชจ๋ฆฌ ์กฐ์ž‘์œผ๋กœ ์ธํ•ด ๋ฐœ์ƒํ•˜๋Š” ๋ฌธ์ œ๋กœ๋ถ€ํ„ฐ ๋ณดํ˜ธํ•ฉ๋‹ˆ๋‹ค. ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ๋ฐฐํฌํ•˜๊ณ  ์–ด์…ˆ๋ธ”๋ฆฌ๋ฅผ ๋ณด์žฅํ•˜๋ฉฐ ์ข…์†์„ฑ์„ ๊ด€๋ฆฌํ•˜๊ธฐ ์œ„ํ•ด ํ”„๋กœ์ ํŠธ๋Š” Cargo ํŒจํ‚ค์ง€ ๊ด€๋ฆฌ์ž๋ฅผ ๊ฐœ๋ฐœํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. crates.io ์ €์žฅ์†Œ๋Š” ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ํ˜ธ์ŠคํŒ…์„ ์œ„ํ•ด ์ง€์›๋ฉ๋‹ˆ๋‹ค.

์ฃผ์š” ํ˜์‹ :

  • ๋ฐฐ์—ด์˜ ๊ฒฝ์šฐ IntoIterator ํŠน์„ฑ์ด ๊ตฌํ˜„๋˜์–ด ๋ฐฐ์—ด ์š”์†Œ์˜ ๋ฐ˜๋ณต์„ ๊ฐ’์œผ๋กœ ๊ตฌ์„ฑํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค: for i in [1, 2, 3] { .. }

    ๋ฐ˜๋ณต์ž๋ฅผ ํ—ˆ์šฉํ•˜๋Š” ๋ฉ”์„œ๋“œ์— ๋ฐฐ์—ด์„ ์ „๋‹ฌํ•˜๋Š” ๊ฒƒ๋„ ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค: let set = BTreeSet::from_iter([1, 2, 3]); for (a, b) in some_iterator.chain([1]).zip([1, 2, 3]) { .. }

    ์ด์ „์—๋Š” IntoIterator๊ฐ€ ๋ฐฐ์—ด ์ฐธ์กฐ์—๋งŒ ๊ตฌํ˜„๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ์ฐธ์กฐ("&[1, 2, 3]") ๋˜๋Š” "[1, 2, 3].iter()"๋ฅผ ์‚ฌ์šฉํ•ด์•ผ ํ•˜๋Š” ๊ฐ’์„ ๋ฐ˜๋ณตํ•ฉ๋‹ˆ๋‹ค. ๋ฐฐ์—ด์— ๋Œ€ํ•œ IntoIterator ๊ตฌํ˜„์€ array.into_iter()์—์„œ (&array).into_iter()๋กœ์˜ ์ด์ „ ์ปดํŒŒ์ผ๋Ÿฌ ๋ณ€ํ™˜์œผ๋กœ ์ธํ•ด ๋ฐœ์ƒํ•œ ํ˜ธํ™˜์„ฑ ๋ฌธ์ œ๋กœ ์ธํ•ด ๋ฐฉํ•ด๋ฅผ ๋ฐ›์•˜์Šต๋‹ˆ๋‹ค. ์ด๋Ÿฌํ•œ ๋ฌธ์ œ๋Š” ํ•ด๊ฒฐ ๋ฐฉ๋ฒ•์œผ๋กœ ํ•ด๊ฒฐ๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ์ปดํŒŒ์ผ๋Ÿฌ๋Š” ๋งˆ์น˜ IntoIterator ํŠน์„ฑ์˜ ๊ตฌํ˜„์ด ์—†๋Š” ๊ฒƒ์ฒ˜๋Ÿผ ๊ณ„์†ํ•ด์„œ array.into_iter()๋ฅผ (&array).into_iter()๋กœ ๋ณ€ํ™˜ํ•˜์ง€๋งŒ, ".into_iter( )" ๊ตฌ๋ฌธ์„ ์‚ฌ์šฉํ•˜๋ฉฐ "in [1, 2, 3]", "iter.zip([1, 2, 3])", "IntoIterator::into_iter([1, 2, 3] ํ˜•์‹์˜ ํ˜ธ์ถœ์„ ๊ฑด๋“œ๋ฆฌ์ง€ ์•Š์Šต๋‹ˆ๋‹ค. )".

  • ํ‘œํ˜„์‹ "|"์„ ์ง€์ •ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด "Some(1) | Some(2)" ์ด์ œ "Some(1 | 2)"๋ผ๊ณ  ์“ธ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ผ์น˜ ๊ฒฐ๊ณผ { Ok(Some(1 | 2)) => { .. } Err(MyError { kind: FileNotFound | PermissionDenied, .. }) = > { .. } _ => { .. } }
  • ์œ ๋‹ˆ์ฝ”๋“œ UAX 31 ์‚ฌ์–‘์— ์ •์˜๋œ ๋ชจ๋“  ๊ตญ๊ฐ€ ๋ฌธ์ž๋ฅผ ํฌํ•จํ•˜์—ฌ ์‹๋ณ„์ž์— ASCII๊ฐ€ ์•„๋‹Œ ๋ฌธ์ž๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์ง€๋งŒ ์ด๋ชจํ‹ฐ์ฝ˜ ๋ฌธ์ž๋Š” ์ œ์™ธ๋ฉ๋‹ˆ๋‹ค. ๋‹ค๋ฅด์ง€๋งŒ ์œ ์‚ฌํ•œ ๋ฌธ์ž๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒฝ์šฐ ์ปดํŒŒ์ผ๋Ÿฌ๋Š” ๊ฒฝ๊ณ ๋ฅผ ํ‘œ์‹œํ•ฉ๋‹ˆ๋‹ค. const BLร…HAJ: &str = "๐Ÿฆˆ"; struct ไบบ { ์ด๋ฆ„: ๋ฌธ์ž์—ด, } let ฮฑ = 1; letos = 2; ๊ฒฝ๊ณ : '๏ฝ“'์™€ 's' ์‚ฌ์ด์— ํ˜ผ๋™ ๊ฐ€๋Šฅํ•œ ๊ฒƒ์œผ๋กœ ๊ฐ„์ฃผ๋˜๋Š” ์‹๋ณ„์ž ์Œ
  • ๋‹ค์Œ๊ณผ ๊ฐ™์€ ์•ˆ์ •ํ™”๋œ API๋ฅผ ํฌํ•จํ•˜์—ฌ API์˜ ์ƒˆ๋กœ์šด ๋ถ€๋ถ„์ด ์•ˆ์ •์ ์ธ ๋ฒ”์ฃผ๋กœ ์ด์ „๋˜์—ˆ์Šต๋‹ˆ๋‹ค.
    • ๋ฐฐ์—ด::from_ref
    • ๋ฐฐ์—ด::from_mut
    • AtomicBool::fetch_update
    • AtomicPtr::fetch_update
    • BTreeSet::์œ ์ง€
    • BTreeMap::๋ณด์œ 
    • BufReader::seek_relative
    • cmp::min_by
    • cmp::min_by_key
    • cmp::max_by
    • cmp::max_by_key
    • DebugStruct::finish_non_exhaustive
    • ๊ธฐ๊ฐ„::ZERO
    • ๊ธฐ๊ฐ„::MAX
    • ๊ธฐ๊ฐ„::is_zero
    • ๊ธฐ๊ฐ„::saturating_add
    • ๊ธฐ๊ฐ„::saturating_sub
    • ๊ธฐ๊ฐ„::saturating_mul
    • f32::is_subnormal
    • f64::is_subnormal
    • ๋ฐฐ์—ด์šฉ IntoIterator
    • {์ •์ˆ˜}::๋น„ํŠธ
    • io::์˜ค๋ฅ˜::์ง€์›๋˜์ง€ ์•Š์Œ
    • NonZero*::leading_zeros
    • NonZero*::trailing_zeros
    • ์˜ต์…˜::์‚ฝ์ž…
    • ์ฃผ๋ฌธ::is_eq
    • ์ฃผ๋ฌธ::is_ne
    • ์ฃผ๋ฌธ::is_lt
    • ์ฃผ๋ฌธ::is_gt
    • ์ฃผ๋ฌธ::is_le
    • ์ฃผ๋ฌธ::is_ge
    • OsStr::make_ascii_lowercase
    • OsStr::make_ascii_uppercase
    • OsStr::to_ascii_lowercase
    • OsStr::to_ascii_uppercase
    • OsStr::is_ascii
    • OsStr::eq_ignore_ascii_case
    • ํ”ผ์ปค๋ธ”::peek_mut
    • Rc::increment_strong_count
    • Rc::decrement_strong_count
    • ์Šฌ๋ผ์ด์Šค::IterMut::as_slice
    • Slice::IterMut์— ๋Œ€ํ•œ AsRef<[T]>
    • impl SliceIndex for(๋ฐ”์šด๋“œ , ๋ฐ”์šด๋“œ )
    • Vec::extend_from_within
  • wasm64-unknown-unknown ํ”Œ๋žซํผ์— ๋Œ€ํ•œ ์„ธ ๋ฒˆ์งธ ์ˆ˜์ค€์˜ ์ง€์›์ด ๊ตฌํ˜„๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ์„ธ ๋ฒˆ์งธ ์ˆ˜์ค€์—๋Š” ๊ธฐ๋ณธ ์ง€์›์ด ํฌํ•จ๋˜์ง€๋งŒ ์ž๋™ํ™”๋œ ํ…Œ์ŠคํŠธ, ๊ณต์‹ ๋นŒ๋“œ ๊ฒŒ์‹œ ๋˜๋Š” ์ฝ”๋“œ ๋นŒ๋“œ ๊ฐ€๋Šฅ ์—ฌ๋ถ€ ํ™•์ธ์€ ํฌํ•จ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
  • Cargo ํŒจํ‚ค์ง€ ๊ด€๋ฆฌ์ž๋Š” ๊ธฐ๋ณธ์ ์œผ๋กœ Git ์ €์žฅ์†Œ(HEAD)์˜ ๋ฉ”์ธ ๋ธŒ๋žœ์น˜์— "main"์ด๋ผ๋Š” ์ด๋ฆ„์„ ์‚ฌ์šฉํ•˜๋„๋ก ์ด๋™๋˜์—ˆ์Šต๋‹ˆ๋‹ค. master ๋Œ€์‹  main์ด๋ผ๋Š” ์ด๋ฆ„์„ ์‚ฌ์šฉํ•˜๋Š” ๋ฆฌํฌ์ง€ํ† ๋ฆฌ์—์„œ ํ˜ธ์ŠคํŒ…๋˜๋Š” ์ข…์†์„ฑ์„ ๊ตฌ์„ฑํ•˜๋ ค๋ฉด ๋” ์ด์ƒ Branch = "main"์ด ํ•„์š”ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
  • ์ปดํŒŒ์ผ๋Ÿฌ์—์„œ๋Š” LLVM์˜ ์ตœ์†Œ ๋ฒ„์ „์— ๋Œ€ํ•œ ์š”๊ตฌ ์‚ฌํ•ญ์ด LLVM 10์œผ๋กœ ์ƒํ–ฅ ์กฐ์ •๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

์ถ”๊ฐ€์ ์œผ๋กœ, ์šฐ๋ฆฌ๋Š” Rust ์–ธ์–ด๋กœ ๊ตฌ์„ฑ์š”์†Œ๋ฅผ ๊ฐœ๋ฐœํ•˜๊ธฐ ์œ„ํ•œ ๋„๊ตฌ์˜ Linux ์ปค๋„ ํ†ตํ•ฉ ๊ฐœ๋ฐœ์„ ์œ„ํ•œ ์ž๊ธˆ ์ œ๊ณต์— ์ฃผ๋ชฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด ์ž‘์—…์€ Let's Encrypt ํ”„๋กœ์ ํŠธ์˜ ์ฐฝ๋ฆฝ์ž์ธ ISRG ์กฐ์ง(์ธํ„ฐ๋„ท ๋ณด์•ˆ ์—ฐ๊ตฌ ๊ทธ๋ฃน)์˜ ํ›„์› ํ•˜์— Prossimo ํ”„๋กœ์ ํŠธ ํ”„๋ ˆ์ž„์›Œํฌ ๋‚ด์—์„œ ์ˆ˜ํ–‰๋˜๋ฉฐ HTTPS ๋ฐ ๋ณด์•ˆ์„ ๊ฐ•ํ™”ํ•˜๋Š” ๊ธฐ์ˆ  ๊ฐœ๋ฐœ์„ ์ด‰์ง„ํ•ฉ๋‹ˆ๋‹ค. ์ธํ„ฐ๋„ท. ์ž๊ธˆ์€ Google์—์„œ ์ œ๊ณตํ•˜๋ฉฐ Rust-for-Linux ํ”„๋กœ์ ํŠธ์˜ ์ €์ž์ธ Miguel Ojeda์˜ ์ž‘์—… ๋น„์šฉ์„ ์ง€๋ถˆํ•ฉ๋‹ˆ๋‹ค. ์ด์ „์— ISRG์™€ Google์€ ์ด๋ฏธ ์ปฌ ์œ ํ‹ธ๋ฆฌํ‹ฐ๋ฅผ ์œ„ํ•œ ๋Œ€์ฒด HTTP ๋ฐฑ์—”๋“œ ์ƒ์„ฑ๊ณผ Apache http ์„œ๋ฒ„๋ฅผ ์œ„ํ•œ ์ƒˆ๋กœ์šด TLS ๋ชจ๋“ˆ ๊ฐœ๋ฐœ์— ์ž๊ธˆ์„ ์ง€์›ํ–ˆ์Šต๋‹ˆ๋‹ค.

Microsoft์™€ Google์— ๋”ฐ๋ฅด๋ฉด ์ทจ์•ฝ์ ์˜ ์•ฝ 70%๋Š” ์•ˆ์ „ํ•˜์ง€ ์•Š์€ ๋ฉ”๋ชจ๋ฆฌ ์ฒ˜๋ฆฌ๋กœ ์ธํ•ด ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค. ์žฅ์น˜ ๋“œ๋ผ์ด๋ฒ„์™€ ๊ฐ™์€ ์ปค๋„ ๊ตฌ์„ฑ ์š”์†Œ๋ฅผ ๊ฐœ๋ฐœํ•˜๊ธฐ ์œ„ํ•ด Rust ์–ธ์–ด๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ์•ˆ์ „ํ•˜์ง€ ์•Š์€ ๋ฉ”๋ชจ๋ฆฌ ์ฒ˜๋ฆฌ๋กœ ์ธํ•ด ๋ฐœ์ƒํ•˜๋Š” ์ทจ์•ฝ์ ์˜ ์œ„ํ—˜์ด ์ค„์–ด๋“ค๊ณ  ๋ฉ”๋ชจ๋ฆฌ ์˜์—ญ์ด ํ•ด์ œ๋œ ํ›„ ๋ฉ”๋ชจ๋ฆฌ ์˜์—ญ์— ์•ก์„ธ์Šคํ•˜๊ฑฐ๋‚˜ ๋ฒ„ํผ ๊ฒฝ๊ณ„๊ฐ€ ์ดˆ๊ณผ๋˜๋Š” ์˜ค๋ฅ˜๊ฐ€ ์ œ๊ฑฐ๋  ๊ฒƒ์œผ๋กœ ์˜ˆ์ƒ๋ฉ๋‹ˆ๋‹ค.

๋ฉ”๋ชจ๋ฆฌ ์•ˆ์ „ ์ฒ˜๋ฆฌ๋Š” ์ฝ”๋“œ ์‹คํ–‰ ์ค‘ ๋ฉ”๋ชจ๋ฆฌ ์•ก์„ธ์Šค์˜ ์ •ํ™•์„ฑ ํ‰๊ฐ€๋ฟ๋งŒ ์•„๋‹ˆ๋ผ ์ฐธ์กฐ ํ™•์ธ, ๊ฐœ์ฒด ์†Œ์œ ๊ถŒ ๋ฐ ๊ฐœ์ฒด ์ˆ˜๋ช…(๋ฒ”์œ„) ์ถ”์ ์„ ํ†ตํ•ด ์ปดํŒŒ์ผ ์‹œ๊ฐ„์— Rust์—์„œ ์ œ๊ณต๋ฉ๋‹ˆ๋‹ค. Rust๋Š” ๋˜ํ•œ ์ •์ˆ˜ ์˜ค๋ฒ„ํ”Œ๋กœ์— ๋Œ€ํ•œ ๋ณดํ˜ธ ๊ธฐ๋Šฅ์„ ์ œ๊ณตํ•˜๊ณ , ์‚ฌ์šฉํ•˜๊ธฐ ์ „์— ๋ณ€์ˆ˜ ๊ฐ’์˜ ํ•„์ˆ˜ ์ดˆ๊ธฐํ™”๊ฐ€ ํ•„์š”ํ•˜๋ฉฐ, ํ‘œ์ค€ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์—์„œ ์˜ค๋ฅ˜๋ฅผ ๋” ์ž˜ ์ฒ˜๋ฆฌํ•˜๊ณ , ๊ธฐ๋ณธ์ ์œผ๋กœ ๋ถˆ๋ณ€ ์ฐธ์กฐ ๋ฐ ๋ณ€์ˆ˜ ๊ฐœ๋…์„ ์ ์šฉํ•˜๊ณ , ๊ฐ•๋ ฅํ•œ ์ •์  ์œ ํ˜• ์ง€์ •์„ ์ œ๊ณตํ•˜์—ฌ ๋…ผ๋ฆฌ์  ์˜ค๋ฅ˜๋ฅผ ์ตœ์†Œํ™”ํ•ฉ๋‹ˆ๋‹ค.

์ถœ์ฒ˜ : opennet.ru

์ฝ”๋ฉ˜ํŠธ๋ฅผ ์ถ”๊ฐ€