Veröffentlichung von Rust 1.84. Tock- und Vekos-Kerne, die in Rust geschrieben sind. Mini-C-Dialekt

Die Veröffentlichung der Programmiersprache Rust 1.84, die ursprünglich von Mozilla entwickelt wurde, jetzt aber von der unabhängigen gemeinnützigen Organisation Rust Foundation weiterentwickelt wird, wurde bekannt gegeben. Die Sprache konzentriert sich auf sichere Speicherverwaltung und bietet Mittel zur Erreichung hoher Parallelität bei der Ausführung von Aufgaben, ohne einen Garbage Collector und eine Laufzeitumgebung zu benötigen (die Laufzeit beschränkt sich auf die grundlegende Initialisierung und die Begleitung der Standardbibliothek).

Die Methoden zur Speicherverwaltung in Rust befreien den Entwickler von Fehlern beim Umgang mit Zeigern und schützen vor Problemen, die durch niedrige Speicherverwaltung entstehen, wie z. B. den Zugriff auf Speicherbereiche nach deren Freigabe, Dereferenzierung von Nullzeigern, Pufferüberläufen usw. Zur Verbreitung von Bibliotheken, zur Gewährleistung des Builds und zur Verwaltung von Abhängigkeiten wird der Paketmanager Cargo entwickelt. Für das Hosting von Bibliotheken wird das Repository crates.io unterstützt.

Sichere Speicherverwaltung wird in Rust während der Kompilierung durch Überprüfung von Referenzen, Nachverfolgung des Eigentums an Objekten, Berücksichtigung der Lebensdauer von Objekten (Sichtbarkeitsbereiche) und Bewertung der Korrektheit des Zugriffs auf den Speicher während der Ausführung des Codes gewährleistet. Rust bietet ebenfalls Mittel zum Schutz vor Überläufen bei Ganzzahlen, fordert die zwingende Initialisierung von Variablenwerten vor deren Verwendung und behandelt Fehler in der Standardbibliothek besser. Außerdem wird das Konzept der Unveränderlichkeit (immutable) von Referenzen und Variablen standardmäßig angewendet, und es 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 kompatiblen Versionen des Rust-Compilers auswählt, die als minimal unterstützte Versionen (MSRV, Minimum Supported Rust Version) angegeben sind. Diese neue Funktion ermöglicht es Entwicklern, die manuelle Auswahl älterer Versionen jeder Abhängigkeit in Projekten zu vermeiden, die mit älteren Versionen des Rust-Toolsets kompatibel sind. Der neue Modus zur Bestimmung von Abhängigkeiten wird standardmäßig in der Veröffentlichung von Rust 1.85 aktiviert, ist aber vorerst als Option verfügbar, die in der Sektion „[resolver]“ der Datei „.cargo/config.toml“ mit ‚incompatible-rust-versions = „fallback“‘ festgelegt werden sollte.
  • Der Übersetzung des Compilers auf einen neuen Typbearbeiter (trait solver), der zur Überprüfung der Anwendbarkeit von Typen, zur Normalisierung von Typen und zur Bewertung der Typkompatibilität vorgesehen ist, wurde begonnen. In Version 1.84 wird der neue Bearbeiter zur Überprüfung der Konsistenz der Implementierungen von Typen verwendet, d.h. zur Bewertung der Existenz von nicht mehr als einem Typen für den betrachteten Typ unter Berücksichtigung von Code aus anderen crate-Paketen. Diese Überprüfung hat es ermöglicht, Probleme in der alten Implementierung des Typbearbeiters zu beseitigen, die potenziell zu Konflikten aufgrund von Überschneidungen verschiedener Typimplementierungen führen könnten.
  • Eine neue API "Strict Provenance" wurde vorgeschlagen, die verwendet werden kann, um einen Zeiger in eine ganze Zahl und zurück zu konvertieren, wobei die an den Zeiger angehängten Metadaten über dessen Herkunft und Anwendungsbereich berücksichtigt werden (neben der Adresse wird dem Zeiger der Wert "provenance" hinzugefügt, der Informationen über die Beziehung zu anderen Zeigern enthält, die bestimmen, wo und wann der Zeiger auf den Speicher zugreifen kann). Bei der Umwandlung des Zeigers in eine ganze Zahl und zurück tritt unbestimmtes Verhalten auf, da es problematisch ist, die Herkunft des resultierenden Zeigers nachzuvollziehen. Die neue API ermöglicht es, niedrigstufige Operationen mit Zeigern durchzuführen, wie zum Beispiel das Speichern zusätzlicher Informationen in den niederwertigen Bits des Zeigers, ohne den Zeiger in eine ganze Zahl zu konvertieren.
  • Eine neue Charge von APIs wurde in den stabilen Bereich überführt, darunter wurden Methoden und Implementierungen von Traits stabilisiert:
    • 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 Merkmal «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-Einfügungen für die Architekturen s390x und Arm64EC wurde stabilisiert.
  • Für die Zielplattform WebAssembly wurde die Unterstützung für die Funktionen multivalue, reference-types und tail-call stabilisiert.
  • Eine zweite Unterstützungsebene für die Plattform wasm32v1-none wurde implementiert. Die zweite Unterstützungsebene garantiert eine erfolgreiche Kompilierung.

Zusätzlich können mehrere Projekte erwähnt werden, die sich mit Rust beschäftigen:

  • Die Veröffentlichung des Betriebssystems Tock 2.2 wurde bekannt gegeben, das in Rust geschrieben ist und auf die Verwendung in Mikrocontrollern ausgerichtet ist. Das System ermöglicht die gleichzeitige Ausführung mehrerer nicht vertrauenswürdiger Anwendungen auf eingebetteten Geräten mit begrenztem RAM, wie Sensoren, TPM (Trusted Platform Module), Authentifizierungs-Tokens und tragbaren Geräten. Unterstützt werden Plattformen mit Mikrocontrollern auf Basis der ARM Cortex-M- und RISC-V-Architekturen. Ein zentrales Merkmal von Tock ist die Isolierung der Anwendungsebenen, des Kerns und der Treiberebene sowie die Isolierung jeder Anwendung und jedes Treibers einzeln. Zur Isolierung werden sowohl die Möglichkeiten der Programmiersprache Rust als auch der Schutz auf Speicherebene verwendet.
  • Das Projekt VEKOS (Verified Experimental Kernel OS) entwickelt einen Kernel des Betriebssystems in Rust, der die Verifizierung der ausgeführten Komponenten ermöglicht. Bei jeder Operation im Dateisystem, der Erstellung eines Prozesses und der Zuweisung von Speicher wird eine kryptografische Bestätigung erstellt, die es ermöglicht, die Operation zur Laufzeit zu verifizieren (die Umsetzung wird mit dem Einsatz von Blockchain zur Verifizierung von Aktionen im Betriebssystem verglichen). In dem Dateisystem VKFS wird zur Gewährleistung der Integrität und zum Schutz gegen nachträgliche Veränderungen die Struktur des "Merkle-Baums" (Merkle Tree) verwendet, bei der jeder Ast alle nachgeordneten Äste und Knoten verifiziert, dank baumartiger Hashing. 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 Compiler c2rust ermöglicht das neue Projekt die Generierung von Rust-Code ohne die Verwendung von unsafe, konzentriert sich jedoch hauptsächlich auf die Transformation von C-Projekten, die einen formalen Nachweis der Zuverlässigkeit haben. Es wird angenommen, dass es einfacher sein wird, ein C-Projekt zunächst in eine Mini-C-Darstellung zu übersetzen, in der arithmetische Operationen mit Zeigern nicht erlaubt sind, als unsafe-Blöcke nach einer direkten Kompilierung von C nach Rust neu zu schreiben.

    Die Implementierung des Compilers basiert auf dem KaRaMeL-Toolkit. Mini-C wurde im Rahmen eines Projekts zur Neuschreibung der kryptografischen Bibliothek HACL* in Rust entwickelt und getestet, für die ein formaler Nachweis der Zuverlässigkeit erbracht wurde. Ein solcher Nachweis wurde verwendet, um zu zeigen, dass aus Mini-C sicherer Rust-Code generiert werden kann.

  • Daniel Stenberg, der Autor des Tools curl, hat die Entwicklung und Unterstützung des Curl-Projekts für ein alternatives HTTP-Backend, das in Rust unter Verwendung der Bibliothek Hyper geschrieben wurde, eingestellt. Als Grund wurde das fehlende Interesse von Entwicklern und Benutzern angegeben.
  • Die Beta-Version der Kommandozeile Fish 4.0, die in Rust neu geschrieben wurde, wurde angekündigt. Nach zwei Jahren Entwicklung wurde der gesamte Code von Fish vollständig von C++ auf Rust umgestellt. Der Übergang zu Rust ermöglichte es, Probleme mit der Parallelität zu lösen, modernere Tools zur Fehlererkennung während der Kompilierung zu erhalten, die Sicherheit im Umgang mit dem Speicher zu erhöhen und das Projekt für neue Entwickler attraktiver zu machen.
  • Das Tor-Projekt hat die Version Arti 1.3.2 veröffentlicht, eine alternative Implementierung des Tor-Clients in Rust. Arti bietet eine einbettbare Bibliothek, die von verschiedenen Anwendungen verwendet werden kann. Bei der Erstellung von Arti wurde die frühere Erfahrung mit der Tor-Entwicklung berücksichtigt, um bekannte architektonische Probleme zu vermeiden, das Projekt modularer und effizienter zu gestalten. Die Branch 1.x wird als für normale Benutzer geeignet angesehen und bietet das gleiche Maß an Datenschutz, Benutzerfreundlichkeit und Stabilität wie die Hauptimplementierung in C. In der neuen Version wurde die Entwicklung von RPC fortgesetzt, die Vorbereitung zur Implementierung von Relais vorgenommen und Schutz gegen DoS-Angriffe auf Onion-Dienste hinzugefügt.
  • Die Veröffentlichung der Spiel-Engine Bevy 0.15, die in Rust geschrieben ist, wurde veröffentlicht. In der Engine wird ein datenzentriertes Modell (Data Driven) zur Definition der Spiel-Logik verwendet, das auf einem Satz fertiger Komponenten von Bevy ECS (Entity Component System) aufgebaut ist, die parallel ausgeführt werden können. 2D- und 3D-Rendering, Skelettanimation, Rendering-Graphen-Definition, ein System zur Szenengenerierung, ein Framework zur Erstellung von Benutzeroberflächen sowie Modifikationen von Szenen und Ressourcen ohne Neustart werden unterstützt.
  • Der Konsolen-Texteditor Helix 25.01 wurde veröffentlicht, geschrieben in Rust und erweitert die Ideen von vim und neovim. Die Integration mit LSP-Servern und Tree-sitter wird unterstützt, mehrere Blöcke können gleichzeitig hervorgehoben werden, es ist die Verwendung mehrerer Cursors beim Bearbeiten möglich, es gibt Gestaltungsthemen und ein Debugging-Protokoll nach DAP (Debug Adapter Protocol).
  • Die Browsing-Engine Servo, geschrieben in Rust, hat Unterstützung für den Dunkelmodus erhalten. Die Größe des Browsers ServoShell wurde um 20 % reduziert. Die Unterstützung von Web-Spezifikationen wurde auf die Möglichkeit des Einloggens und Lesens von Nachrichten in Discord ausgeweitet (das Senden von Nachrichten ist noch nicht möglich).
  • Die Firma Mozilla hat das Uniffi-Tool für React Native vorgestellt, um Module für React Native in Rust zu erstellen.
  • Es wurden Leistungstests für PNG-Bildencodierer durchgeführt. Die Dekodierer in Rust (png, zune-png, wuffs) waren schneller als die Dekodierer in C (libpng, spng, stb_image). Zum Beispiel übertraf das crate-Paket png (image-rs) libpng um das 1,8-fache auf einem x86-System und um das 1,5-fache auf einem ARM-System. 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

60GB SSD 8Gb DDR4