Rust 1.34 Programlingvo-Eldono

La sistema programlingvo Rust 1.34, evoluigita de la projekto Mozilla, estis publikigita. La lingvo temigas memorsekurecon, disponigas aŭtomatan memoradministradon, kaj disponigas rimedon por atingi altan taskan paralelecon sen uzado de rubkolektanto aŭ rultempo.

La aŭtomata memoradministrado de Rust liberigas la ellaboranton de montrilo-manipulado kaj protektas kontraŭ problemoj ekestiĝantaj de malaltnivela memormanipulado, kiel ekzemple post-liberaj memoraliroj, nulaj montriloj dereferences, bufrotranspaso, kaj similaĵo. Por distribui bibliotekojn, certigi muntadon kaj administri dependecojn, la projekto disvolvas la Cargo-pakaĵadministranton, kiu ebligas al vi akiri la bibliotekojn necesajn por la programo per unu klako. La deponejo crates.io estas subtenata por gastigado de bibliotekoj.

Ĉefaj novigoj:

  • La administranto de pakaĵoj de Cargo aldonis ilojn por labori kun alternativaj pakaj registroj, kiuj povas kunekzisti kun la publika registro crates.io. Ekzemple, programistoj de proprietaj aplikoj nun povas uzi sian propran privatan registron, kiu povas esti uzata dum listigo de dependecoj en Cargo.toml, kaj apliki versionan modelon similan al crates.io por siaj produktoj, kaj ankaŭ referenci dependecojn al ambaŭ kestoj. io kaj al via propra registro.

    Por aldoni eksteran registron al ~/.cargo/config
    nova opcio "mia-registro" estas provizita en la sekcio "[registrioj]", kaj opcio "alia-kesto" estis aldonita por mencii la eksteran registron en dependecoj en Cargo.toml en la sekcio "[dependecoj]". Por konektiĝi al plia registro, simple metu la aŭtentikigilon en la ~/.cargo/credentials-dosieron kaj rulu la komandon
    "ŝarĝo ensaluto --registry=my-registry" kaj por eldoni pakaĵon -
    "cargo publish -registry=mia-registro";

  • Aldonita plena subteno por uzado de la "?" operatoro. en doctests, kiuj permesas al vi uzi ekzemplokodon el la dokumentaro kiel testojn. Antaŭe funkciigisto
    "?" povus esti uzata por trakti erarojn dum testa ekzekuto nur en la ĉeesto de la funkcio “fn main()” aŭ en la funkcioj “#[testo]”;

  • En kutimaj atributoj difinitaj per proceduraj makrooj, eblas uzi arbitrajn arojn de ĵetonoj ("#[attr($tokens)]", "#[attr[$tokens]] kaj #[attr{$tokens}]"). Antaŭe, elementoj povus esti specifitaj nur en arbo/rekursiva formo uzante ĉenvortaĵojn, ekzemple “#[foo(bar, baz(quux, foo = “bar”)]”, sed nun eblas uzi listojn (' #[gamo(0. .10)]') kaj konstruoj kiel “#[bindita(T: MiaTrajto)]”;
  • La TryFrom kaj TryInto-trajtoj estis stabiligitaj, permesante tipkonvertojn kun erartraktado. Ekzemple, metodoj kiel from_be_bytes kun entjerspecoj uzas tabelojn kiel enigaĵon, sed la datumoj ofte venas en Slice-tipo, kaj konvertado inter tabeloj kaj tranĉaĵoj estas problema por fari mane. Helpe de novaj trajtoj, la specifita operacio povas esti farita sur la flugo per alvoko al .try_into(), ekzemple, "let num = u32::from_be_bytes(slice.try_into()?)". Por konvertiĝoj kiuj ĉiam sukcesas (ekzemple, de tipo u8 ĝis u32), neerara tipo estis aldonita por permesi travideblan uzon de
    TryFrom por ĉiuj ekzistantaj efektivigoj de "De";

  • Malrekomendita la CommandExt::before_exec funkcio, kiu permesis ekzekuton de prizorganto antaŭ exec kiu estis efektivigita en la kunteksto de infana procezo forkigita post la fork() voko. Sub tiaj kondiĉoj, kelkaj resursoj de la gepatra procezo, kiel ekzemple dosierpriskribiloj kaj mapitaj memorareoj, povus esti duobligitaj, kio povus konduki al nedifinita konduto kaj malĝusta funkciado de bibliotekoj.
    Anstataŭ antaŭ_exec, oni rekomendas uzi la nesekuran funkcion CommandExt::pre_exec.

  • Stabiligitaj subskribitaj kaj sensignaj atomaj entjeroj kiuj iras en grandeco de 8 ĝis 64 bitoj (ekzemple, AtomicU8), same kiel subskribitaj tipoj NonZeroI[8|16|32|54|128].
  • Nova parto de la API estis movita al la stabila kategorio, inkluzive de Any::type_id, Error::type_id, slice::sort_by_cached_key, str::escape_*, str::split_ascii_whitespace, Instant::checked_[add|sub ] kaj SystemTime metodoj estis stabiligitaj ::checked_[add|sub]. La funkcioj iter::from_fn kaj iter::posteuloj estis stabiligitaj;
  • Por ĉiuj entjeroj, la checked_pow, saturating_pow, wrapping_pow kaj overflowing_pow metodoj estas efektivigitaj;
  • Aldonis la kapablon ebligi optimumigojn ĉe la ligofazo specifante la konstruopcion "-C linker-plugin-lto" (rustc kompilas Rust-kodon en LLVM-bitkodon, kio permesas apliki LTO-optimumigojn).

fonto: opennet.ru

Aldoni komenton