Release der Systemprogrammiersprache , basierend auf dem Projekt von Mozilla. Die Sprache konzentriert sich auf sichere Speicherverwaltung, bietet automatisches Speichermanagement und stellt Werkzeuge zur Verfügung, um hohen Parallelismus bei der Ausführung von Aufgaben zu erreichen, ohne auf einen Garbage Collector und Runtime angewiesen zu sein.
Das automatische Speichermanagement in Rust befreit den Entwickler von der Manipulation von Zeigern und schützt vor Problemen, die aus der niederleveligen Speicherbearbeitung resultieren, wie das Zugreifen auf freigegebenen Speicher, Dereferenzierung von Nullzeigern und Buffer-Überläufen. Für die Verteilung von Bibliotheken, den Aufbau und das Management von Abhängigkeiten entwickelt sich der Paketmanager , der es ermöglicht, die benötigten Bibliotheken für das Programm mit einem Klick zu erhalten. Für die Bereitstellung von Bibliotheken wird das Repository .
Haupt :
- Die neue Syntax der asynchronen Programmierung basiert auf der Funktion „async“, dem Block async move { … } und dem Operator „.await“, die das Schreiben von nicht-blockierenden Handlern im Hauptausführungsthread erleichtern. Im Vergleich zu vorher vorgeschlagenen APIs für asynchrone Eingabe/Ausgabe sind die Konstruktionen async/.await einfach zu verstehen, gut lesbar und ermöglichen die Umsetzung komplexer asynchroner Interaktionen unter Verwendung bekannter Kontrollflusswerkzeuge wie Schleifen, bedingte Anweisungen und Ausnahmen.
Die Async-await-Syntax ermöglicht das Erstellen von Funktionen, die ihre Ausführung anhalten, die Kontrolle an den Hauptausführungsthread zurückgeben und dann die Ausführung an der Stelle fortsetzen, an der sie unterbrochen wurden. Zum Beispiel ist eine solche Unterbrechung beim Umgang mit Eingabe/Ausgabe erforderlich, bei der während des Wartens auf das Eintreffen einer neuen Datencharge andere Arbeiten verrichtet werden können. Funktionen und Blöcke, die über „async fn“ und „async move“ definiert sind, geben einen Typ zurück. , der die Darstellung von zukünftigen asynchronen Berechnungen definiert. Um eine verzögerte Berechnung direkt zu initiieren und das Ergebnis zu erhalten, kann der Operator „await“ verwendet werden. Vor dem Aufruf von „await“ werden keine Aktionen ausgeführt oder im Voraus geplant, was es ermöglicht, komplexe geschachtelte Konstruktionen ohne zusätzliche Overheadkosten zu erstellen.
async fn first_function() -> u32 { .. }
…
let future = first_function();
…
let result: u32 = future.await; - «#![feature(bind_by_move_pattern_guards)]», das die Verwendung von Variablen mit dem Bindungstyp „“ in Mustern ermöglicht und Referenzen auf diese Variablen im „if“-Teil des Ausdrucks „“ verwendet. Zum Beispiel sind jetzt folgende Konstruktionen zulässig:
fn main() {
let array: Box = Box::new([1, 2, 3, 4]);match array {
nums
if nums.iter().sum::() == 10=> {
drop(nums);
}
_ => unreachable!(),
}
} - Die Angabe ist erlaubt bei der Definition von Funktionen, Closures und Zeigern auf Funktionen. Unterstützt werden Attribute für bedingte Kompilierung (cfg, cfg_attr), die die Diagnostik über Lints steuern (allow, warn, deny und forbid) und Hilfsattribute für den Makroaufruf.
fn len(
#[cfg(windows)] slice: &[u16], // использовать параметр в Windows
#[cfg(not(windows))] slice: &[u8], // использовать в остальных ОС
) -> usize {
slice.len()
} - Warnungen zu Problemen, die bei der Überprüfung von ausgeliehenen Variablen (borrow checker) mit der Technik der nicht-lexikalischen Lebensdauern (NLL) festgestellt wurden, wurden zu fatale Fehler. Es sei daran erinnert, dass das Überprüfungssystem, das auf einem neuen Mechanismus zur Verwaltung der Lebensdauer ausgeliehener Variablen basiert, es ermöglicht hat, einige Probleme zu identifizieren, die im alten Überprüfungscode unbemerkt geblieben sind. Da die Fehlerausgabe für solche Überprüfungen die Kompatibilität mit zuvor funktionierendem Code beeinträchtigen konnte, wurden vorübergehend Warnungen anstelle von Fehlern ausgegeben. Jetzt wurden die Warnungen im Rust 2018-Modus durch Fehler ersetzt. In der nächsten Ausgabe wird die Fehlerausgabe auch im Rust 2015-Modus implementiert, was es ermöglichen wird, den alten Borrow Checker endgültig loszuwerden;
- Das Merkmal „const“, das die Nutzung in jedem Kontext anstelle von Konstanten ermöglicht, wurde für Funktionen wie Vec::new, String::new, LinkedList::new, str::len, [T]::len, str::as_bytes,
abs, wrapping_abs und overflowing_abs; - Eine neue Charge von APIs wurde als stabil eingestuft, darunter wurden die Methoden stabilisiert
Pin::into_inner, Instant::checked_duration_since und Instant::saturating_duration_since; - Im Paketmanager Cargo wurde die Möglichkeit hinzugefügt, Konfigurationsdateien mit der Erweiterung „.toml“ zu verwenden. Vorläufige Unterstützung für den direkten Bau der Standardbibliothek aus Cargo wurde hinzugefügt. Das Flag „—workspace“ ersetzt das mehrdeutig interpretierbare Flag „—all“. Ein neues Feld wurde zu den Metadaten hinzugefügt, das die Veröffentlichung von Abhängigkeiten mit einem Git-Tag und einer Versionsnummer ermöglicht.Eine Testoption „-Ztimings“ wurde hinzugefügt, um einen HTML-Bericht über die Ausführungszeiten der verschiedenen Kompilierungsphasen zu generieren.
- Im Compiler rustc wurden in den Diagnosemeldungen die Enden von Code abgeschnitten, die nicht in das Terminal passen. Unterstützung auf der dritten Ebene für Zielplattformen wurde gewährleistet.
i686-unknown-uefi und sparc64-unknown-openbsd. Unterstützung der dritten Ebene bedeutet grundlegende Unterstützung, jedoch ohne automatisierte Tests und Veröffentlichung offizieller Builds.
Quelle: opennet.ru
