De release van de algemene programmeertaal Rust 1.82 is gepubliceerd, oorspronkelijk ontwikkeld door Mozilla, maar momenteel beheerd door de onafhankelijke non-profitorganisatie Rust Foundation. De taal richt zich op veilige geheugentoegang en biedt middelen voor hoge parallelle taakverwerking, zonder gebruik te maken van een garbage collector en runtime (de runtime beperkt zich tot basisinitialisatie en ondersteuning van de standaardbibliotheek).
Geheugenmethoden in Rust helpen ontwikkelaars om fouten bij het manipuleren van pointers te voorkomen en beschermen tegen problemen die voortkomen uit laag-niveau geheugenwerk, zoals toegang tot geheugen na vrijgave, derefereren van null pointers, buffer overflows, enz. Voor het verspreiden van bibliotheken, het garanderen van builds en het beheren van projectafhankelijkheden is er een pakketbeheerder genaamd Cargo ontwikkeld. Voor het plaatsen van bibliotheken wordt de repository crates.io ondersteund.
Veilige geheugenwerking in Rust wordt tijdens de compilatie gegarandeerd door middel van referentiecontrole, het bijhouden van eigenaarschap van objecten, het in acht nemen van de levensduur van objecten (scope) en het evalueren van toegangsrechten tot geheugen tijdens de uitvoering van code. Rust biedt ook middelen om integer-overflows te voorkomen, vereist dat waarden van variabelen voor gebruik worden geĆÆnitialiseerd, behandelt fouten beter in de standaardbibliotheek, past het concept van onveranderlijke (immutable) referenties en variabelen als standaard toe en biedt sterke statische type-onderzoek voor het minimaliseren van logische fouten.
Belangrijkste vernieuwingen:
- In de pakketbeheerder cargo is de opdracht 'info' toegevoegd voor het weergeven van informatie over het pakket in de repository.
- Ondersteuning voor de syntaxis 'use<..>' is toegevoegd aan 'impl Trait', die informatie definieert over verborgen types. Bijvoorbeeld, 'impl Trait + use<'x, T>' geeft aan dat alleen de parameters 'x' en 'T' in het verborgen type mogen worden gebruikt.
- Er is een aparte syntaxis voorgesteld voor het creƫren van raw pointers, ter vervanging van eerder gebruikte macro's: de macro 'addr_of!(expr)' is vervangen door de operator '&raw const expr', en de macro 'addr_of_mut!(expr)' is vervangen door de operator '&raw mut expr'. struct Packed { not_aligned_field: i32, } fn main() { let p = Packed { not_aligned_field: 1_82 }; \/\/ De oude manier om een raw pointer te maken let ptr = std::ptr::addr_of!(p.not_aligned_field); \/\/ De nieuwe manier om een raw pointer te maken let ptr = &raw const p.not_aligned_field; let val = unsafe { ptr.read_unaligned() }; }
- Het is nu mogelijk om veilige (safe) functies en constanten met een 'static' levensduur binnen extern-blokken met een 'unsafe' aanduiding te definiƫren (voorheen konden alle elementen in 'unsafe extern' alleen de 'unsafe' aanduiding hebben): unsafe extern { pub safe static TAU: f64; pub safe fn sqrt(x: f64) -> f64; pub unsafe fn strlen(p: *const u8) -> usize; }
- De attributen no_mangle, link_section en export_name, die kunnen leiden tot onbepaalbaar gedrag, worden nu als onveilig beschouwd en vereisen een expliciete aanduiding met 'unsafe', bijvoorbeeld: #[unsafe(no_mangle)] pub fn my_global_function() { }
- Bij patroonmatching is het toegestaan om lege types over te slaan, zoals 'enum Void {}' of structuren met een zichtbaar leeg veld. use std::convert::Infallible; pub fn unwrap_without_panic<T>(x: Result<T, Infallible>) -> T { let Ok(x) = x; \/\/ 'Err' kan worden overgeslagen x }
- In types voor drijvende komma getallen (f32 en f64) is het gedrag bij de verwerking van niet-getal waarden NaN (0.0/0.0) gestandaardiseerd, en daarnaast is het toestaan van drijvende komma operaties binnen const fn goedgekeurd.
- In assembly inserts, there is the possibility of using operands with the 'const' attribute for the direct use of integer values without prior saving in a register. const MSG: &str = "Hello, world!\n"; unsafe { core::arch::asm!( "mov rdx, {LEN} \/\/ the instruction 'mov rdx, 14' will be formed", LEN = const MSG.len(), ⦠); }
- Addressing expressions with the 'static' attribute is allowed in a safe context without defining an unsafe block (the operators '&raw mut' and '&raw const' do not affect the operandās value but create a pointer to it): static mut STATIC_MUT: Type = Type::new(); extern 'C' { static EXTERN_STATIC: Type; } fn main() { let static_mut_ptr = &raw mut STATIC_MUT; let extern_static_ptr = &raw const EXTERN_STATIC; }
- Een nieuwe lading API's is gestabiliseerd, inclusief gestabiliseerde methoden en implementaties van traits:
- std::thread::Builder::spawn_unchecked
- std::str::CharIndices::offset
- std::option::Option::is_none_or
- [T]::is_sorted
- [T]::is_sorted_by
- [T]::is_sorted_by_key
- Iterator::is_sorted
- Iterator::is_sorted_by
- Iterator::is_sorted_by_key
- std::future::Ready::into_inner
- std::iter::repeat_n
- impl DoubleEndedIterator for Take
Bron: opennet.ru
