Rust 1.38 programmeringsspråkutgivelse

publisert utgivelse av systemprogrammeringsspråk Rust 1.38, grunnlagt av Mozilla-prosjektet. Språket fokuserer på minnesikkerhet, gir automatisk minnehåndtering og gir et middel til å 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. En pakkebehandler utvikles for å distribuere biblioteker, sikre montering og administrere avhengigheter av prosjektet. Cargo, slik at du kan få bibliotekene som trengs for programmet med ett klikk. Et depot støttes for å være vert for biblioteker kasser.io.

Den viktigste innovasjoner:

  • Lagt til en pipelinet kompileringsmodus (pipelined), der byggingen av en avhengig kassepakke begynner så snart avhengighetsmetadataene blir tilgjengelige, uten å vente på at kompileringen skal fullføres. Når du kompilerer en pakke, trenger ikke avhengighetene å være fullstendig sammensatt, bare å definere metadataene, som inkluderer lister over typer, avhengigheter og eksporterte elementer. Metadata gjøres tilgjengelig tidlig i kompileringsprosessen, så koblede pakker kan nå kompileres mye tidligere. Når du bygger enkeltpakker, påvirker ikke den foreslåtte modusen ytelsen, men hvis bygget dekker pakker med forgrenede avhengigheter, kan den totale byggetiden reduseres med 10-20 %;
  • Sikrer oppdagelse av feil bruk av funksjoner std::mem::uinitialisert и std::mem::nullet. For eksempel er std::mem::uninitialized praktisk for raskt å lage arrays, men det villeder kompilatoren fordi det ser ut til å være initialisert, men i virkeligheten forblir verdien uinitialisert. mem::uninitialized-funksjonen er allerede merket som utdatert, og det anbefales å bruke en mellomtype i stedet Kanskje Unit. Når det gjelder mem::zeroed, kan denne funksjonen forårsake problemer med typer som ikke kan akseptere nullverdier.

    For å hjelpe med å identifisere udefinert oppførsel, legger den nye utgivelsen til en lo-sjekk til kompilatoren som oppdager noen problemer med mem::uninitialized eller mem::null. For eksempel får du nå en feilmelding når du prøver å bruke mem::uninitialized eller mem::zeroed med typene &T og Box‹T›, som representerer pekerobjekter som ikke kan akseptere nullverdier;

  • «#[avviklet]»-attributtet har blitt utvidet for å tillate at kassepakker kan merkes som foreldet og planlegges for fremtidig sletting. Fra og med Rust 1.38 kan dette attributtet også brukes for makroer;
  • Lagt til muligheten til å bruke "#[global_allocator]"-attributtet i undermoduler;
  • Lagt til funksjon std::any::typenavn, som lar deg finne ut navnet på typen, noe som kan være nyttig for feilsøkingsformål. For eksempel, under programkjøring kan du finne ut for hvilken type funksjonen ble kalt:

    fn gen_verdi‹T: Standard>() -› T {
    println!("Initialiserer en forekomst av {}", std::any::typenavn::‹T›());
    Standard::default()
    }

    fn main() {
    la _: i32 = gen_verdi(); # "i32" vil bli skrevet ut
    la _: String = gen_verdi(); # vil skrive ut "alloc::string::String"
    }

  • Utvidede funksjoner til standardbiblioteket:
    • slice::{concat, connect, join} kan nå ta verdien &[T] i tillegg til &T;
    • "*const T" og "*mut T" implementerer nå markør::Unpin;
    • "Arc‹[T]›" og "Rc‹[T]›" implementerer nå FromIterator‹T›;
    • iter::{StepBy, Peekable, Take} implementerer nå DoubleEndedIterator.
    • ascii::EscapeDefault implementerer Clone and Display.
  • En ny del av API-er er overført til stabil-kategorien, inkludert metoder som er stabilisert
    • ‹*const T›::cast, ‹*mut T›::cast,
    • Duration::as_secs_f{32|64},
    • Duration::div_duration_f{32|64},
    • Duration::div_f{32|64},
    • Duration::from_secs_f{32|64},
    • Duration::mul_f{32|64},
    • divisjonsdrift med resten
      div_euclid og rem_euclid for alle heltallsprimitiver;

  • Lagt til støtte for å spesifisere "--funksjoner"-alternativet flere ganger for å aktivere forskjellige funksjoner i lastpakkebehandlingen;
  • Kompilatoren gir en tredje nivå støtte for målplattformer aarch64-uwp-windows-msvc, i686-uwp-windows-gnu, i686-uwp-windows-msvc, x86_64-uwp-windows-gnu, x86_64-uwp-windows-msvc-mål, armv7-unknown-linux -gnueabi, armv7-unknown-linux-musleabi, hexagon-unknown-linux-musl og riscv32i-unknown-none-elf. Det tredje nivået innebærer grunnleggende støtte, men uten automatisert testing og publisering av offisielle bygg.

Kilde: opennet.ru

Legg til en kommentar