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

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

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

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

  • Дададзена магчымасць пазнакі структур (struct) і пералічэнняў (enum c блокам Variant) пры дапамозе атрыбуту.#[non_exhaustive]«, які дазваляе у далейшым дадаваць новыя палі і варыянты ў абвешчаныя структуры і пералічэнні. Напрыклад, распрацоўнікі модуляў, якія маюць структуры з публічна абвешчанымі палямі, могуць выкарыстоўваць "#[non_exhaustive]" для пазнакі структур, у якіх у будучыні магчыма даданне новых палёў. Да гэтага часу ў падобнай сітуацыі распрацоўшчык змушаны быў выбіраць паміж прыватнай аб'явай палёў і прывязкай да нязменнага спісу палёў. Новы атрыбут здымае дадзенае абмежаванне і дазваляе ў будучыні дадаваць новыя палі без рызыкі парушэння працы раней сабранага знешняга кода. У crate-пакетах пры супастаўленнях варыянтаў у секцыі «match» патрабуецца відавочнае азначэнне маскі «_ => {…}», якая ахоплівае магчымыя будучыя палі, інакш пры даданні новых палёў будзе выводзіцца памылка.
  • Дададзена магчымасць выкліку працэдурнага макраса mac!() у кантэксце тыпу. Напрыклад, зараз можна пісаць "type Foo = expand_to_type!(bar);", калі "expand_to_type" працэдурны макрас.
  • У блоках "extern { … }" дададзена магчымасць выкарыстання працэдурных і атрыбутных макрасаў, у тым ліку макрасаў «bang!()», напрыклад:

    macro_rules! make_item { ($name:ident) => { fn $name(); } }

    extern {
    make_item!(alpha);
    make_item!(beta);
    }

    extern «C» {
    #[my_identity_macro] fn foo();
    }

  • У макрасах рэалізавана магчымасць генерацыі элементаў "macro_rules!". Генерацыя "macro_rules!" магчымая як у якія нагадваюць функцыі макрасах («mac!()»), так і ў макрасах у форме атрыбутаў («#[mac]»).
  • У элеменце супастаўлення $m:meta дададзена падтрымка адвольных значэнняў пералічэнняў токенаў («[TOKEN_STREAM]», «{TOKEN_STREAM}» і «(TOKEN_STREAM)), напрыклад:

    macro_rules! accept_meta { ($m:meta) => {} }
    accept_meta!( my:: path );
    accept_meta!( my::path = "lit" );
    accept_meta! (my:: path (abc));
    accept_meta!( my::path [ abc ] );
    accept_meta!( my::path { abc } );

  • У рэжыме Rust 2015 актываваная выснова памылкі для праблем, выяўленых пры праверцы запазычання зменных (borrow checker) з выкарыстаннем тэхнікі NLL (Non-Lexical Lifetimes). Раней папярэджанні былі заменены на памылкі пры працы ў рэжыме Rust 2018.
    Пасля распаўсюджвання змены і на рэжым Rust 2015 распрацоўшчыкі атрымалі магчымасць канчаткова пазбавіцца ад старога borrow checker.

    Нагадаем, што сістэма праверкі на аснове новага механізму ўліку часу жыцця запазычаных зменных дала магчымасць выяўляць некаторыя праблемы, якія заставаліся незаўважанымі старым кодам праверкі. Так як выснова памылкі для падобных праверак мог паўплываць на сумяшчальнасць з раней які працуе кодам, замест памылак першыя часы выдаваліся папярэджанні.

  • Прыкмета "const", вызначальны магчымасць выкарыстання ў любым кантэксце замест канстант, ужыты для функцыі is_power_of_two (для беззнакавых цэлых лікаў).
  • У разрад стабільных пераведзена новая порцыя API, у тым ліку стабілізаваныя макрас todo!() і метады slice::repeat, mem::take, BTreeMap::get_key_value, HashMap::get_key_value,
    Option::as_deref, Option::as_deref_mut, Option::flatten, UdpSocket::peer_addr, {f32,f64}::to_be_bytes, {f32,f64}::to_le_bytes,{f32,f64}::to_ne_bytes, { f32}::from_be_bytes, {f64,f32}::from_le_bytes, and {f64,f32}::from_ne_bytes.

  • У пакетным мэнэджэры cargo
    рэалізавана кэшаванне на дыску папярэджанняў кампілятара. У каманду «cargo metadata» дададзена опцыя «-filter-platform» для паказу ў графе дазволу залежнасцяў толькі пакетаў, прывязаных да названай мэтавай платформы. Дададзены параметр канфігурацыі http.ssl-version для вызначэння дапушчальных версій TLS.
    Дададзена магчымасць публікацыі секцыі «dev-dependencies» без указання ключа «version».

  • У кампілятары rustc забяспечаны трэці ўзровень падтрымкі мэтавых платформаў thumbv7neon-unknown-linux-musleabihf, aarch64-unknown-none-softfloat, mips64-unknown-linux-muslabi64 і mips64el-unknownbilin Трэці ўзровень мае на ўвазе базавую падтрымку, але без аўтаматызаванага тэсціравання і публікацыі афіцыйных зборак.

Крыніца: opennet.ru

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