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

Апублікаваны рэліз 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, які стартуе пры дапамозе сістэмнага загрузніка і гатовага да самадастатковай загрузкі замест аперацыйнай сістэмы.
Артыкул з'яўляецца першым у серыі, прысвечаным дэманстрацыяй прыёмаў, запатрабаваных пры нізкаўзроўневым праграмаванні і распрацоўцы АС.

Крыніца: opennet.ru

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