Rust 1.45 ํ”„๋กœ๊ทธ๋ž˜๋ฐ ์–ธ์–ด ๋ฆด๋ฆฌ์Šค

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

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

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

  • ์˜ค๋žซ๋™์•ˆ ์ œ๊ฑฐ๋จ ๋ถˆ์™„์ „ ์ •์ˆ˜์™€ ๋ถ€๋™ ์†Œ์ˆ˜์  ์ˆซ์ž ์‚ฌ์ด์˜ ๋ณ€ํ™˜์„ ์ˆ˜ํ–‰ํ•  ๋•Œ. Rust ์ปดํŒŒ์ผ๋Ÿฌ๋Š” LLVM์„ ๋ฐฑ์—”๋“œ๋กœ ์‚ฌ์šฉํ•˜๋ฏ€๋กœ ์œ ํ˜• ๋ณ€ํ™˜ ์ž‘์—…์€ ๋‹ค์Œ๊ณผ ๊ฐ™์€ LLVM ์ค‘๊ฐ„ ์ฝ”๋“œ ๋ช…๋ น์–ด๋ฅผ ํ†ตํ•ด ์ˆ˜ํ–‰๋˜์—ˆ์Šต๋‹ˆ๋‹ค. fptoui, ์—ฌ๊ธฐ์—๋Š” ํ•˜๋‚˜์˜ ์ค‘์š”ํ•œ ๊ธฐ๋Šฅ์ด ์žˆ์Šต๋‹ˆ๋‹ค. ๊ฒฐ๊ณผ ๊ฐ’์ด ๋Œ€์ƒ ์œ ํ˜•์— ๋งž์ง€ ์•Š์œผ๋ฉด ์ •์˜๋˜์ง€ ์•Š์€ ๋™์ž‘์ž…๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด, f300 ์œ ํ˜•์˜ ๋ถ€๋™ ์†Œ์ˆ˜์  ๊ฐ’ 32์„ ์ •์ˆ˜ ์œ ํ˜• u8๋กœ ๋ณ€ํ™˜ํ•˜๋Š” ๊ฒฝ์šฐ ๊ฒฐ๊ณผ๋Š” ์˜ˆ์ธกํ•  ์ˆ˜ ์—†์œผ๋ฉฐ ์‹œ์Šคํ…œ๋งˆ๋‹ค ๋‹ค๋ฅผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋ฌธ์ œ๋Š” ์ด ๊ธฐ๋Šฅ์ด "์•ˆ์ „ํ•˜์ง€ ์•Š์Œ"์œผ๋กœ ํ‘œ์‹œ๋˜์ง€ ์•Š์€ ์ฝ”๋“œ์— ๋‚˜ํƒ€๋‚œ๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

    Rust 1.45๋ถ€ํ„ฐ ์œ ํ˜• ํฌ๊ธฐ ์˜ค๋ฒ„ํ”Œ๋กœ์˜ ๋™์ž‘์€ ์—„๊ฒฉํ•˜๊ฒŒ ๊ทœ์ œ๋˜๋ฉฐ "as" ๋ณ€ํ™˜ ์ž‘์—…์€ ์˜ค๋ฒ„ํ”Œ๋กœ๋ฅผ ํ™•์ธํ•˜๊ณ  ๊ฐ’์ด ๋Œ€์ƒ ์œ ํ˜•์˜ ์ตœ๋Œ€๊ฐ’ ๋˜๋Š” ์ตœ์†Œ๊ฐ’์œผ๋กœ ๊ฐ•์ œ๋กœ ๋ณ€ํ™˜๋˜๋„๋ก ํ•ฉ๋‹ˆ๋‹ค(์œ„ ์˜ˆ์˜ ๊ฒฝ์šฐ 300์€ 255๋กœ ๋ณ€ํ™˜๋ฉ๋‹ˆ๋‹ค.) ์ด๋Ÿฌํ•œ ๊ฒ€์‚ฌ๋ฅผ ๋น„ํ™œ์„ฑํ™”ํ•˜๊ธฐ ์œ„ํ•ด ์•ˆ์ „ํ•˜์ง€ ์•Š์€ ๋ชจ๋“œ์—์„œ ์ž‘๋™ํ•˜๋Š” ์ถ”๊ฐ€ API ํ˜ธ์ถœ "{f64, f32}::to_int_unchecked"๊ฐ€ ์ œ๊ณต๋ฉ๋‹ˆ๋‹ค.

    fn ์บ์ŠคํŠธ(x: f32) -> u8 {
    x๋ฅผ u8๋กœ
    }

    fn ๋ฉ”์ธ() {
    too_big = 300.0;
    too_small = -100.0;
    nan = f32::NAN;

    x: f32 = 1.0;
    let y: u8 = ์•ˆ์ „ํ•˜์ง€ ์•Š์Œ { x.to_int_unchecked() };

    println!("too_big_casted = {}", Cast(too_big)); // ์ถœ๋ ฅ 255
    println!("too_small_casted = {}", Cast(too_small)); // 0์„ ์ถœ๋ ฅ
    println!("not_a_number_casted = {}", Cast(nan)); // 0์„ ์ถœ๋ ฅ
    }

  • ์•ˆ์ •ํ™”๋œ ์‚ฌ์šฉ ์ ˆ์ฐจ์  ๋งคํฌ๋กœํ•จ์ˆ˜ํ˜• ํ‘œํ˜„์‹, ํ…œํ”Œ๋ฆฟ, ๋ช…๋ น๋ฌธ. ์ด์ „์—๋Š” ์ด๋Ÿฌํ•œ ๋งคํฌ๋กœ๋ฅผ ๋ชจ๋“  ๊ณณ์—์„œ ํ˜ธ์ถœํ•  ์ˆ˜ ์—†์—ˆ๊ณ  ์ฝ”๋“œ์˜ ํŠน์ • ๋ถ€๋ถ„์—์„œ๋งŒ ํ˜ธ์ถœํ•  ์ˆ˜ ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค(๋‹ค๋ฅธ ์ฝ”๋“œ์™€ ์–ฝํžˆ์ง€ ์•Š๊ณ  ๋ณ„๋„์˜ ํ˜ธ์ถœ๋กœ). ํ•จ์ˆ˜์™€ ์œ ์‚ฌํ•˜๊ฒŒ ๋งคํฌ๋กœ๋ฅผ ํ˜ธ์ถœํ•  ์ˆ˜ ์žˆ๋Š” ๋ฐฉ์‹์„ ํ™•์žฅํ•˜๋Š” ๊ฒƒ์€ ์›น ํ”„๋ ˆ์ž„์›Œํฌ๊ฐ€ ์ž‘๋™ํ•˜๋„๋ก ํ•˜๊ธฐ ์œ„ํ•œ ์š”๊ตฌ ์‚ฌํ•ญ ์ค‘ ํ•˜๋‚˜์˜€์Šต๋‹ˆ๋‹ค. ๋กœ์ผ“ Rust์˜ ์•ˆ์ •์ ์ธ ๋ฆด๋ฆฌ์Šค์—์„œ. ์ด์ „์—๋Š” Rocket์—์„œ ํ•ธ๋“ค๋Ÿฌ๋ฅผ ์ •์˜ํ•  ๋•Œ ์ถ”๊ฐ€์ ์ธ ์œ ์—ฐ์„ฑ์„ ์–ป์œผ๋ ค๋ฉด "proc_macro_hygiene"์ด๋ผ๋Š” ์‹คํ—˜์  ๊ธฐ๋Šฅ์„ ํ™œ์„ฑํ™”ํ•ด์•ผ ํ–ˆ๋Š”๋ฐ, ์ด๋Š” Rust์˜ ์•ˆ์ • ๋ฒ„์ „์—์„œ๋Š” ์‚ฌ์šฉํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. ์ด ๊ธฐ๋Šฅ์€ ์ด์ œ ์•ˆ์ •์ ์ธ ์–ธ์–ด ๋ฆด๋ฆฌ์Šค์— ๋‚ด์žฅ๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค.
  • ๋ฒ”์œ„ ๊ฐ’์„ ๋ฐ˜๋ณตํ•˜๊ธฐ ์œ„ํ•ด "char" ์œ ํ˜•์˜ ๋ฒ”์œ„๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค(ops::{Range, RangeFrom, RangeFull, RangeInclusive, RangeTo}):

    'a'..='z'์˜ ์ฑ„๋„์— ๋Œ€ํ•ด {
    print!("{}", ch);
    }
    println!(); // "abcdefghijklmnopqrstuvwxyz"๋ฅผ ์ธ์‡„ํ•ฉ๋‹ˆ๋‹ค.

  • ์•ˆ์ •ํ™”๋œ API๋ฅผ ํฌํ•จํ•˜์—ฌ API์˜ ์ƒˆ๋กœ์šด ๋ถ€๋ถ„์ด ์•ˆ์ •์ ์ธ ๋ฒ”์ฃผ๋กœ ์ด์ „๋˜์—ˆ์Šต๋‹ˆ๋‹ค.
    ํ˜ธ::as_ptr,
    BTreeMap::remove_entry,
    Rc::as_ptr,
    rc::์•ฝํ•จ::as_ptr,
    rc::์•ฝํ•จ::from_raw,
    rc::์•ฝํ•จ::into_raw,
    str::strip_prefix,
    str::strip_suffix,
    sync::์•ฝํ•จ::as_ptr,
    ๋™๊ธฐํ™”::์•ฝํ•จ::from_raw,
    sync::์•ฝํ•จ::into_raw,
    ๋ฌธ์ž::UNICODE_VERSION,
    ๋ฒ”์œ„::resolved_at,
    ๋ฒ”์œ„:: located_at,
    ์ŠคํŒฌ::mixed_site,
    ์œ ๋‹‰์Šค::ํ”„๋กœ์„ธ์Šค::CommandExt::arg0.

  • Rustc ์ปดํŒŒ์ผ๋Ÿฌ๋Š” "target-feature" ํ”Œ๋ž˜๊ทธ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋‹ค์–‘ํ•œ ๋Œ€์ƒ ํ”Œ๋žซํผ ๊ธฐ๋Šฅ์„ ์žฌ์ •์˜ํ•˜๋Š” ์ง€์›์„ ์ถ”๊ฐ€ํ–ˆ์Šต๋‹ˆ๋‹ค(์˜ˆ: "-C target-feature=+avx2,+fma"). ์ƒˆ๋กœ์šด ํ”Œ๋ž˜๊ทธ๋„ ์ถ”๊ฐ€๋˜์—ˆ์Šต๋‹ˆ๋‹ค:
    ์ถฉ๋Œ ์ฒ˜๋ฆฌ ์ „๋žต์— ๊ด€๊ณ„์—†์ด ํ•ด์ œ ํ˜ธ์ถœ ํ…Œ์ด๋ธ”์„ ์ƒ์„ฑํ•˜๋Š” "force-unwind-tables" ์ƒ์„ฑ๋œ rlib์— LLVM ๋น„ํŠธ์ฝ”๋“œ๊ฐ€ ํฌํ•จ๋˜๋Š”์ง€ ์—ฌ๋ถ€๋ฅผ ์ œ์–ดํ•˜๋Š” โ€‹โ€‹"embed-bitcode"์ž…๋‹ˆ๋‹ค. Cargo์—์„œ๋Š” ๋นŒ๋“œ ์‹œ๊ฐ„๊ณผ ๋””์Šคํฌ ๊ณต๊ฐ„ ์†Œ๋น„๋ฅผ ์ตœ์ ํ™”ํ•˜๊ธฐ ์œ„ํ•ด "embed-bitcode" ํ”Œ๋ž˜๊ทธ๊ฐ€ ๊ธฐ๋ณธ์ ์œผ๋กœ ํ™œ์„ฑํ™”๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค.

  • mipsel-sony-psp ๋ฐ Thumbv7a-uwp-windows-msvc ํ”Œ๋žซํผ์— ๋Œ€ํ•œ ์„ธ ๋ฒˆ์งธ ์ˆ˜์ค€์˜ ์ง€์›์ด ์ œ๊ณต๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ์„ธ ๋ฒˆ์งธ ์ˆ˜์ค€์—๋Š” ๊ธฐ๋ณธ ์ง€์›์ด ํฌํ•จ๋˜์ง€๋งŒ ์ž๋™ํ™”๋œ ํ…Œ์ŠคํŠธ ๋ฐ ๊ณต์‹ ๋นŒ๋“œ ๊ฒŒ์‹œ๋Š” ํฌํ•จ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

์ถ”๊ฐ€์ ์œผ๋กœ ์ฃผ๋ชฉํ•  ์ˆ˜ ์žˆ๋Š” ๊ฒƒ์€ ์ด์•ผ๊ธฐ ๊ฐ€์žฅ ๊ฐ„๋‹จํ•œ ๋งŒ๋“ค๊ธฐ์— ๋Œ€ํ•ด ์• ํ”Œ ๋ฆฌ์ผ€์ด์…˜ Rust ์–ธ์–ด์—์„œ๋Š” ์‹œ์Šคํ…œ ๋ถ€ํŠธ๋กœ๋”๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์‹œ์ž‘ํ•˜๊ณ  ์šด์˜ ์ฒด์ œ ๋Œ€์‹  ์ž์ฒด ํฌํ•จ ๋กœ๋”ฉ์„ ์ค€๋น„ํ•ฉ๋‹ˆ๋‹ค.
์ด ๊ธฐ์‚ฌ๋Š” ํ•˜์œ„ ์ˆ˜์ค€ ํ”„๋กœ๊ทธ๋ž˜๋ฐ ๋ฐ OS ๊ฐœ๋ฐœ์—์„œ ์š”๊ตฌ๋˜๋Š” ๊ธฐ์ˆ ์„ ์‹œ์—ฐํ•˜๋Š” ๋ฐ ์ „๋…ํ•˜๋Š” ์‹œ๋ฆฌ์ฆˆ ์ค‘ ์ฒซ ๋ฒˆ์งธ์ž…๋‹ˆ๋‹ค.

์ถœ์ฒ˜ : opennet.ru

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