Rust 1.45 programmeringssprog udgivelse

offentliggjort udgivelse 1.45 af systemets programmeringssprog Rust, grundlagt af Mozilla-projektet. Sproget fokuserer på hukommelsessikkerhed, giver automatisk hukommelsesstyring og giver værktøjer til at opnå høj opgaveparallelisme uden at bruge en skraldeopsamler og runtime.

Rusts automatiske hukommelsesstyring eliminerer fejl ved manipulation af pointere og beskytter mod problemer, der opstår fra manipulation af hukommelsen på lavt niveau, såsom adgang til en hukommelsesregion, efter at den er blevet frigivet, nul pointer-dereferencer, bufferoverskridelser osv. En pakkemanager er ved at blive udviklet til at distribuere biblioteker, sikre samling og administrere afhængigheder af projektet. 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:

  • Elimineret langvarig fejl når du udfører omregninger mellem heltal og flydende kommatal. Da Rust-kompileren bruger LLVM som backend, blev typekonverteringsoperationer udført gennem LLVM-mellemkodeinstruktioner som f.eks. fptoui, som har én væsentlig funktion - udefineret adfærd, hvis den resulterende værdi ikke passer ind i måltypen. For eksempel, når man konverterer float-værdien 300 med type f32 til heltalstype u8, er resultatet uforudsigeligt og kan variere på forskellige systemer. Problemet er, at denne funktion vises i kode, der ikke er markeret som "usikker".

    Fra Rust 1.45 er opførselen af ​​typestørrelsesoverløb strengt reguleret, og "som"-konverteringsoperationen kontrollerer for overløb og tvinger værdien, der konverteres til maksimum- eller minimumværdien af ​​måltypen (for eksemplet ovenfor, en værdi på 300 ville blive konverteret til 255). For at deaktivere sådanne kontroller leveres yderligere API-kald "{f64, f32}::to_int_unchecked", som fungerer i usikker tilstand.

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

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

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

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

  • Brug stabiliseret proceduremæssige makroerfunktionslignende udtryk, skabeloner og udsagn. Tidligere kunne sådanne makroer ikke kaldes overalt, men kun i visse dele af koden (som et separat opkald, ikke sammenflettet med anden kode). Udvidelse af måden, makroer kan kaldes, i lighed med funktioner, var et af kravene for at få web-frameworket til at fungere Rocket i stabile udgivelser af Rust. Tidligere krævede opnåelse af yderligere fleksibilitet ved at definere handlere i Rocket at aktivere en eksperimentel funktion kaldet "proc_macro_hygiene", som ikke er tilgængelig i stabile versioner af Rust. Denne funktionalitet er nu indbygget i stabile udgivelser af sproget.
  • Tilladt at bruge områder med typen "char" til at iterere over intervalværdier (ops::{Range, RangeFrom, RangeFull, RangeInclusive, RangeTo}):

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

  • En ny del af API'er er blevet overført til den stabile kategori, inklusive stabiliseret
    Arc::as_ptr,
    BTreeMap::remove_entry,
    Rc::as_ptr,
    rc::Svag::as_ptr,
    rc::Svag::fra_rå,
    rc::Svag::into_raw,
    str::strip_prefix,
    str::strip_suffix,
    sync::Svag::as_ptr,
    sync::Svag::fra_rå,
    sync::Weak::into_raw,
    char::UNICODE_VERSION,
    Span::resolved_at,
    Span::located_at,
    Span::mixed_site,
    unix::proces::CommandExt::arg0.

  • Rustc-kompileren har tilføjet understøttelse til at tilsidesætte forskellige målplatformsfunktioner ved hjælp af "target-feature"-flaget, for eksempel "-C target-feature=+avx2,+fma". Nye flag er også blevet tilføjet:
    "force-unwind-tables" for at generere unwind-opkaldstabeller, uanset nedbrudshåndteringsstrategien; "embed-bitcode" for at kontrollere, om LLVM-bitkode er inkluderet i genererede rlibs. Flaget "embed-bitcode" er aktiveret som standard i Cargo for at optimere byggetid og diskpladsforbrug.

  • Et tredje niveau af support er blevet leveret til mipsel-sony-psp og thumbv7a-uwp-windows-msvc platformene. Det tredje niveau involverer grundlæggende support, men uden automatiseret test og offentliggørelse af officielle builds.

Derudover kan det bemærkes historien om at skabe det enkleste приложения på Rust-sproget, begynder at bruge systemets bootloader og klar til selvstændig indlæsning i stedet for operativsystemet.
Artiklen er den første i en serie dedikeret til at demonstrere teknikker, der er efterspurgte inden for programmering på lavt niveau og OS-udvikling.

Kilde: opennet.ru

Tilføj en kommentar