Rust 1.45 programmeringsspråkutgivelse

publisert utgivelse 1.45 av systemprogrammeringsspråket Rust, grunnlagt av Mozilla-prosjektet. Språket fokuserer på minnesikkerhet, gir automatisk minnehåndtering og gir verktøy for å oppnå høy oppgaveparallellisme uten å bruke en søppeloppsamler og runtime.

Rusts automatiske minnebehandling eliminerer feil ved manipulering av pekere og beskytter mot problemer som oppstår fra lavnivå minnemanipulering, som tilgang til et minneområde etter at det har blitt frigjort, null-pekereferanser, bufferoverskridelser, etc. 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:

  • Eliminert langvarig feil når du utfører konverteringer mellom heltall og flyttall. Siden Rust-kompilatoren bruker LLVM som backend, ble typekonverteringsoperasjoner utført gjennom LLVM-mellomkodeinstruksjoner som f.eks. fptoui, som har én betydelig funksjon - udefinert atferd hvis den resulterende verdien ikke passer inn i måltypen. For eksempel, når du konverterer flytverdien 300 med type f32 til heltallstype u8, er resultatet uforutsigbart og kan variere på forskjellige systemer. Problemet er at denne funksjonen vises i kode som ikke er merket som "utrygg".

    Fra Rust 1.45 er oppførselen til typestørrelsesoverløp strengt regulert, og konverteringsoperasjonen "som" sjekker for overløp og tvinger verdien som konverteres til maksimums- eller minimumsverdien for måltypen (for eksempelet ovenfor, en verdi på 300 vil bli konvertert til 255). For å deaktivere slike kontroller, tilbys flere API-kall «{f64, f32}::to_int_unchecked», som opererer i usikker modus.

    fn cast(x: f32) -> u8 {
    x som u8
    }

    fn main() {
    la too_big = 300.0;
    la too_small = -100.0;
    la nan = f32::NAN;

    la x: f32 = 1.0;
    la y: u8 = usikker { x.to_int_unchecked() };

    println!("for_big_casted = {}", cast(too_big)); // utgang 255
    println!("for_small_casted = {}", cast(for_small)); // utgang 0
    println!("not_a_number_casted = {}", cast(nan)); // utgang 0
    }

  • Bruk stabilisert prosedyremakroerfunksjonslignende uttrykk, maler og utsagn. Tidligere kunne slike makroer ikke kalles opp overalt, men bare i visse deler av koden (som et eget anrop, ikke sammenvevd med annen kode). Å utvide måten makroer kan kalles på, i likhet med funksjoner, var et av kravene for å få nettrammeverket til å fungere Rocket i stabile utgivelser av Rust. Tidligere krevde å oppnå ekstra fleksibilitet i å definere behandlere i Rocket aktivering av den eksperimentelle funksjonen "proc_macro_hygiene", som ikke er tilgjengelig i stabile versjoner av Rust. Denne funksjonaliteten er nå innebygd i stabile utgivelser av språket.
  • Tillatt å bruke områder med typen "char" for å iterere over områdeverdier (ops::{Range, RangeFrom, RangeFull, RangeInclusive, RangeTo}):

    for ch in 'a'..='z' {
    print!("{}", ch);
    }
    println!(); // Vil skrive ut "abcdefghijklmnopqrstuvwxyz"

  • En ny del av API-er er overført til stabil-kategorien, inkludert stabiliserte
    Arc::as_ptr,
    BTreeMap::remove_entry,
    Rc::as_ptr,
    rc::Svak::as_ptr,
    rc::Svak::fra_rå,
    rc::Weak::into_raw,
    str::strip_prefix,
    str::strip_suffix,
    sync::Svak::as_ptr,
    sync::Svak::fra_rå,
    sync::Weak::into_raw,
    char::UNICODE_VERSION,
    Span::resolved_at,
    Span::located_at,
    Span::mixed_site,
    unix::process::CommandExt::arg0.

  • Rustc-kompilatoren har lagt til støtte for å overstyre ulike målplattformfunksjoner ved å bruke "target-feature"-flagget, for eksempel "-C target-feature=+avx2,+fma". Nye flagg er også lagt til:
    "force-unwind-tables" for å generere unwind call-tabeller, uavhengig av krasjhåndteringsstrategien; "embed-bitcode" for å kontrollere om LLVM-bitkode er inkludert i genererte rlibs. "Embed-bitcode"-flagget er aktivert som standard i Cargo for å optimalisere byggetid og diskplassforbruk.

  • Et tredje nivå av støtte er gitt for mipsel-sony-psp og thumbv7a-uwp-windows-msvc-plattformene. Det tredje nivået innebærer grunnleggende støtte, men uten automatisert testing og publisering av offisielle bygg.

I tillegg kan det bemerkes historien om å lage det enkleste приложения på Rust-språket, begynner å bruke systemets bootloader og klar til selvstendig lasting i stedet for operativsystemet.
Artikkelen er den første i en serie dedikert til å demonstrere teknikker som er etterspurt innen programmering på lavt nivå og OS-utvikling.

Kilde: opennet.ru

Legg til en kommentar