์–ด์…ˆ๋ธ”๋ฆฌ ์‚ฝ์ž…์„ ์ง€์›ํ•˜๋Š” Rust 1.59 ํ”„๋กœ๊ทธ๋ž˜๋ฐ ์–ธ์–ด ์ถœ์‹œ

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

DDoS ๋ณดํ˜ธ, VPS VDS ์„œ๋ฒ„๊ฐ€ ์žˆ๋Š” ์‚ฌ์ดํŠธ๋ฅผ ์œ„ํ•œ ์•ˆ์ •์ ์ธ ํ˜ธ์ŠคํŒ… ๊ตฌ์ž… ๐Ÿ”ฅ DDoS ๊ณต๊ฒฉ ๋ฐฉ์ง€ ๊ธฐ๋Šฅ์ด ํƒ‘์žฌ๋œ ์•ˆ์ •์ ์ธ ์›น์‚ฌ์ดํŠธ ํ˜ธ์ŠคํŒ…, VPS ๋ฐ VDS ์„œ๋ฒ„๋ฅผ ๊ตฌ๋งคํ•˜์„ธ์š” | ProHoster