De release van de programmeertaal Rust 1.86 is gepubliceerd. Deze taal, oorspronkelijk ontwikkeld door Mozilla, wordt nu beheerd door de onafhankelijke non-profitorganisatie Rust Foundation. Rust richt zich op veilig geheugenbeheer en biedt middelen voor hoge paralleliteit bij het uitvoeren van taken, zonder gebruik te maken van garbage collection en runtime (runtime is beperkt tot de basisinitialisatie en het onderhoud 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:
- Ondersteuning voor upcasting van traits naar basis supertraits is toegevoegd, wat betekent dat het nu mogelijk is om een referentie naar een trait-object direct om te zetten naar een referentie naar een supertrait-object, zonder dat een speciale methode in de trait hoeft te worden gemaakt die een referentie naar het supertrait retourneert. Een soortgelijke operatie kan ook worden uitgevoerd met andere soorten slimme pointers, bijvoorbeeld 'Arc<dyn Trait> -> Arc<dyn Supertrait>' en '*const dyn Trait -> *const dyn Supertrait'. trait Trait: Supertrait {} trait Supertrait {} fn upcast(x: &dyn Trait) -> &dyn Supertrait { x }
- In HashMap en slices is de methode get_disjoint_mut() toegevoegd voor het gelijktijdig verkrijgen van meerdere wijzigbare referenties naar elementen. Voorheen stond de borrow checker niet toe dat referenties, verkregen via de methode get_mut(), gelijktijdig werden gebruikt. 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]);
- Het is toegestaan om safe-functies te markeren met de attribuut '#[target_feature]', dat aangeeft dat de functie gebruikmaakt van specifieke CPU-mogelijkheden. Een safe-functie gemarkeerd met '#[target_feature]' kan door een andere safe-functie veilig worden aangeroepen, op voorwaarde dat deze ook gemarkeerd is met '#[target_feature]' (anders moeten dergelijke functies in een unsafe-blok worden aangeroepen). Ze kunnen niet worden doorgegeven aan functies die generieke parameters accepteren die beperkt zijn tot traits Fn*. Voorheen kon de attribuut '#[target_feature]' alleen worden toegepast op functies die als 'unsafe' waren gemarkeerd. #[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(); }; } }
- De Rust-compiler bevat debug-asserts die ervoor zorgen dat een pointer geen NULL-waarde bevat bij het lezen en schrijven van niet-NULL-grootten, evenals bij het opnieuw lenen van de pointer naar een referentie. Bijvoorbeeld, met ingeschakelde debug-controles zal de onderstaande code nu resulteren in een āpanicā-toestand: let _x = *std::ptr::null::(); let _x = &*std::ptr::null::();
- Standaard is de lint-controle 'missing_abi' ingeschakeld, die een waarschuwing geeft als er na het sleutelwoord extern geen ABI is opgegeven. Voorheen werd aangenomen dat ABI 'C' werd gebruikt als er na extern geen ABI was opgegeven. Het wordt nu aanbevolen om expliciet ABI 'C' op te geven, bijvoorbeeld 'extern "C" {}' en 'extern "C" fn'.
- Een nieuwe lading API's is gestabiliseerd, inclusief gestabiliseerde methoden en implementaties van 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
- De eigenschap "const" is toegepast in de functies:
- 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
- Derde niveau ondersteuning is geïmplementeerd voor de platforms {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 en thumbv7a-nuttx-{eabi,eabihf}. Het derde niveau houdt basisondersteuning in, maar zonder geautomatiseerde tests, publicatie van officiële builds en controle van de mogelijkheid om code te bouwen.
- Er is een waarschuwing toegevoegd voor het stopzetten van de tweede niveau ondersteuning voor het doelsysteem i586-pc-windows-msvc in de volgende release (1.87). Het wordt aanbevolen om het platform i686-pc-windows-msvc te gebruiken, dat ondersteuning biedt voor SSE2-instructies. Het platform i586-pc-windows-msvc heeft zijn nut verloren, aangezien Windows 10 ondersteuning voor SSE2 vereist en eerdere versies van Windows in Rust niet worden ondersteund.
Bovendien kan worden opgemerkt dat het bedrijf Ferrocene de specificatie voor de programmeertaal Rust (FLS - Ferrocene Language Specification) aan de gemeenschap heeft overgedragen, die is ontwikkeld tijdens de creatie van zijn Rust-compiler voor kritische systemen en periodiek is gesynchroniseerd met de actuele toestand van de hoofd-Rust-compiler. De FLS-specificatie bevat een gestructureerde en gedetailleerde handleiding voor de syntaxis, semantiek en het gedrag van Rust, geschikt voor verificatie, compatibiliteitsbeoordeling en standaardisatie.
De verstrekte materialen zullen worden gebruikt om een referentiespecificatie voor de programmeertaal Rust te creƫren, die kan worden gebruikt bij de ontwikkeling van alternatieve compilers en voor de controle van de compiler in gebieden die cruciaal zijn voor de veiligheid.
Bron: opennet.ru
