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

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

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

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

  • Стабілізаваны тыпаж (trait) будучыню, які ўяўляе значэнне, вылічэнне якога магчыма яшчэ не завершана ў працэсе выкарыстання блокаў async / .await. Вызначаныя пры дапамозе Future асінхронныя значэнні даюць магчымасць працягнуць выкананне ў струмені карыснай працы, адначасна чакаючы завяршэнні вылічэнняў вызначанага значэння;
  • Стабілізавана бібліятэка вылучаць, якая прадстаўляе разумныя паказальнікі і калекцыі для кіравання якія размяшчаюцца ў памяці значэннямі. Для вылучэння памяці ў std зараз ужываецца тып Вец, Які рээкспартуюцца з alloc. Асобнае выкарыстанне alloc мае сэнс у дадатках не прывязаных да std («#![no_std]»), а таксама ў бібліятэках, разлічаных на ўжыванне ў падобных праграмах без std;
  • Для абыходу праверак карэктнай ініцыялізацыі значэнняў прапанаваны прамежкавы тып MaybeUninit, Які можна выкарыстоўваць замест функцыі mem::uninitialized, у якасці яе больш бяспечнай альтэрнатывы. Функцыя mem::uninitialized зручная для хуткага стварэння масіваў, але ўводзіць кампілятар у памылку, бо стварае бачнасць выканання ініцыялізацыі, але ў рэчаіснасці значэнне застаецца неініцыялізаваным. MaybeUninit дазваляе відавочна паказаць кампілятару, што значэнне неініцыялізавана, улічыць злучаныя з гэтым магчымыя нявызначаныя паводзіны, а таксама ў праграмах арганізаваць праверку праз «maybe_t:» і паэтапную ініцыялізацыю з пазнакай яе завяршэння пры дапамозе выкліку «.assume_init()». Са з'яўленнем MaybeUninit функцыя mem::uninitialized пераведзена ў разрад састарэлых і не рэкамендавана да выкарыстання;
  • Тэхніка NLL (Non-Lexical Lifetimes), якая пашырыла сістэму ўліку часу жыцця запазычаных зменных, стабілізаваная для мовы Rust 2015 (пачаткова NLL падтрымліваўся толькі Rust 2018). Замест прывязкі часу жыцця на лексічным узроўні, NLL ажыццяўляе ўлік на ўзроўні набору паказальнікаў у графе патоку выканання. Падобны падыход дазваляе павялічыць якасць праверкі запазычанні зменных (borrow checker) і дапусціць выкананне некаторых выглядаў карэктнага кода, выкарыстанне якога раней прыводзіла да высновы памылкі. Новыя паводзіны таксама істотна спрашчае адладку;
  • Уключана новая рэалізацыя асацыятыўных масіваў HashMap, заснаваная на прымяненні структуры Swiss Table (аўтаматычна загружаецца hashbrown::HashMap, калі відавочна не пазначана іншае, напрыклад, std::HashMap, які заснаваны на SipHash 1-3). Праграмны інтэрфейс застаўся ранейшым, а прыкметныя распрацоўніку адрознення зводзяцца да павелічэння прадукцыйнасці і зніжэнню спажывання памяці;
  • У пакетны менеджэр cargo дададзена опцыя «—offline», улучальная рэжым працы без звароту па сетцы, пры якім пры ўсталёўцы залежнасцяў выкарыстоўваюцца толькі пракэшаваныя ў лакальнай сістэме пакеты. Калі залежнасць адсутнічае ў лакальным кэшы, то будзе выведзена памылка. Для папярэдняй загрузкі залежнасцяў у лакальны кэш перад пераходам у offline можна выкарыстоўваць каманду "cargo fetch";
  • Рэалізавана магчымасць выкліку макраса "dbg!" з указаннем некалькіх аргументаў;
  • Прыкмета "const", які вызначае магчымасць выкарыстання ў любым кантэксце замест канстант, ужыты для метадаў.
    Layout::from_size_align_unchecked,
    mem::needs_drop,
    NonNull::dangling і
    NonNull::cast;

  • У разрад стабільных пераведзена новая порцыя API, у тым ліку стабілізаваны метады
    task::Waker, task::Poll,
    VecDeque::rotate_left, VecDeque::rotate_right,
    Read::read_vectored, Write::write_vectored,
    Iterator::copied,
    BorrowMut (для радкоў) і str::as_mut_ptr.

Крыніца: opennet.ru

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