Апублікаваны рэліз 1.45 мовы сістэмнага праграмавання Іржа, заснаванага праектам Mozilla. Мова сфакусаваная на бяспечнай працы з памяццю, забяспечвае аўтаматычнае кіраванне памяццю і дае сродкі для дасягнення высокага паралелізму выканання заданняў, пры гэтым абыходзячыся без выкарыстання зборшчыка смецця і час выканання.
Аўтаматычнае кіраванне памяццю ў Rust пазбаўляе распрацоўніка ад памылак пры маніпуляванні паказальнікамі і абараняе ад праблем, якія ўзнікаюць з-за нізкаўзроўневай працы з памяццю, такіх як зварот да вобласці памяці пасля яе вызвалення, разнайменаванне нулявых паказальнікаў, вынахад за межы буфера і да т.п. Для распаўсюджвання бібліятэк, забеспячэння зборкі і кіравання залежнасцямі праектам развіваецца пакетны менеджэр грузавы, які дазваляе атрымаць патрэбныя для праграмы бібліятэкі ў адзін клік. Для размяшчэння бібліятэк падтрымліваецца рэпазітар crates.io.
Ліквідавана даўняя недапрацоўка пры выкананні пераўтварэнняў паміж цэлымі лікамі і лікамі з плаваючай коскай. Так як кампілятар Rust выкарыстоўвае LLVM у якасці бэкенда, аперацыі пераўтварэнні тыпаў выконваліся праз інструкцыі прамежкавага кода LLVM, такія як fptoui, у якіх ёсць адна істотная асаблівасць - нявызначаныя паводзіны, калі выніковае значэнне не змяшчаецца ў мэтавай тып. Напрыклад, пры пераўтварэнні рэчавага значэння 300 з тыпам f32 у цэлы тып u8 вынік непрадказальны і можа адрознівацца на розных сістэмах. Праблема ў тым, што падобная асаблівасць выяўляецца ў кодзе, не пазначаным як "unsafe".
Пачынаючы з Rust 1.45 паводзіны пры перапаўненні памеру тыпу цвёрда рэгламентавана, а аперацыя пераўтварэння "as" выконвае праверку на перапаўненне і прыводзіць пераўтваральнае значэнне да максімальнага або мінімальнага значэння мэтавага тыпу (для вышэйадзначанага прыкладу значэнне 300 будзе пераўтворана ў 255). Для адключэння падобных праверак прадугледжаны дадатковыя выклікі API "{f64, f32}::to_int_unchecked", якія працуюць у рэжыме unsafe.
fn cast(x: f32) -> u8 {
x as u8
}
fn асноўны() {
let too_big = 300.0;
let too_small = -100.0;
let nan = f32::NAN;
let x: f32 = 1.0;
let y: u8 = unsafe { 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
}
Стабілізавана выкарыстанне працэдурных макрасаў, падобных на функцыі, у выразах, шаблонах і сцвярджэннях. Раней падобныя макрасы маглі выклікацца не ўсюды, а толькі ў пэўных частках кода (асобным выклікам, не пераплятаюцца з іншым кодам). Пашырэнне спосабаў выкліку макрасаў, падобных на функцыі, было адным з патрабавалася для забеспячэння працы web-фрэймворка. Ракета у стабільных выпусках Rust. Раней для дасягнення дадатковай гнуткасці задання апрацоўшчыкаў у Rocket патрабавалася ўключэнне эксперыментальнай магчымасці "proc_macro_hygiene", недаступнай у стабільных версіях Rust. Цяпер названая функцыянальнасць убудавана ў стабільныя выпускі мовы.
Дазволена выкарыстанне дыяпазонаў з тыпам "char" для перабору значэнняў дыяпазону (ops::{Range, RangeFrom, RangeFull, RangeInclusive, RangeTo}):
for ch in 'a'..='z' {
print!(«{}», ch);
}
println!(); // Будзе выведзена «abcdefghijklmnopqrstuvwxyz»
У разрад стабільных пераведзена новая порцыя API, у тым ліку стабілізаваны
Arc::as_ptr,
BTreeMap::remove_entry,
Rc::as_ptr,
rc::Weak::as_ptr,
rc::Weak::from_raw,
rc::Weak::into_raw,
str::strip_prefix,
str::strip_suffix,
sync::Weak::as_ptr,
sync::Weak::from_raw,
sync::Weak::into_raw,
char::UNICODE_VERSION,
Span::resolved_at,
Span::located_at,
Span::mixed_site,
unix::process::CommandExt::arg0.
У кампілятар rustc дададзеная падтрымка перавызначэння розных магчымасцяў мэтавай платформы пры дапамозе сцяга "target-feature", напрыклад, "-C target-feature=+avx2,+fma". Таксама дададзены новыя сцягі:
"force-unwind-tables" для генерацыі "раскручаных" (unwind) табліц выклікаў, незалежна ад стратэгіі апрацоўкі краху; "embed-bitcode" для кіравання ўключэннем біткода LLVM у генераваныя rlibs. Сцяг "embed-bitcode" па змаўчанні задзейнічаны ў Cargo для аптымізацыі часу зборкі і спажыванні дыскавай прасторы.
Забяспечаны трэці ўзровень падтрымай для платформаў mipsel-sony-psp і thumbv7a-uwp-windows-msvc. Трэці ўзровень мае на ўвазе базавую падтрымку, але без аўтаматызаванага тэсціравання і публікацыі афіцыйных зборак.
Дадаткова можна адзначыць аповяд аб стварэнні найпростага прыкладання на мове Rust, які стартуе пры дапамозе сістэмнага загрузніка і гатовага да самадастатковай загрузкі замест аперацыйнай сістэмы.
Артыкул з'яўляецца першым у серыі, прысвечаным дэманстрацыяй прыёмаў, запатрабаваных пры нізкаўзроўневым праграмаванні і распрацоўцы АС.