Rust 1.34 programmeringsspråkutgivelse

Systemprogrammeringsspråket Rust 1.34, utviklet av Mozilla-prosjektet, har blitt utgitt. Språket fokuserer på minnesikkerhet, gir automatisk minnehåndtering og gir et middel for å oppnå høy oppgaveparallellisme uten å bruke en søppeloppsamler eller kjøretid.

Rusts automatiske minnebehandling frigjør utvikleren fra pekermanipulasjon og beskytter mot problemer som oppstår fra lavnivå minnemanipulering, for eksempel etterfrie minnetilganger, null-pekerdereferanser, bufferoverskridelser og lignende. For å distribuere biblioteker, sikre montering og administrere avhengigheter, utvikler prosjektet Cargo package manager, som lar deg få bibliotekene som trengs for programmet med ett klikk. Crates.io-depotet støttes for hosting av biblioteker.

Hovedinnovasjoner:

  • Cargo-pakkebehandleren har lagt til verktøy for å jobbe med alternative pakkeregistre som kan eksistere side om side med det offentlige crates.io-registeret. For eksempel kan utviklere av proprietære applikasjoner nå bruke sitt eget private register, som kan brukes når de noterer avhengigheter i Cargo.toml, og bruke en versjonsmodell som ligner på crates.io for sine produkter, samt henvise avhengigheter til begge kassene. io og til ditt eget register.

    For å legge til et eksternt register til ~/.cargo/config
    et nytt alternativ "mitt register" er gitt i "[registre]"-delen, og et "annet-kasse"-alternativ er lagt til for å nevne det eksterne registeret i avhengigheter i Cargo.toml i "[avhengigheter]"-delen. For å koble til et ekstra register, plasser ganske enkelt autentiseringstokenet i ~/.cargo/credentials-filen og kjør kommandoen
    "cargo login --registry=my-registry" og for å publisere en pakke -
    "last publisere -registry=mitt-registret";

  • Lagt til full støtte for bruk av "?"-operatøren. i doctests, som lar deg bruke eksempelkode fra dokumentasjonen som tester. Tidligere operatør
    "?" kan brukes til å håndtere feil under testkjøring bare i nærvær av "fn main()"-funksjonen eller i "#[test]"-funksjonene;

  • I egendefinerte attributter definert ved hjelp av prosedyremakroer, er det mulig å bruke vilkårlige sett med tokens ("#[attr($tokens)]", "#[attr[$tokens]] og #[attr{$tokens}]") . Tidligere kunne elementer bare spesifiseres i et tre/rekursiv form ved å bruke strengliteraler, for eksempel “#[foo(bar, baz(quux, foo = “bar”))]”, men nå er det mulig å bruke oppregninger (' #[range(0. .10)]') og konstruksjoner som “#[bound(T: MyTrait)]”;
  • TryFrom- og TryInto-trekkene har blitt stabilisert, noe som tillater typekonverteringer med feilhåndtering. For eksempel, metoder som from_be_bytes med heltallstyper bruker arrays som input, men dataene kommer ofte i en Slice-type, og konvertering mellom arrays og slices er problematisk å gjøre manuelt. Ved hjelp av nye egenskaper kan den spesifiserte operasjonen utføres på farten gjennom et kall til .try_into(), for eksempel "let num = u32::from_be_bytes(slice.try_into()?)". For konverteringer som alltid lykkes (for eksempel fra type u8 til u32), er det lagt til en Ufeilbarlig feiltype for å tillate transparent bruk av
    TryFrom for alle eksisterende implementeringer av "Fra";

  • Avviklet CommandExt::before_exec-funksjonen, som tillot utførelse av en behandler før exec som ble utført i konteksten av en underordnet prosess forked etter fork()-kallet. Under slike forhold kan noen ressurser i den overordnede prosessen, som filbeskrivelser og kartlagte minneområder, dupliseres, noe som kan føre til udefinert oppførsel og feil drift av biblioteker.
    I stedet for before_exec, anbefales det å bruke den usikre funksjonen CommandExt::pre_exec.

  • Stabiliserte signerte og usignerte atomære heltallstyper som varierer i størrelse fra 8 til 64 biter (for eksempel AtomicU8), samt signerte typer NonZeroI[8|16|32|54|128].
  • En ny del av API-en har blitt flyttet til den stabile kategorien, inkludert Any::type_id, Error::type_id, slice::sort_by_cached_key, str::escape_*, str::split_ascii_whitespace, Instant::checked_[add|sub] ] og SystemTime-metodene er stabilisert ::checked_[add|sub]. Iter::from_fn og iter::successors funksjonene har blitt stabilisert;
  • For alle heltallstyper er metodene checked_pow, saturating_pow, wrapping_pow og overflowing_pow implementert;
  • Lagt til muligheten til å aktivere optimaliseringer på koblingsstadiet ved å spesifisere "-C linker-plugin-lto" byggealternativet (rustc kompilerer Rust-kode til LLVM-bitkode, som lar LTO-optimaliseringer brukes).

Kilde: opennet.ru

Legg til en kommentar