Frigivelse af Rust 1.59 programmeringssproget med understøttelse af montageindsatser

Det generelle programmeringssprog Rust 1.59, grundlagt af Mozilla-projektet, men nu udviklet i regi af den uafhængige non-profit organisation Rust Foundation, er blevet frigivet. Sproget fokuserer på hukommelsessikkerhed og giver midlerne til at opnå høj jobparallelisme, samtidig med at man undgår brugen af ​​en skraldeopsamler og runtime (runtime reduceres til grundlæggende initialisering og vedligeholdelse af standardbiblioteket).

Rusts hukommelseshåndteringsmetoder sparer udvikleren for fejl ved manipulation af pointere og beskytter mod problemer, der opstår på grund af hukommelseshåndtering på lavt niveau, såsom adgang til et hukommelsesområde efter det er blevet frigivet, dereferencing af nul-pointere, bufferoverskridelser osv. For at distribuere biblioteker, levere builds og administrere afhængigheder udvikler projektet Cargo Package Manager. Crates.io-lageret understøttes til hosting af biblioteker.

Hukommelsessikkerhed er tilvejebragt i Rust på kompileringstidspunktet gennem referencekontrol, holde styr på objektejerskab, holde styr på objektlevetider (scopes) og vurdere rigtigheden af ​​hukommelsesadgang under kodeudførelse. Rust giver også beskyttelse mod heltalsoverløb, kræver obligatorisk initialisering af variabelværdier før brug, håndterer fejl bedre i standardbiblioteket, anvender konceptet med uforanderlige referencer og variabler som standard, tilbyder stærk statisk skrivning for at minimere logiske fejl.

Vigtigste innovationer:

  • Det er muligt at bruge assemblersprogsindlæg, som er efterspurgte i applikationer, der skal kontrollere udførelse på et lavt niveau eller kunne bruge specialiserede maskininstruktioner. Monteringsindlæg tilføjes ved hjælp af makroer "asm!" og "global_asm!" brug af strengformateringssyntaks til at navngive registre svarende til den, der bruges til strengerstatninger i Rust. Compileren understøtter monteringsinstruktioner til x86, x86-64, ARM, AArch64 og RISC-V arkitekturer. Eksempel på indsættelse: brug std::arch::asm; // Gang x med 6 ved hjælp af skift og add let mut x: u64 = 4; usikker { asm!( "mov {tmp}, {x}", "shl {tmp}, 1", "shl {x}, 2", "add {x}, {tmp}", x = inout(reg. ) x, tmp = out(reg) _, ); } assert_eq!(x, 4 * 6);
  • Tilføjet støtte til destrukturerede (parallelle) opgaver, hvor flere træk, udsnit eller strukturer er angivet i venstre side af udtrykket. For eksempel: lad (a, b, c, d, e); (a, b) = (1, 2); [c, .., d, _] = [1, 2, 3, 4, 5]; Struktur { e, .. } = Struktur { e: 5, f: 3 }; assert_eq!([1, 2, 1, 4, 5], [a, b, c, d, e]);
  • Det er muligt at angive standardværdier for const generics: struct ArrayStorage { arr: [T; N], } impl ArrayStorage { fn new(a: T, b: T) -> ArrayStorage { ArrayStorage { arr: [a, b], } } }
  • Cargo-pakkemanageren giver advarsler om brugen af ​​ugyldige strukturer i afhængigheder, der behandles på grund af fejl i compileren (f.eks. på grund af en fejl fik felter med pakkede strukturer lov til at blive lånt i sikre blokke). Sådanne konstruktioner vil ikke længere blive understøttet i en fremtidig version af Rust.
  • Cargo og rustc har en indbygget evne til at generere eksekverbare filer strippet for fejlfindingsdata (strip = "debuginfo") og symboler (strip = "symboler"), uden at det er nødvendigt at kalde et separat hjælpeprogram. Rengøringsindstillingen implementeres gennem parameteren "strip" i Cargo.toml: [profile.release] strip = "debuginfo", "symbols"
  • Inkrementel kompilering er som standard deaktiveret. Årsagen siges at være en midlertidig løsning for en fejl i compileren, der fører til nedbrud og deserialiseringsfejl. En fejlrettelse er allerede blevet forberedt og vil blive inkluderet i næste udgivelse. For at returnere trinvis kompilering kan du bruge miljøvariablen RUSTC_FORCE_INCREMENTAL=1.
  • En ny del af API'et er blevet flyttet til kategorien stabil, inklusive metoder og implementeringer af egenskaber er blevet stabiliseret:
    • std::tråd::tilgængelig_parallelisme
    • Resultat::kopieret
    • Resultat::klonet
    • arch::asm!
    • arch::global_asm!
    • ops::ControlFlow::is_break
    • ops::ControlFlow::is_continue
    • Prøv fra for u8
    • char::TryFromCharError (Clone, Debug, Display, PartialEq, Copy, Eq, Error)
    • iter::zip
    • NonZeroU8::is_power_of_two
    • NonZeroU16::is_power_of_two
    • NonZeroU32::is_power_of_two
    • NonZeroU64::is_power_of_two
    • NonZeroU128::is_power_of_two
    • DoubleEndedIterator til Tolowercase-struktur
    • DoubleEndedIterator for ToUppercase-struktur
    • Prøv Fra for [T; N]
    • UnwindSafe for the Once-strukturen
    • RefUnwindSafe for en gangs skyld
    • armv8 neon støttefunktioner indbygget i compileren til aarch64
  • "const"-attributten, som bestemmer muligheden for at bruge den i enhver sammenhæng i stedet for konstanter, bruges i funktionerne:
    • mem::MaybeUninit::as_ptr
    • mem::MaybeUninit::assume_init
    • mem::MaybeUninit::assume_init_ref
    • ffi::CStr::from_bytes_with_nul_unchecked

Kilde: opennet.ru

Tilføj en kommentar