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

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

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

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

  • У пакетны мэнэджар Cargo дададзеныя сродкі для працы з альтэрнатыўнымі рэестрамі пакетаў, якія могуць суіснаваць з публічным рэестрам crates.io. Напрыклад, распрацоўнікі зачыненых прыкладанняў зараз могуць выкарыстоўваць уласны прыватны рэестр, які можна выкарыстоўваць пры пераліку залежнасцяў у Cargo.toml, і ўжываць для сваіх прадуктаў мадэль версіявання, падобную з crates.io, а таксама спасылацца ў залежнасцях як на crates.io, так і на ўласны рэестр.

    Для дадання вонкавых рэестраў у .cargo/config (размешчаным у $HOME альбо ў дырэкторыі з пакетам)
    прадугледжана секцыя "[registries]", а для выкарыстання знешняга рэестра ў апісанні кожнай залежнасці ў Cargo.toml з'явілася опцыя "registry". Для падлучэння да дадатковага рэестру дастаткова змясціць токен аўтэнтыфікацыі ў файл ~/.cargo/credentials і выканаць каманду
    "cargo login -registry=my-registry", а для публікацыі пакета -
    "cargo publish -registry=my-registry";

  • Дададзена паўнавартасная падтрымка выкарыстання аператара "?" у тэстах doctests, якія дазваляюць выкарыстоўваць код прыкладаў з дакументацыі ў якасці тэстаў. Раней аператар
    "?" можна было выкарыстоўваць для апрацоўкі памылак падчас выкананні тэстаў толькі пры наяўнасці функцыі «fn main()» або ў функцыях «#[test]»;

  • У вызначаных пры дапамозе працэдурных макрасаў уласных атрыбутах (custom attribute) забяспечана магчымасць выкарыстання адвольных набораў токенаў («#[attr($tokens)]», «#[attr[$tokens]] і #[attr{$tokens}]»). Раней элементы маглі задавацца толькі ў дрэвападобным/рэкурсіўным выглядзе з выкарыстаннем радковых літаралаў, напрыклад "#[foo(bar, baz(quux, foo = "bar"))]]", а зараз магчыма выкарыстанне пералічэнняў ('#[range(0.). .10)]') і канструкцый віду «#[bound(T: MyTrait)]»;
  • Стабілізаваны тыпажы (trait) TryFrom и TryInto, якія дазваляюць выконваць пераўтварэнні тыпаў з апрацоўкай памылак. Напрыклад, метады, падобныя from_be_bytes, з цэлалікавымі тыпамі ў якасці ўваходных дадзеных выкарыстоўваюць масівы, але дадзеныя часта паступаюць c тыпам Slice, а пераўтварэнне паміж масівамі і слайсамі праблематычна рабіць уручную. Пры дапамозе новых тыпажоў паказаная аперацыя можа быць здзейснена на лёце праз выклік .try_into(), напрыклад, "let num = u32::from_be_bytes(slice.try_into()?)". Для пераўтварэнняў, якія заўсёды завяршаюцца паспяхова (напрыклад, з тыпу u8 у u32) дададзены тып памылак бясхібным, які дазваляе празрыста выкарыстоўваць
    TryFrom для ўсіх існуючых рэалізацый "From";

  • Аб'яўлена састарэлай функцыя CommandExt::before_exec, якая дазваляла выканаць апрацоўшчык перад запускам exec, які выконваўся ў кантэксце даччынага працэсу, адгалінаванага пасля выкліку fork(). У падобных умовах некаторыя рэсурсы бацькоўскага працэсу, такія як файлавыя дэскрыптары і адлюстраваныя вобласці памяці, маглі быць дубляваныя, што магло прывесці да нявызначаных паводзін і няправільнай працы бібліятэк.
    Замест before_exec рэкамендуецца выкарыстоўваць unsafe-функцыю CommandExt::pre_exec.

  • Стабілізаваны знакавыя і беззнакавыя атамарныя цэлалікавыя тыпы памерам ад 8 да 64 біт (напрыклад, AtomicU8), а таксама знакавыя тыпы NonZeroI[8|16|32|64|128].
  • У разрад стабільных перакладзена новая порцыя API, у тым ліку стабілізаваныя метады: ::checked_[add|sub]. Стабілізаваны функцыі iter::from_fn і iter::successors;
  • Для ўсіх цэлалікіх тыпаў рэалізаваны метады checked_pow, saturating_pow, wrapping_pow і overflowing_pow;
  • Дададзена магчымасць уключэння аптымізацый на этапе звязвання праз указанне зборачнай опцыі "-C linker-plugin-lto".

Крыніца: opennet.ru

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