Die Version 1.95 der Programmiersprache Rust wurde veröffentlicht. Das Projekt wurde ursprünglich von Mozilla ins Leben gerufen und wird jetzt unter der Schirmherrschaft der unabhängigen, gemeinnützigen Rust Foundation weiterentwickelt. Die Sprache konzentriert sich auf eine sichere Speicherverwaltung und bietet Mittel zur Erreichung hohen parallelen Aufgabenausführung, ohne einen Garbage Collector oder Runtime (die Runtime beschränkt sich auf die grundlegende Initialisierung und die Unterstützung der Standardbibliothek) zu verwenden.
Die Methoden zur Arbeit mit dem Speicher in Rust zielen darauf ab, Fehler beim Manipulieren von Zeigern zu vermeiden und Probleme zu schützen, die aus der niedrigstufigen Arbeit mit Speicher resultieren können, wie z. B. den Zugriff auf Speicherbereiche nach deren Freigabe, das Dereferenzieren von Nullzeigern, das Überlaufen von Buffern usw. Zur Verbreitung von Bibliotheken und zur Verwaltung von Abhängigkeiten wird der Paketmanager Cargo entwickelt. Der Repository-Service crates.io unterstützt die Bereitstellung von Bibliotheken.
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:
- Das Makro „cfg_select!“ wurde hinzugefügt, das anstelle des Pakets „cfg-if“ zur Verarbeitung mehrerer Kompilierungsbedingungen im Stil eines „match“-Blocks verwendet werden kann, ohne eine Kette von bedingten Ausdrücken mit der Konstruktion „#[cfg]“ zu definieren. cfg_select! { unix => { fn foo() { /* unix */ } } target_pointer_width = "32" => { fn foo() { /* nicht-unix, 32-Bit */ } } _ => { fn foo() { /* nicht unix und nicht 32-Bit */ } } }
- Die Unterstützung für die Angabe von «if let»-Ausdrücken innerhalb von «match»-Blöcken wurde stabilisiert, um bedingte Musterübereinstimmungen zu ermöglichen. Zuvor wurde die Unterstützung für mehrere «let»-Ausdrücke mit dem Operator «&&» in «if»- und «while»-Blöcken stabilisiert. match value { Some(x) if let Ok(y) = compute(x) => { println!(«{}, {}», x, y); } _ => {} }
- Die Unterstützung für Inline-Assembler für die Architekturen PowerPC und PowerPC64 wurde stabilisiert.
- Eine neue Reihe von APIs wurde stabilisiert und in die stabile Version überführt, einschließlich stabilisierter Methoden und Implementierungen von Traits:
- MaybeUninit: From<[MaybeUninit; N]>
- MaybeUninit: AsRef<[MaybeUninit; N]>
- MaybeUninit: AsRef<[MaybeUninit]>
- MaybeUninit: AsMut<[MaybeUninit; N]>
- MaybeUninit: AsMut<[MaybeUninit]>
- [MaybeUninit; N]: From<MaybeUninit
- Cell: AsRef<[Cell; N]>
- Cell: AsRef<[Cell]>
- Cell: AsRef<[Cell]>
- bool: TryFrom
- AtomicPtr::update
- AtomicPtr::try_update
- AtomicBool::update
- AtomicBool::try_update
- AtomicIn::update
- AtomicIn::try_update
- AtomicUn::update
- AtomicUn::try_update
- cfg_select!
- mod core::range
- core::range::RangeInclusive
- core::range::RangeInclusiveIter
- core::hint::cold_path
- ::as_ref_unchecked
- ::as_ref_unchecked
- ::as_mut_unchecked
- Vec::push_mut
- Vec::insert_mut
- VecDeque::push_front_mut
- VecDeque::push_back_mut
- VecDeque::insert_mut
- LinkedList::push_front_mut
- LinkedList::push_back_mut
- Layout::dangling_ptr
- Layout::repeat
- Layout::repeat_packed
- Layout::extend_packed
- Das Kennzeichen „const“ wird in Funktionen angewendet:
- fmt::from_fn
- ControlFlow::is_break
- ControlFlow::is_continue
- In den stabilen Versionen des Tools wurde die Unterstützung für die Übermittlung von Compiler-Spezifikationen für eigene Zielplattformen entfernt.
- Die Zielplattformen powerpc64-unknown-linux-musl, aarch64-apple-tvos, aarch64-apple-tvos-sim, aarch64-apple-watchos, aarch64-apple-watchos-sim, aarch64-apple-visionos und aarch64-apple-visionos-sim wurden auf die zweite Unterstützungsebene umgestellt, was eine Garantie für den Build, jedoch keine Garantie für das Bestehen des Testsets bedeutet.
Zusätzlich sind kürzlich angekündigte Projekte und Veranstaltungen im Zusammenhang mit Rust zu erwähnen:
- Das Unternehmen Canonical hat den Display-Server Mir 2.26 vorgestellt, der eine Sammlung von Bibliotheken zur Erstellung von kompositiven Anwendungen bereitstellt, Server basierend auf dem Wayland-Protokoll und einschließlich typischer Funktionalitäten von Fenstermanagern und Displayservern. Mir ist in Projekten wie dem kompositiven Manager Miracle, der Shell für Internetkioske Ubuntu Frame und der Benutzeroberfläche Miriway im Einsatz.
Die neue Version zeichnet sich durch die Möglichkeit aus, Komponenten in der Sprache Rust zu entwickeln. Eine alternative Eingabeverwaltungssubsystem evdev-rs wurde in Rust implementiert, und es wurde mit dem auf Rust geschriebenen Frontend wayland-rs für Wayland begonnen. Unter den nicht mit Rust verbundenen Änderungen in Mir ist die Unterstützung der Wayland-Protokolle ext_image_copy_capture_v1 und input-triggers zu erwähnen.
- Die erste Version des Traffic-Analyzers ayaFlow wurde veröffentlicht, der in Rust geschrieben ist und das Linux-Kernel-Subsystem eBPF zur Erfassung von Netzwerkpaketen (IPv4/TCP/UDP) und Ethernet-Frames mit minimaler Auswirkung auf die Leistung nutzt. Unterstützt wird das Deep Packet Inspection (L7) von Anwendungsprotokollen, wie z.B. die Extraktion von TLS SNI und DNS-Anfragen bei der Analyse von verschlüsseltem Verkehr. Das System ermöglicht die Erstellung einer Tabelle mit dem aktuellen Status der Verbindungen im DashMap-Format, das Speichern der Historie in SQLite und die Bereitstellung von Statistiken über eine REST API für Prometheus.
- Es wurde die Möglichkeit implementiert, multithreaded Anwendungen in Rust zu erstellen, die die Funktionen std::thread verwenden und auf der GPU ausgeführt werden.
Quelle: opennet.ru
