Veröffentlichung von Rust 1.97. Die in Rust geschriebenen Kernels Zinnia und das P2P-System Iroh mit Schlüsseladressierung.

Die Version 1.97 der Programmiersprache Rust wurde veröffentlicht, die ursprünglich von Mozilla entwickelt, aber jetzt unter der Schirmherrschaft der unabhängigen gemeinnützigen Organisation Rust Foundation weiterentwickelt wird. Die Sprache konzentriert sich auf sicheren Umgang mit Speicher und bietet Mittel zur Erreichung hohen Parallelismus bei der Ausführung von Aufgaben, ohne auf Garbage Collection und Runtime zurückzugreifen (die Runtime beschränkt sich auf die grundlegende Initialisierung und Verwaltung der Standardbibliothek).

Die Methoden zur Arbeit mit Speicher in Rust zielen darauf ab, Fehler beim Umgang mit Zeigern zu vermeiden und Probleme zu verhindern, die durch die Low-Level-Arbeit mit Speicher entstehen, wie den Zugriff auf freigegebenen Speicher, Dereferenzierung nuller Zeiger, Pufferüberläufe usw. Zur Verbreitung von Bibliotheken, zur Sicherstellung der Kompilierung und zum Management von Abhängigkeiten wird der Paketmanager Cargo weiterentwickelt. Für die Bereitstellung 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:

  • Standardmäßig ist ein neues Dekorationsschema (Mangling) für Funktionsnamen, globale Variablen und Datentypen in den generierten Objekt- und Executable-Dateien aktiviert (-Csymbol-mangling-version=v0). Die Namen werden dekoriert, um Konflikte während der Linker-Phase verschiedener Programme zu vermeiden, indem ein spezifischer Kontext, wie der Modulpfad und der Name des crate-Pakets, angehängt wird.

    Das zuvor verwendete Dekorationsschema, das auf dem Itanium ABI basierte, hatte Mängel wie die Ersetzung von Generikaparamentern durch unleserliche Hashes sowie Teile des Compilers, die das Itanium ABI nicht verwendeten, was die Nutzung spezifischer Rust-Namensdekodierer erforderte. In Rust 1.97 ist standardmäßig ein Dekorationsschema implementiert, das speziell für Rust entwickelt wurde und die genannten Mängel nicht aufweist. Das alte Schema soll in einer der nächsten Versionen entfernt werden.

  • Der Paketmanager Cargo hat die Möglichkeit integriert, auf Warnungen, die der Compiler während des Builds ausgibt, zu reagieren. Eine Umgebungsvariable CARGO_BUILD_WARNINGS wurde hinzugefügt, die drei Werte annehmen kann: warn (Standard) — Ausgabe einer Warnung auf dem Bildschirm; allow — Unterdrückung von Warnhinweisen; deny — Behandlung von Warnungen als Fehler, die den Build stoppen.

    In früheren Versionen musste man zur Beendigung des Builds nach dem Ausgeben einer Warnung „-Dwarnings“ in RUSTFLAGS für den Compiler angeben. Bei einer Änderung von RUSTFLAGS betrachtete der Paketmanager Cargo den Build als neu, berücksichtigte nicht die im Cache gespeicherten Daten und kompiliert das gesamte Projekt von Grund auf neu. Die Verschiebung dieser Einstellung auf die Seite von Cargo schloss das Zurücksetzen des Caches und die Notwendigkeit einer vollständigen Neukompilierung bei Änderungen der Warnbehandlungsmodi aus und vereinfachte die Aktivierung der Behandlung von Warnungen als Fehler in Continuous-Integration-Systemen.

  • Bei der Zusammenstellung sind standardmäßig die vom Linker ausgegebenen Nachrichten aktiviert. Die Nachrichten werden in Form von Warnungen durch eine spezielle Lint-Regel «linker_messages» ausgegeben, die nicht zur Standardgruppe «warnings» gehört. Dabei filtert rustc Nachrichten heraus, die typischerweise falsche Alarme oder normales Verhalten darstellen, und lässt nur Warnungen übrig, die auf Probleme hinweisen können, wie beispielsweise Warnungen zu veralteten Optionen und unerwünschten Einstellungen. Zuvor wurden Informationen vom Linker nur bei einem fehlerhaften Abschluss angezeigt, während alle anderen Nachrichten verborgen blieben. Um das alte Verhalten wiederherzustellen, kann in Cargo.toml Folgendes hinzugefügt werden: [lints.rust] linker_messages = «allow»
  • Eine neue Charge von APIs wurde in den stabilen Bereich überführt, darunter wurden Methoden und Implementierungen von Traits stabilisiert:
    • Standard für RepeatN
    • Kopie für ffi::FromBytesUntilNulError
    • Send für std::fs::File für UEFI
    • ::isolate_highest_one
    • ::isolate_lowest_one
    • ::highest_one
    • ::lowest_one
    • ::bit_width
    • NonZero::isolate_highest_one
    • NonZero::isolate_lowest_one
    • NonZero::highest_one
    • NonZero::lowest_one
    • NonZero::bit_width
  • Das Attribut «const» wurde in der Methode char::is_control angewendet.

Zusätzlich können die kürzlich angekündigten Projekte und Veranstaltungen in Verbindung mit Rust hervorgehoben werden:

  • Das Projekt zinnia entwickelt ein modulares Unix-ähnliches Kernsystem, das in Rust geschrieben und unter der GPLv2-Lizenz vertrieben wird. Der Kernel unterstützt POSIX-Schnittstellen sowie einige Erweiterungen von BSD und Linux, wie epoll und timerfd. Für die Grafikdarstellung und Eingabeverwaltung stehen DRM-Treiber (Direct Rendering Manager) und evdev zur Verfügung. Die implementierte Funktionalität reicht aus, um die Desktop-Umgebung Xfce unter dem X-Server und dem Kompositor Server Weston auf Basis von Wayland auszuführen. Der Bootvorgang wird sowohl im Emulator QEMU als auch auf echter Hardware, wie dem Laptop ThinkPad E14 G7, unterstützt.
  • Die Kommunikationsbibliothek iroh 1.0 wurde vorgestellt, die es ermöglicht, Netzwerkverbindungen zwischen Anwendungen auf verschiedenen Hosts über kryptografische Schlüssel herzustellen, anstelle von IP-Adressen (es wird der Schlüssel angegeben, zu dem eine Verbindung hergestellt werden soll, und iroh findet den dazugehörigen Host und stellt eine verschlüsselte Verbindung unter Verwendung des QUIC-Protokolls her). Wo möglich, werden direkte P2P-Verbindungen hergestellt, aber wenn das nicht möglich ist, wird auf die Arbeit über Relais umgeschaltet, die auch zur Hostentdeckung nach Schlüsseln verwendet werden. Es ist möglich, ein eigenes Relais zu betreiben oder sich mit öffentlichen Relais zu verbinden, die von der Community unterstützt werden.

    Zu den erweiterten Funktionen gehören: Unterstützung von Multipath QUIC für die gleichzeitige Paketlieferung über mehrere Routen, die Möglichkeit, hinter NAT zu arbeiten, ein statischer Konfigurationsmodus zur Verbindung mit lokalen Geräten ohne Internetzugang, die Möglichkeit, in Intermediate Code WASM zu kompilieren, um ihn im Browser auszuführen, und Unterstützung bei der Erstellung von eigenen Transportprotokollen, z. B. für Verbindungen über Bluetooth, WiFi Aware oder LoRa. Der Code ist in Rust geschrieben und wird unter den Lizenzen Apache-2.0 und MIT vertrieben. Es sind Wrapper für Python, Node.js, Kotlin und Swift verfügbar.

  • Der Autor der serverseitigen JavaScript-Plattform Bun veröffentlichte einen Artikel zur Überarbeitung des Bun-Projekts von Zig auf Rust unter Verwendung des KI-Modells Claude Fable. Es wurde festgestellt, dass Bun 1.3.14 die letzte Version auf Zig sein wird und die nächste Version Bun 1.4.0 bereits auf Rust sein wird. Nach den durchgeführten Tests verbraucht die Version auf Rust deutlich weniger Speicher und ist 2-5 % schneller als die Version auf Zig. Die Größe der ausführbaren Datei in der Rust-Version wurde um 20 % reduziert.

Quelle: opennet.ru

60GB SSD 8Gb DDR4