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

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

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

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

  • Стабілізаваны новы сінтаксіс асінхроннага праграмавання, заснаваны на функцыі "async", блоку async move {...} і аператару ".await", якія спрашчаюць напісанне апрацоўшчыкаў, якія не блакуюць асноўны струмень каманд. У параўнанні з раней прапанаваным API для асінхроннага ўводу/высновы канструкцыі async/.await простыя для ўспрымання, добра чытэльныя і дазваляюць рэалізоўваць складаныя асінхронныя ўзаемадзеянні з выкарыстаннем звыклых прыёмаў кіравання струменем выканання на аснове цыклаў, умоўных аператараў і выключэнняў.

    Сінтаксіс Async-await дазваляе ствараць функцыі, якія могуць прыпыняць сваё выкананне, вяртаць кіраванне ў асноўны струмень, а затым аднаўляць выкананне з таго месца, дзе яны былі спыненыя. Напрыклад, падобнае прыпыненне запатрабавана пры апрацоўцы ўводу/высновы, у якім падчас чакання паступлення чарговай порцыі дадзеных можна выконваць іншую працу. Функцыі і блокі, вызначаныя праз "async fn" і "async move", вяртаюць тыпаж будучыню, Які вызначае ўяўленне адкладзенага на будучыню асінхроннага вылічэнні. Непасрэдна ініцыяваць адкладзенае вылічэнне і атрымаць вынік можна пры дапамозе аператара ".await". Да выкліку ".await" ніякіх дзеянняў не вырабляецца і не плануецца загадзя, што дазваляе ствараць складаныя ўкладзеныя канструкцыі без дадатковых накладных выдаткаў.

    async fn first_function() -> u32 { .. }
    ...
    let future = first_function();
    ...
    let result: u32 = future.await;

  • Стабілізаваны "#![feature(bind_by_move_pattern_guards)]", які дазваляе выкарыстоўваць зменныя з тыпам прывязкі "by-move» у шаблонах і выкарыстоўваць спасылкі на гэтыя зменныя ў секцыі «if» выразы «адпавядаць“. Напрыклад, зараз дапушчальныя наступныя канструкцыі:

    fn асноўны() {
    let array: Box<[u8; 4]> = Box::new([1, 2, 3, 4]);

    match array {
    нумары
    if nums.iter().sum::() == 10

    => {
    drop(nums);
    }
    _ => unreachable!(),
    }
    }

  • Дазволена ўказанне атрыбутаў пры вызначэнні параметраў функцый, замыканняў і паказальнікаў на функцыі. Падтрымліваюцца атрыбуты ўмоўнай кампіляцыі (cfg, cfg_attr), якія кіруюць дыягностыкай праз lint (allow, warn, deny і forbid) і дапаможныя атрыбуты выкліку макрасаў.

    fn len(
    #[cfg(windows)] slice: &[u16], // выкарыстоўваць параметр у Windows
    #[cfg(not(windows))] slice: &[u8], // выкарыстоўваць у астатніх АС
    ) -> usize {
    slice.len()
    }

  • Папярэджанні аб праблемах, выяўленых пры праверцы запазычання зменных (borrow checker) з выкарыстаннем тэхнікі NLL (Non-Lexical Lifetimes), перакладзены у разрад фатальных памылак. Нагадаем, што сістэма праверкі на аснове новага механізму ўліку часу жыцця запазычаных зменных дала магчымасць выяўляць некаторыя праблемы, якія заставаліся незаўважанымі старым кодам праверкі. Так як выснова памылкі для падобных праверак мог паўплываць на сумяшчальнасць з раней які працуе кодам, замест памылак першыя часы выдаваліся папярэджанні. Цяпер пры працы ў рэжыме Rust 2018 папярэджанні заменены на памылкі. У наступным выпуску вывад памылкі таксама будзе рэалізаваны ў рэжыме Rust 2015, што дазволіць канчаткова пазбавіцца ад старога borrow checker;
  • Прыкмета "const", якая вызначае магчымасць выкарыстання ў любым кантэксце замест канстант, ужыты для функцый Vec::new, String::new, LinkedList::new, str::len, [T]::len, str::as_bytes,
    abs, wrapping_abs і overflowing_abs;

  • У разрад стабільных пераведзена новая порцыя API, у тым ліку стабілізаваны метады
    Pin::into_inner, Instant::checked_duration_since і Instant::saturating_duration_since;

  • У пакетны мэнэджар cargo дададзена магчымасць выкарыстання для файлаў канфігурацыі пашырэння ".toml". Дададзена папярэдняя падтрымка зборкі стандартнай бібліятэкі непасрэдна з Cargo. Дададзены сцяг "-workspace", які замяніў неадназначна ўспрыманы сцяг "-all". У метададзеныя дададзена новае поле.апублікаваць«, якое дазваляе публікаваць залежнасці, паказваючы тэг у git і нумар версіі. Дададзена тэставая опцыя "-Ztimings" для генерацыі HTML-справаздачы аб часе выканання розных стадый кампіляцыі.
  • У кампілятары rustc у дыягнастычных паведамленнях уключана абразанне хвастоў кода, які не змяшчаецца ў тэрмінал. Забяспечаны трэці ўзровень падтрымкі мэтавых платформ
    i686-unknown-uefi і sparc64-unknown-openbsd. Трэці ўзровень мае на ўвазе базавую падтрымку, але без аўтаматызаванага тэсціравання і публікацыі афіцыйных зборак.

Крыніца: opennet.ru

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