Rust 1.38 programmeringssprog udgivelse

offentliggjort frigivelse af systemprogrammeringssprog Rust 1.38, grundlagt af Mozilla-projektet. Sproget fokuserer på hukommelsessikkerhed, giver automatisk hukommelsesstyring og giver et middel til at opnå høj opgaveparallelisme uden at bruge en skraldeopsamler eller runtime.

Rusts automatiske hukommelseshåndtering sparer udvikleren for at manipulere pointere og beskytter mod problemer, der opstår som følge af manipulation af hukommelsen på lavt niveau, såsom adgang til et hukommelsesområde, efter at det er blevet frigivet, dereferencing af nul-pointere, bufferoverskridelser osv. For at distribuere biblioteker, sikre samling og administrere afhængigheder udvikler projektet en pakkemanager Last, som giver dig mulighed for at få de biblioteker, du skal bruge til programmet, med et enkelt klik. Et lager er understøttet til at være vært for biblioteker kasser.io.

The main innovationer:

  • Tilføjet en pipelinet kompileringstilstand (pipelinet), hvor opbygningen af ​​en afhængig kassepakke begynder, så snart afhængighedsmetadataene bliver tilgængelige, uden at vente på, at kompileringen er fuldført. Når du kompilerer en pakke, behøver afhængighederne ikke at være fuldstændigt samlet, blot definere metadataene, som inkluderer lister over typer, afhængigheder og eksporterede elementer. Metadata gøres tilgængelige tidligt i kompileringsprocessen, så linkede pakker kan nu kompileres meget tidligere. Når man bygger enkelte pakker, påvirker den foreslåede tilstand ikke ydeevnen, men hvis buildet dækker pakker med forgrenede afhængigheder, kan den samlede byggetid reduceres med 10-20 %;
  • Sikrer detektering af forkert brug af funktioner std::mem::uinitialiseret и std::mem::nulstillet. For eksempel er std::mem::uninitialized praktisk til hurtigt at oprette arrays, men det vildleder compileren, fordi det ser ud til at være initialiseret, men i virkeligheden forbliver værdien uinitialiseret. Funktionen mem::uninitialized er allerede markeret som forældet, og det anbefales at bruge en mellemtype i stedet Måske Unit. Hvad angår mem::zeroed, kan denne funktion forårsage problemer med typer, der ikke kan acceptere nulværdier.

    For at hjælpe med at identificere udefineret adfærd, tilføjer den nye udgivelse et fnug-tjek til compileren, der registrerer nogle problemer med mem::uninitialized eller mem::nulstillet. For eksempel får du nu en fejl, når du prøver at bruge mem::uninitialized eller mem::zeroed med typerne &T og Box‹T›, som repræsenterer pointer-objekter, der ikke kan acceptere null-værdier;

  • Attributten "#[forældet]" er blevet udvidet for at tillade kassepakker at blive markeret som forældede og planlagt til fremtidig sletning. Fra Rust 1.38 kan denne attribut også bruges til makroer;
  • Tilføjet muligheden for at bruge "#[global_allocator]" attributten i undermoduler;
  • Tilføjet funktion std::any::typenavn, som giver dig mulighed for at finde ud af navnet på typen, hvilket kan være nyttigt til fejlretningsformål. For eksempel kan du under programafvikling finde ud af, hvilken type funktionen blev kaldt:

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

    fn main() {
    lad _: i32 = gen_værdi(); # "i32" vil blive udskrevet
    lad _: String = gen_værdi(); # vil udskrive "alloc::string::String"
    }

  • Udvidede funktioner i standardbiblioteket:
    • slice::{concat, connect, join} kan nu tage værdien &[T] ud over &T;
    • "*const T" og "*mut T" implementerer nu markør::Unpin;
    • "Arc‹[T]›" og "Rc‹[T]›" implementerer nu FromIterator‹T›;
    • iter::{StepBy, Peekable, Take} implementer nu DoubleEndedIterator.
    • ascii::EscapeDefault implementerer Clone og Display.
  • En ny del af API'er er blevet overført til den stabile kategori, inklusive metoder, der er blevet stabiliseret
    • ‹*konst T›::cast, ‹*mut T›::cast,
    • Duration::as_secs_f{32|64},
    • Duration::div_duration_f{32|64},
    • Duration::div_f{32|64},
    • Varighed::fra_sekunder_f{32|64},
    • Duration::mul_f{32|64},
    • divisionsdrift med resten
      div_euclid og rem_euclid for alle heltals primitiver;

  • Tilføjet understøttelse for at specificere "--features"-muligheden flere gange for at aktivere forskellige funktioner i lastpakkehåndteringen;
  • Compileren giver en tredje niveau understøttelse af målplatforme aarch64-uwp-windows-msvc, i686-uwp-windows-gnu, i686-uwp-windows-msvc, x86_64-uwp-windows-gnu, x86_64-uwp-windows-msvc targets, armv7-unknown-linux -gnueabi, armv7-unknown-linux-musleabi, hexagon-unknown-linux-musl og riscv32i-unknown-none-elf. Det tredje niveau involverer grundlæggende support, men uden automatiseret test og offentliggørelse af officielle builds.

Kilde: opennet.ru

Tilføj en kommentar