De release van de algemene programmeertaal Rust 1.84 is uitgebracht. Deze taal, oorspronkelijk ontwikkeld door het Mozilla-project, wordt nu ondersteund door de onafhankelijke non-profitorganisatie Rust Foundation. De taal richt zich op veilige geheugenwerking en biedt middelen voor hoge parallelisatie van taakuitvoering, zonder gebruik te maken van garbage collection en runtime (de runtime bestaat uit 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 package manager Cargo is het mechanisme voor afhankelijkheidsbeheer gestabiliseerd, dat versies van afhankelijkheidscomponenten selecteert rekening houdend met de versies van de Rust-compiler, die door het project zijn opgegeven als minimaal ondersteunde versies (MSRV, Minimum Supported Rust Version). Deze nieuwe mogelijkheid maakt het voor ontwikkelaars gemakkelijker om handmatig kiezen van oudere versies van elke afhankelijkheid in projecten die compatibel blijven met oudere versies van de Rust-tools. De nieuwe modus voor het bepalen van afhankelijkheden wordt standaard ingeschakeld in Rust 1.85, maar is voorlopig beschikbaar als een optie door ‘incompatible-rust-versions = „fallback“‘ in de sectie “[resolver]” van het bestand “.cargo/config.toml” op te geven.
- De vertaling van de compiler naar een nieuwe typehandler (trait solver) is gestart, bedoeld voor het controleren van de toepassingsgrenzen van trait-types, het normaliseren van types en het evalueren van typecompatibiliteit. In versie 1.84 is de nieuwe handler ingezet voor de consistentiecontrole van trait-implementaties, dat wil zeggen, om te beoordelen of er niet meer dan één trait is voor het betreffende type in overweging nemend de code uit andere crate-pakketten. Deze controle heeft geholpen om problemen op te lossen in de oude implementatie van de typehandler die mogelijk leidde tot conflicten door de overlap van verschillende trait-implementaties.
- Een nieuwe API “Strikte Herkomst” is voorgesteld, die kan worden gebruikt om een pointer naar een geheel getal en terug te brengen, rekening houdend met de metadata die aan de pointer zijn gekoppeld met informatie over zijn afkomst en gebruiksgebied (naast het adres aan de pointer is een waarde “herkomst” gekoppeld met informatie over de relatie met andere pointers, die aangeeft waar en wanneer de pointer toegang kan krijgen tot het geheugen). Bij het omzetten van een pointer naar een geheel getal en terug ontstaat onvoorspelbaar gedrag vanwege de moeilijkheden bij het traceren van de oorsprong van de resulterende pointer. De nieuwe API maakt het mogelijk om low-level operaties met pointers uit te voeren, zoals het opslaan van extra informatie in de laagste bits van de pointer, zonder de pointer naar een geheel getal om te zetten.
- Een nieuwe lading API's is gestabiliseerd, inclusief gestabiliseerde methoden en implementaties van traits:
- Ipv6Addr::is_unique_local
- Ipv6Addr::is_unicast_link_local
- core::ptr::with_exposed_provenance
- core::ptr::with_exposed_provenance_mut
- ::addr
- ::expose_provenance
- ::with_addr
- ::map_addr
- ::isqrt
- ::checked_isqrt
- ::isqrt
- NonZero::isqrt
- core::ptr::without_provenance
- core::ptr::without_provenance_mut
- core::ptr::dangling
- core::ptr::dangling_mut
- Pin::as_deref_mut
- De eigenschap "const" is toegepast in de functies:
- AtomicBool::from_ptr
- AtomicPtr::from_ptr
- AtomicU8::from_ptr
- AtomicU16::from_ptr
- AtomicU32::from_ptr
- AtomicU64::from_ptr
- AtomicUsize::from_ptr
- AtomicI8::from_ptr
- AtomicI16::from_ptr
- AtomicI32::from_ptr
- AtomicI64::from_ptr
- AtomicIsize::from_ptr
- ::is_null
- ::as_ref
- ::as_mut
- Pin::new
- Pin::new_unchecked
- Pin::get_ref
- Pin::into_ref
- Pin::get_mut
- Pin::get_unchecked_mut
- Pin::static_ref
- Pin::static_mut
- De ondersteuning voor inline assemblage-invoegingen voor de s390x- en Arm64EC-architecturen is gestabiliseerd.
- Voor het doelsysteem WebAssembly is de ondersteuning voor multivalue-functionaliteit, referentietypen en tail-call gestabiliseerd.
- Een tweede niveau van ondersteuning voor het platform wasm32v1-none is geïmplementeerd. Dit tweede niveau van ondersteuning garandeert het bouwen.
Bovendien kunnen verschillende projecten die met Rust zijn verbonden worden opgemerkt:
- De release van het besturingssysteem Tock 2.2 is gepubliceerd, geschreven in de programmeertaal Rust en gericht op gebruik in microcontrollers. Het systeem maakt het mogelijk om gelijktijdig meerdere niet-vertrouwde applicaties uit te voeren op ingebedde apparaten met beperkte RAM, zoals sensoren, TPM (Trusted Platform Module), authenticatie sleutels en wearables. Ondersteunde platforms zijn microcontrollers gebaseerd op de ARM Cortex-M en RISC-V architecturen. Een belangrijk kenmerk van Tock is de isolatie van de applicatieniveaus, de kernel en de driverlaag, evenals de isolatie van elke applicatie en driver afzonderlijk. Voor isolatie worden zowel de mogelijkheden van de programmeertaal Rust als bescherming op geheugenbeschermingsniveau gebruikt.
- Het VEKOS-project (Verified Experimental Kernel OS) ontwikkelt de kernel van het besturingssysteem in de programmeertaal Rust, die verificatie van de uitvoerende componenten mogelijk maakt. Bij elke bewerking met het bestandssysteem, het aanmaken van een proces en het toewijzen van geheugen wordt een cryptografische bevestiging gevormd, waarmee de bewerking tijdens de uitvoering kan worden geverifieerd (de implementatie wordt vergeleken met het gebruik van blockchain voor het verifiëren van acties in een besturingssysteem). In het VKFS-bestandssysteem wordt een 'Merkle Tree'-structuur ingezet voor de integriteit en bescherming tegen retroactieve vervalsing, waarbij elke tak alle onderliggende takken en knooppunten verifieert door middel van boom-hashing. Geheugentoewijzing geschiedt in COW-modus (Copy-On-Write).
- Een groep onderzoekers van Microsoft en Inria ontwikkelt een subset van de C-taal — Mini-C, dat is ontworpen voor automatische translatie van programma's in de C-taal naar een weergave in de programmeertaal Rust. In tegenstelling tot de c2rust-compiler, maakt het nieuwe project het mogelijk om Rust-code te genereren zonder gebruik te maken van unsafe, maar richt het zich vooral op de omzetting van C-projecten die formele bewijzen van betrouwbaarheid hebben. Het wordt verondersteld gemakkelijker te zijn om een C-project eerst om te zetten naar een weergave in Mini-C, waarin geen wiskundige bewerkingen met pointers zijn toegestaan, dan om unsafe-blokken opnieuw te schrijven na directe compilatie van C naar Rust.
De implementatie van de compiler is gebaseerd op de KaRaMeL-toolset. Mini-C is ontwikkeld en getest in het kader van een project voor het herschrijven van de cryptografische bibliotheek HACL* naar Rust, waarvoor een formeel bewijs voor de betrouwbaarheid is geleverd. Dit bewijs is gebruikt om aan te tonen dat het mogelijk is om veilige code in Rust te genereren vanuit Mini-C.
- Daniel Stenberg, de auteur van de curl-tool, heeft de ontwikkeling en ondersteuning van het Curl-project, een alternatieve HTTP-backend geschreven in Rust met behulp van de Hyper-bibliotheek, stopgezet. Als reden werd het gebrek aan interesse van ontwikkelaars en gebruikers genoemd.
- De beta-release van de Fish 4.0 shell, herschreven in Rust, is aangekondigd. Het wordt opgemerkt dat na twee jaar ontwikkeling de codebasis van Fish volledig is overgezet van C++ naar Rust. De overstap naar Rust heeft geholpen om problemen met multi-threading op te lossen, moderne tools te verkrijgen die fouten tijdens de compilatie detecteren, de veiligheid van geheugengebruik te verbeteren en het project aantrekkelijker te maken voor nieuwe ontwikkelaars.
- Het Tor-project heeft de release van Arti 1.3.2 gepubliceerd, een alternatieve implementatie van de Tor-client in Rust. Arti biedt een inbeddable bibliotheek die door verschillende applicaties kan worden gebruikt. Bij de ontwikkeling van Arti is rekening gehouden met eerdere ervaringen met de ontwikkeling van Tor om bekende architecturale problemen te vermijden, het project modularer en efficiënter te maken. De tak 1.x is gemarkeerd als geschikt voor gebruik door gewone gebruikers en biedt hetzelfde niveau van privacy, gebruiksvriendelijkheid en stabiliteit als de oorspronkelijke implementatie in C. In de nieuwe versie is de ontwikkeling van RPC voortgezet, is voorbereid in de implementatie van ondersteuning voor relais en is er een bescherming tegen DoS-aanvallen op Onion-services toegevoegd.
- De release van de game-engine Bevy 0.15, geschreven in Rust, is gepubliceerd. In de engine wordt een datagestuurde model (Data Driven) voor het definiëren van game-logica toegepast, gebouwd bovenop een set kant-en-klare componenten van Bevy ECS (Entity Component System), die parallel kunnen worden uitgevoerd. 2D en 3D rendering, skeletanimatie, grafdefinitie, scene-generatiesysteem, framework voor het maken van gebruikersinterfaces, en aanpassing van scènes en middelen zonder opnieuw opstarten worden ondersteund.
- De console teksteditor Helix 25.01 is uitgebracht, geschreven in Rust en breidt de ideeën uit die zijn gelegd in vim en neovim. Integratie met LSP-servers en Tree-sitter wordt ondersteund, evenals het simultaan selecteren van meerdere blokken, het gebruik van meerdere cursors tijdens het bewerken, thema’s voor de interface en het debugprotocol DAP (Debug Adapter Protocol).
- De browserengine Servo, geschreven in Rust, heeft ondersteuning voor een donkere modus gekregen. De grootte van de browser ServoShell is met 20% verkleind. De ondersteuning voor webspecificaties is uitgebreid met de mogelijkheid om in te loggen en berichten in Discord te lezen (het verzenden van berichten is momenteel nog niet mogelijk).
- Mozilla heeft Uniffi for React Native geïntroduceerd, een toolkit voor het maken van modules voor React Native in de programmeertaal Rust.
- Er zijn prestaties van afbeeldingsencoders in PNG-formaat getest. De decoders in Rust (png, zune-png, wuffs) bleken sneller te zijn dan de decoders in C (libpng, spng, stb_image). Bijvoorbeeld, het crate-pakket png (image-rs) overtrof libpng met 1,8 keer op een x86-systeem en met 1,5 keer op een ARM-systeem. image-rs: 375.401 MP/s (gemiddeld) 318.632 MP/s (geomean) zune-png: 376.649 MP/s (gemiddeld) 302.529 MP/s (geomean) wuffs: 376.205 MP/s (gemiddeld) 287.181 MP/s (geomean) libpng: 208.906 MP/s (gemiddeld) 173.034 MP/s (geomean) spng: 299.515 MP/s (gemiddeld) 235.495 MP/s (geomean) stb_image: 234.353 MP/s (gemiddeld) 171.505 MP/s (geomean)
Bron: opennet.ru
