Die Version 1.84 der Programmiersprache Rust wurde veröffentlicht, die ursprünglich von Mozilla entwickelt wurde, aber jetzt von der unabhängigen, gemeinnützigen Rust Foundation weiterentwickelt wird. Die Sprache konzentriert sich auf sichere Speicherverwaltung und bietet Mittel zur Erreichung hoher Parallelität bei der Ausführung von Aufgaben, ohne dabei auf einen Garbage Collector und ein Runtime-System angewiesen zu sein (das Runtime beschränkt sich auf die grundlegende Initialisierung und die Wartung der Standardbibliothek).
Die Speicherverwaltungsmethoden in Rust befreien Entwickler von Fehlern beim Umgang mit Zeigern und schützen vor Problemen, die durch die Programmierung auf niedriger Ebene entstehen, wie z.B. den Zugriff auf freigegebenen Speicher, Dereferenzierung von Nullzeigern, Pufferüberläufe usw. Zur Verteilung von Bibliotheken, zur Gewährleistung des Builds und zum Management von Abhängigkeiten wird der Paketmanager Cargo entwickelt. Für die Bereitstellung von Bibliotheken wird das Repository crates.io unterstützt.
Die sichere Handhabung von Speicher in Rust wird während der Kompilierung durch die Überprüfung von Referenzen, das Verfolgen des Besitztums von Objekten, das Management der Lebensdauer von Objekten (Sichtbarkeitsbereiche) und die Bewertung der Korrektheit des Zugriffs auf den Speicher zur Laufzeit sichergestellt. Rust bietet außerdem Mechanismen zum Schutz vor ganzzahligen Überläufen, erfordert die verpflichtende Initialisierung von Variablenwerten vor der Verwendung, behandelt Fehler in der Standardbibliothek effektiver, implementiert das Konzept der Unveränderlichkeit (immutable) von Referenzen und Variablen standardmäßig und bietet eine starke statische Typisierung zur Minimierung logischer Fehler.
Hauptneuheiten:
- Im Paketmanager Cargo wurde der Mechanismus zur Verarbeitung von Abhängigkeiten stabilisiert, der Versionen abhängiger Komponenten unter Berücksichtigung der mit dem Projekt angegebenen minimal unterstützten Rust-Versionen (MSRV, Minimum Supported Rust Version) auswählt. Die neue Funktionalität ermöglicht es den Entwicklern, die mühsame manuelle Auswahl älterer Versionen jeder Abhängigkeit in Projekten, die mit älteren Versionen der Rust-Toolchain kompatibel bleiben, zu vermeiden. Der neue Modus zur Bestimmung von Abhängigkeiten wird standardmäßig in der Veröffentlichung von Rust 1.85 aktiv sein, ist jedoch derzeit als Option verfügbar. Um ihn in der Sektion „[resolver]“ der Datei „.cargo/config.toml“ zu aktivieren, sollte „incompatible-rust-versions = "fallback"“ angegeben werden.
- Die Übersetzung des Compilers auf einen neuen Typ-Handler (Trait Solver) wurde gestartet. Dieser ist dafür vorgesehen, die Anwendbarkeit von Traits zu prüfen, Typen zu normalisieren und die Kompatibilität von Typen zu bewerten. In Version 1.84 wird der neue Handler zur Überprüfung der Konsistenz von Trait-Implementierungen eingesetzt, also zur Beurteilung, ob für einen bestimmten Typ nicht mehr als ein Trait existiert, unter Berücksichtigung von Code aus anderen Crate-Paketen. Diese Überprüfung hat es ermöglicht, Probleme in der alten Implementierung des Typ-Handlers zu beseitigen, die potenziell zu Konflikten aufgrund von Überlappungen zwischen verschiedenen Trait-Implementierungen führen konnten.
- Eine neue API "Strict Provenance" wurde eingeführt, die es ermöglicht, einen Zeiger in eine Ganzzahl umzuwandeln und umgekehrt, wobei die an den Zeiger angehängten Metadaten, die Informationen über seine Herkunft und Nutzung enthalten, berücksichtigt werden. Zusätzlich zur Adresse wird ein "provenance"-Wert angehängt, der Informationen über die Verbindung zu anderen Zeigern bereitstellt und es ermöglicht zu bestimmen, wo und wann der Zeiger auf den Speicher zugreifen kann. Bei der Umwandlung des Zeigers in eine Ganzzahl und zurück kann unbestimmtes Verhalten auftreten, da es problematisch ist, die Herkunft des resultierenden Zeigers nachzuvollziehen. Die neue API ermöglicht es, Low-Level-Operationen mit Zeigern durchzuführen, wie zum Beispiel das Speichern zusätzlicher Informationen in den unteren Bits des Zeigers, ohne den Zeiger in eine Ganzzahl umzuwandeln.
- Eine neue Reihe von APIs wurde stabilisiert und in die stabile Version überführt, einschließlich stabilisierter Methoden und Implementierungen von 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
- Das Kennzeichen „const“ wird in Funktionen angewendet:
- 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
- Die Unterstützung für Inline-Assembler-Befehle für die Architekturen s390x und Arm64EC wurde stabilisiert.
- Für die Zielplattform WebAssembly wurde die Unterstützung von Mehrwerten, Referenztypen und Tail-Call stabilisiert.
- Die zweite Ebene der Unterstützung für die Plattform wasm32v1-none wurde implementiert. Die zweite Stufe der Unterstützung garantiert den Build.
Es gibt zudem einige Projekte in Verbindung mit Rust zu erwähnen:
- Die Version 2.2 des Betriebssystems Tock wurde veröffentlicht. Es wurde in Rust entwickelt und ist auf die Verwendung in Mikrocontrollern ausgerichtet. Das System ermöglicht die gleichzeitige Ausführung mehrerer nicht vertrauenswürdiger Anwendungen auf eingebetteten Geräten mit begrenztem RAM, wie z. B. Sensoren, TPM (Trusted Platform Module), Authentifizierungs-Token und tragbaren Geräten. Unterstützt werden Mikrocontroller-Plattformen basierend auf den Architekturen ARM Cortex-M und RISC-V. Ein Schlüsselmerkmal von Tock ist die Isolierung der Anwendungs-, Kernel- und Treiberebenen sowie die Isolierung jeder Anwendung und jedes Treibers separat. Für die Isolierung kommen sowohl die Möglichkeiten der Programmiersprache Rust als auch ein Trennungsmechanismus auf der Ebene des Speicherschutzes zum Einsatz.
- Das VEKOS-Projekt (Verified Experimental Kernel OS) entwickelt einen Betriebssystemkernel in der Programmiersprache Rust, der die Verifizierung ausgeführter Komponenten ermöglicht. Bei jeder Operation mit dem Dateisystem, der Erstellung eines Prozesses und der Speicherzuweisung wird ein kryptografischer Nachweis erstellt, der die Verifikation der Operation während der Ausführung ermöglicht (dies wird mit dem Einsatz von Blockchain zur Verifizierung von Aktionen im Betriebssystem verglichen). Im VKFS-Dateisystem wird zur Gewährleistung der Integrität und zum Schutz vor nachträglicher Manipulation die Merkle-Baum-Struktur eingesetzt, bei der jeder Zweig alle darunterliegenden Zweige und Knoten verifiziert, dank der baumstrukturierten Hashing-Technologie. Die Speicherzuweisung erfolgt im COW-Modus (Copy-On-Write).
- Eine Gruppe von Forschern von Microsoft und Inria entwickelt eine Teilmenge der Programmiersprache C – Mini-C, die für die automatische Übersetzung von C-Programmen in eine Rust-Darstellung vorgesehen ist. Im Gegensatz zum c2rust-Compiler ermöglicht das neue Projekt die Generierung von Rust-Code ohne unsafe, konzentriert sich jedoch hauptsächlich auf die Umwandlung von C-Projekten, die einen formalen Vertrauensbeweis besitzen. Es wird angenommen, dass es einfacher ist, ein C-Projekt zunächst in eine Darstellung auf Mini-C zu übersetzen, die arithmetische Operationen mit Zeigern ausschließt, als unsafe-Blöcke nach einer direkten Kompilierung von C nach Rust umzuschreiben.
Die Implementierung des Compilers basiert auf dem KaRaMeL-Toolset. Mini-C wurde im Rahmen eines Projekts zur Umprogrammierung der kryptografischen Bibliothek HACL* auf Rust entwickelt und getestet, für die ein formaler Vertrauensbeweis bereitgestellt wurde. Ein solcher Beweis wurde verwendet, um die Möglichkeit zu demonstrieren, aus Mini-C sicheren Rust-Code zu generieren.
- Daniel Stenberg, der Autor des Tools curl, hat die Entwicklung und Unterstützung des Curl-Projekts für einen alternativen HTTP-Backend, das in Rust unter Verwendung der Hyper-Bibliothek geschrieben wurde, eingestellt. Als Grund wurde das fehlende Interesse von Entwicklern und Nutzern angegeben.
- Die Beta-Version der Shell Fish 4.0, die in Rust neu geschrieben wurde, wurde angekündigt. Es wird hervorgehoben, dass nach zwei Jahren Entwicklung die Codebasis von Fish vollständig von C++ auf Rust umgestellt wurde. Der Wechsel zu Rust ermöglichte die Lösung von Problemen mit der Mehrfachausführung, die Nutzung moderner Werkzeuge zur Aufdeckung von Fehlern in der Kompilation, eine Verbesserung der Speichersicherheit und machte das Projekt insgesamt attraktiver für neue Entwickler.
- Das Tor-Projekt hat die Version Arti 1.3.2 veröffentlicht, eine alternative Implementierung des Tor-Clients in Rust. Arti bietet eine integrierbare Bibliothek, die von verschiedenen Anwendungen genutzt werden kann. Bei der Entwicklung von Arti wurde die frühere Erfahrung mit der Tor-Entwicklung berücksichtigt, um bekannte architektonische Probleme zu vermeiden und das Projekt modulare und effizienter zu gestalten. Die Version 1.x wird als geeignet für den Einsatz durch normale Benutzer angesehen und gewährleistet ein ähnliches Maß an Privatsphäre, Benutzerfreundlichkeit und Stabilität wie die Hauptimplementierung in C. In der neuen Version wurde die Entwicklung von RPC fortgesetzt, die Unterstützung für Relay-Implementierungen vorbereitet und ein Schutz gegen DoS-Angriffe auf Onion-Dienste hinzugefügt.
- Die Ausgabe der Spiel-Engine Bevy 0.15, die in Rust geschrieben ist, wurde veröffentlicht. In der Engine wird ein datenzentriertes Modell zur Definition der Spiel-Logik verwendet, das auf einer Reihe von fertigen Bevy ECS (Entity Component System) Komponenten basiert, die parallel ausgeführt werden können. 2D- und 3D-Rendering, Skelettanimation, Grafdefinition, Szenengestaltung, ein Framework zur Benutzeroberflächenerstellung sowie Änderungen an Szenen und Ressourcen ohne Notwendigkeit eines Neustarts werden unterstützt.
- Der konsolenbasierte Texteditor Helix 25.01, geschrieben in Rust, erweitert die Konzepte von vim und neovim. Die Integration mit LSP-Servern und Tree-sitter wird unterstützt, mehrere Blöcke können gleichzeitig ausgewählt werden, mehrere Cursors können beim Editieren verwendet werden, es gibt verschiedene Themen und das Debug-Protokoll DAP (Debug Adapter Protocol) wird ebenfalls unterstützt.
- Der Browser-Engine Servo, geschrieben in Rust, wurde die Unterstützung für einen Dunkelmodus hinzugefügt. Die Größe des Browsers ServoShell wurde um 20 % reduziert. Die Unterstützung für Web-Spezifikationen wurde auf die Möglichkeit erweitert, sich bei Discord einzuloggen und Nachrichten zu lesen (das Versenden von Nachrichten ist derzeit nicht möglich).
- Mozilla hat das Uniffi-Toolkit für React Native vorgestellt, um Module für React Native in Rust zu entwickeln.
- Es wurden Leistungstests für PNG-Bilddecoder durchgeführt. Die Decoder in Rust (png, zune-png, wuffs) waren schneller als die in C (libpng, spng, stb_image). So übertraf beispielsweise das Crate-Paket png (image-rs) libpng um den Faktor 1,8 auf x86-Systemen und um 1,5 auf ARM-Systemen. image-rs: 375,401 MP/s (Durchschnitt) 318,632 MP/s (geometrisches Mittel) zune-png: 376,649 MP/s (Durchschnitt) 302,529 MP/s (geometrisches Mittel) wuffs: 376,205 MP/s (Durchschnitt) 287,181 MP/s (geometrisches Mittel) libpng: 208,906 MP/s (Durchschnitt) 173,034 MP/s (geometrisches Mittel) spng: 299,515 MP/s (Durchschnitt) 235,495 MP/s (geometrisches Mittel) stb_image: 234,353 MP/s (Durchschnitt) 171,505 MP/s (geometrisches Mittel)
Quelle: opennet.ru
