Udgivelsen af programmeringssproget Rust 1.86 er offentliggjort. Det er et generelt programmeringssprog, der er baseret på Mozilla-projektet, men som nu udvikles under ledelse af den uafhængige nonprofitorganisation Rust Foundation. Sproget fokuserer på sikker hukommelsesadministration og giver værktøjer til at opnå høj parallellisme ved udførelse af opgaver, alt imens det undgår brugen af en garbage collector og runtime (runtime er begrænset til grundlæggende initialisering og vedligeholdelse af standardbiblioteket).
Metoder til hukommelsesarbejde i Rust befrier udviklere fra fejl ved manipulation af pekere og beskytter mod problemer, der opstår ved lavniveau håndtering af hukommelse, såsom adgang til hukommelsesområder efter frigivelse, dereferering af nulpekere, buffer-overløb osv. For distribution af biblioteker, byggeprocesser og afhængighedsstyring udvikles pakkehåndteringssystemet Cargo. For opbevaring af biblioteker understøttes repository'et crates.io.
Sikker håndtering af hukommelse sikres i Rust under kompilering ved referencekontrol, sporing af ejerskab af objekter, hensyntagen til livstid af objekter (synlighed) og vurdering af korrekt adgang til hukommelse under kodeudførelse. Rust tilbyder også midler til beskyttelse mod heltals-overløb, kræver obligatorisk initialisering af variabelværdier før brug, håndterer fejl bedre i standardbiblioteket, anvender konceptet med uforanderlige (immutable) referencer og variabler som standard og tilbyder stærk statisk typisering for at minimere logiske fejl.
Hovednyhederne:
- Der er tilføjet understøttelse for opcasting af traits til den grundlæggende supertrait, hvilket betyder, at det nu er muligt at konvertere et trait-objektreference direkte til en supertrait-referencen uden at skulle oprette en særlig metode i traitet, der returnerer en reference til supertraitet. En lignende operation kan udføres med andre typer smarte pegere, f.eks. "Arc<dyn Trait> -> Arc<dyn Supertrait>" og "*const dyn Trait -> *const dyn Supertrait". trait Trait: Supertrait {} trait Supertrait {} fn upcast(x: &dyn Trait) -> &dyn Supertrait { x }
- Der er tilføjet metoden get_disjoint_mut() til HashMap og slices, som muliggør samtidig modtagelse af flere mutable referencer til elementer. Tidligere tillod borrow checker ikke samtidig brug af referencer, der blev modtaget ved hjælp af metoden get_mut(). let v = &mut [1, 2, 3]; if let Ok([a, b]) = v.get_disjoint_mut([0, 2]) { *a = 413; *b = 612; } assert_eq!(v, &[413, 2, 612]); if let Ok([a, b]) = v.get_disjoint_mut([0..1, 1..3]) { a[0] = 8; b[0] = 88; b[1] = 888; } assert_eq!(v, &[8, 88, 888]);
- Det er nu tilladt at markere safe-funktioner med attributten "#[target_feature]", som indikerer, at funktionen bruger bestemte CPU-funktioner. En safe-funktion, der er markeret med "#[target_feature]", kan kun kaldes sikkert af en anden safe-funktion, hvis denne også er markeret med "#[target_feature]" (ellers skal sådanne funktioner kaldes inde i en unsafe-blok). Desuden kan de ikke videregives til funktioner, der accepterer generiske (generic) parametre, der er begrænset af traits Fn*. Tidligere kunne attributten "#[target_feature]" kun anvendes på funktioner markeret som "unsafe". #[target_feature(enable = "avx2")] fn requires_avx2() { \/\/ … } #[target_feature(enable = "avx2")] fn safe_callsite() { requires_avx2(); } fn unsafe_callsite() { if is_x86_feature_detected!("avx2") { unsafe { requires_avx2() }; } }
- Rust-compileret inkluderer indsprøjtning af debug-checks (debug-assert), hvilket sikrer, at en peger ikke indeholder NULL ved læsning og skrivning af ikke-null størrelser, samt ved genlåning (reborrow) af pekeren til en reference. For eksempel, når debug-checks er aktiveret, vil den følgende kode nu føre til en "panic"-tilstand: let _x = *std::ptr::null::(); let _x = &*std::ptr::null::();
- Som standard er lint-checken "missing_abi" aktiveret, hvilket giver en advarsel, hvis der ikke er angivet en ABI efter nøgleordet extern. Tidligere, hvis der ikke blev angivet en ABI efter extern, blev det antaget at bruge ABI "C". Nu anbefales det at angive ABI "C" eksplicit, for eksempel ‘extern
- En ny batch af API'er er blevet klassificeret som stabile, herunder stabilisering af metoder og implementeringer af traits:
- {float}::next_down
- {float}::next_up
- ::get_disjoint_mut
- ::get_disjoint_unchecked_mut
- slice::GetDisjointMutError
- HashMap::get_disjoint_mut
- HashMap::get_disjoint_unchecked_mut
- NonZero::count_ones
- Vec::pop_if
- sync::Once::wait
- sync::Once::wait_force
- sync::OnceLock::wait
- Flagget «const» anvendt i funktionerne:
- hint::black_box
- io::Cursor::get_mut
- io::Cursor::set_position
- str::is_char_boundary
- str::split_at
- str::split_at_checked
- str::split_at_mut
- str::split_at_mut_checked
- Der er implementeret tredje niveau af support for platforme {aarch64-unknown,x86_64-pc}-nto-qnx710_iosock, {aarch64-unknown,x86_64-pc}-nto-qnx800, {x86_64,i686}-win7-windows-gnu, amdgcn-amd-amdhsa, x86_64-pc-cygwin, {mips,mipsel}-mti-none-elf, m68k-unknown-none-elf, armv7a-nuttx-{eabi,eabihf}, aarch64-unknown-nuttx og thumbv7a-nuttx-{eabi,eabihf}. Tredje niveau indebærer grundlæggende støtte, men uden automatiserede tests, offentliggørelse af officielle builds og kontrol af kodekompileringsmuligheder.
- Der er tilføjet en advarsel om afskaffelse af det andet supportniveau for målplatformen i586-pc-windows-msvc i den kommende udgave (1.87). Det anbefales at bruge platformen i686-pc-windows-msvc, som adskiller sig ved at støtte SSE2-instruktioner. Platformen i586-pc-windows-msvc er blevet meningsløs, da Windows 10 kræver støtte til SSE2, og tidligere versioner af Windows i Rust understøttes ikke.
Yderligere kan det nævnes, at selskabet Ferrocene har overført specifikationen for Rust-sproget (FLS — Ferrocene Language Specification) til fællesskabet, som blev oprettet under udviklingen af deres Rust-compiler til kritiske systemer og periodisk synkroniseret med den aktuelle tilstand af hoved-Rust-kompilatoren. FLS-specifikationen indeholder en struktureret og detaljeret vejledning om syntaks, semantik og adfærd af Rust, velegnet til verifikation, vurdering af kompatibilitet og standardisering.
De overførte materialer vil blive brugt til at skabe en reference-specifikation for Rust-sproget, som kan anvendes ved udvikling af alternative compilere og til test af compilere inden for områder, der er kritiske i forhold til sikkerhed.
Kilde: opennet.ru
