Выпуск мовы праграмавання Rust 1.66

Апублікаваны рэліз мовы праграмавання агульнага прызначэння Rust 1.66, заснаванага праектам Mozilla, але цяпер які развіваецца пад заступніцтвам незалежнай некамерцыйнай арганізацыі Rust Foundation. Мова сфакусаваная на бяспечнай працы з памяццю і дае сродкі для дасягнення высокага паралелізму выканання заданняў, пры гэтым абыходзячыся без выкарыстання зборшчыка смецця і runtime (runtime зводзіцца да базавай ініцыялізацыі і суправаджэння стандартнай бібліятэкі).

Метады працы з памяццю ў Rust пазбаўляюць распрацоўніка ад памылак пры маніпуляванні паказальнікамі і абараняюць ад праблем, якія ўзнікаюць з-за нізкаўзроўневай працы з памяццю, такіх як зварот да вобласці памяці пасля яе вызвалення, разнайменаванне нулявых паказальнікаў, вынахад за межы буфера і да т.п. Для распаўсюджвання бібліятэк, забеспячэнні зборкі і кіраванні залежнасцямі праектам развіваецца пакетны мэнэджар Cargo. Для размяшчэння бібліятэк падтрымліваецца рэпазітар crates.io.

Бяспечная праца з памяццю забяспечваецца ў Rust падчас кампіляцыі праз праверку спасылак, адсочванне валодання аб'ектамі, улік часу жыцця аб'ектаў (вобласці бачнасці) і адзнаку карэктнасці доступу да памяці падчас выканання кода. Rust таксама дае сродкі для абароны ад цэлалікіх перапаўненняў, патрабуе абавязковай ініцыялізацыі значэнняў зменных перад выкарыстаннем, лепш апрацоўвае памылкі ў стандартнай бібліятэцы, ужывае канцэпцыю нязменнасці (immutable) спасылак і зменных па змаўчанні, прапануе моцную статычную тыпізацыю для мінімізацыі лагічных памылак.

Асноўныя навіны:

  • У пераліках з цэлалікавымі ўяўленнямі (атрыбутам «#[repr(Int)]») дазволена відавочнае ўказанне дыскрымінанта (нумары варыянту ў пераліку), нават калі пералік утрымлівае палі. #[repr(u8)] enum Foo { A(u8), # дыскрымінант 0 B(i8), # дыскрымінант 1 C(bool) = 42, # дыскрымінант 42 }
  • Дададзена функцыя core::hint::black_box, якая проста вяртае назад прынятае значэнне. Бо кампілятар лічыць, што дадзеная функцыя выконвае вызначанае дзеянне, функцыю black_box можна выкарыстоўваць для адключэння аптымізацыі кампілятарам цыклаў пры правядзенні тэставання прадукцыйнасці кода або пры вывучэнні генераванага машыннага кода (каб кампілятар не палічыў код невыкарыстоўваным і не прыбраў яго). Напрыклад, у прыкладзе ніжэй указанне black_box(v.as_ptr()) не дазваляе кампілятару лічыць, што вектар v не выкарыстоўваецца. use std::hint::black_box; fn push_cap(v: &mut Vec) { for i in 0..4 { v.push(i); black_box(v.as_ptr()); } }
  • У пакетным мэнэджары "cargo" прапанавана каманда "remove", якая дазваляе з каманднага радка выдаляць залежнасці з маніфеста Cargo.toml.
  • У разрад стабільных пераведзена новая порцыя API, у тым ліку стабілізаваны метады і рэалізацыі тыпажоў:
    • proc_macro::Span::source_text
    • u*::{checked_add_signed, overflowing_add_signed, saturating_add_signed, wrapping_add_signed}
    • i*::{checked_add_unsigned, overflowing_add_unsigned, saturating_add_unsigned, wrapping_add_unsigned}
    • i*::{checked_sub_unsigned, overflowing_sub_unsigned, saturating_sub_unsigned, wrapping_sub_unsigned}
    • BTreeSet::{first, last, pop_first, pop_last}
    • BTreeMap::{first_key_value, last_key_value, first_entry, last_entry, pop_first, pop_last}
    • Рэалізацыі Add AsFd для тыпаў блакіровак stdio пры ўжыванні WASI.
    • impl TryFrom > для Box<[T; N]>
    • core::hint::black_box
    • Duration::try_from_secs_{f32,f64}
    • Option::unzip
    • std::os::fd
  • У шаблонах дазволенае ўжыванне дыяпазонаў «..X» і «..=X».
  • Пры зборцы фронтэнда кампілятара rustc і бэкенда LLVM задзейнічаны рэжымы аптымізацыі LTO (Link Time Optimization) і BOLT (Binary Optimization and Layout Tool), якія дазваляюць павялічыць прадукцыйнасць выніковага кода і зменшыць спажыванне памяці.
  • Рэалізаваны трэці ўзровень падтрымкі для платформаў armv5te-none-eabi і thumbv5te-none-eabi. Трэці ўзровень мае на ўвазе базавую падтрымку, але без аўтаматызаванага тэсціравання, публікацыі афіцыйных зборак і праверкі магчымасці зборкі кода.
  • Дададзена падтрымка звязвання з універсальнымі бібліятэкамі macOS.

Дадаткова можна адзначыць уключэнне ў кодавую базу GCC фронтэнда кампілятара мовы Rust (gccrs). Франтэнд уключаны ў галіну GCC 13, рэліз якой адбудзецца ў маі 2023 года. Пачынальна з GCC 13 штатны інструментар GCC зможа выкарыстоўвацца для кампіляцыі праграм на мове Rust без неабходнасці ўсталёўкі кампілятара rustc, пабудаванага з выкарыстаннем напрацовак LLVM. Рэалізацыя Rust у GCC 13 будзе мець статут бэта-версіі, не ўключанай па змаўчанні.

Крыніца: opennet.ru

Дадаць каментар