Veröffentlichung der Programmiersprache Rust 1.61

Die Veröffentlichung der universellen Programmiersprache Rust 1.61, die vom Mozilla-Projekt gegründet wurde, jetzt aber unter der Schirmherrschaft der unabhängigen gemeinnützigen Organisation Rust Foundation entwickelt wird, wurde veröffentlicht. Die Sprache konzentriert sich auf die Speichersicherheit und bietet die Möglichkeit, eine hohe Jobparallelität zu erreichen und gleichzeitig die Verwendung eines Garbage Collectors und einer Laufzeit zu vermeiden (die Laufzeit beschränkt sich auf die grundlegende Initialisierung und Wartung der Standardbibliothek).

Die Speicherverarbeitungsmethoden von Rust bewahren den Entwickler vor Fehlern bei der Manipulation von Zeigern und schützen vor Problemen, die durch die Speicherverarbeitung auf niedriger Ebene entstehen, wie z. B. Zugriff auf einen Speicherbereich, nachdem dieser freigegeben wurde, Dereferenzierung von Nullzeigern, Pufferüberläufe usw. Um Bibliotheken zu verteilen, Builds bereitzustellen und Abhängigkeiten zu verwalten, entwickelt das Projekt den Cargo-Paketmanager. Das crates.io-Repository wird zum Hosten von Bibliotheken unterstützt.

Die Speichersicherheit wird in Rust zur Kompilierungszeit durch Referenzprüfung, Verfolgung des Objektbesitzes, Verfolgung der Objektlebensdauer (Umfänge) und Beurteilung der Korrektheit des Speicherzugriffs während der Codeausführung gewährleistet. Rust bietet außerdem Schutz vor Ganzzahlüberläufen, erfordert eine obligatorische Initialisierung von Variablenwerten vor der Verwendung, behandelt Fehler in der Standardbibliothek besser, wendet standardmäßig das Konzept unveränderlicher Referenzen und Variablen an und bietet starke statische Typisierung, um logische Fehler zu minimieren.

Wichtigste Neuerungen:

  • Es ist möglich, eigene Rückkehrcodes aus der Hauptfunktion zu definieren. Ursprünglich konnte die Hauptfunktion von Rust nur den Typ „()“ (Einheit) zurückgeben, was immer einen erfolgreichen Exit-Status anzeigte, es sei denn, der Entwickler rief explizit die Funktion „process::exit(code)“ auf. In Rust 1.26 war es mithilfe des instabilen Termination-Merkmals in der Hauptfunktion möglich, die Werte „Ok“ und „Err“ zurückzugeben, entsprechend den Codes EXIT_SUCCESS und EXIT_FAILURE in C-Programmen. In Rust 1.61 wurde das Termination-Merkmal stabilisiert und ein separater ExitCode-Typ zur Darstellung eines bestimmten Rückgabecodes vorgeschlagen, der plattformspezifische Rückgabetypen abstrahiert, indem er sowohl die vordefinierten Konstanten SUCCESS und FAILURE als auch die From-Methode bereitstellt um einen benutzerdefinierten Rückgabecode zurückzugeben. verwenden Sie std::process::ExitCode; fn main() -> ExitCode { if !check_foo() { return ExitCode::from(8); } ExitCode::SUCCESS }
  • Es wurden zusätzliche Fähigkeiten von Funktionen stabilisiert, die mit dem Ausdruck „const fn“ definiert wurden und nicht nur als reguläre Funktionen aufgerufen, sondern auch in jedem Kontext anstelle von Konstanten verwendet werden können. Diese Funktionen werden zur Kompilierzeit und nicht zur Laufzeit berechnet und unterliegen daher bestimmten Einschränkungen, wie z. B. der Möglichkeit, nur aus Konstanten zu lesen. In der neuen Version sind grundlegende Operationen mit Funktionszeigern innerhalb von Konstantenfunktionen zulässig (das Erstellen, Übergeben und Umwandeln von Zeigern ist zulässig, der Aufruf einer Funktion jedoch nicht über einen Zeiger). Merkmalsgrenzen für generische Parameter von Konstantfunktionen wie T: Copy; dynamisch versandbare Merkmale (dyn Trait); impl Merkmalstypen für Funktionsargumente und Rückgabewerte.
  • Die Stream-Handles Stdin, Stdout und Stderr in std::io haben jetzt eine statische Lebensdauer („'static“), wenn sie gesperrt sind, was Konstrukte wie „let out = std::io::stdout().lock();“ ermöglicht. mit dem Erhalten eines Handles und dem Setzen einer Sperre in einem Ausdruck.
  • Ein neuer Teil der API wurde in die Kategorie „stabil“ verschoben, einschließlich der Stabilisierung der Methoden und Implementierungen von Merkmalen:
    • Pin::static_mut
    • Pin::static_ref
    • Vec::retain_mut
    • VecDeque::retain_mut
    • Schreiben für Cursor<[u8; N]>
    • std::os::unix::net::SocketAddr::from_pathname
    • std::process::ExitCode
    • std::process::Termination
    • std::thread::JoinHandle::is_finished
  • Das Attribut „const“, das die Möglichkeit der Verwendung in jedem Kontext anstelle von Konstanten bestimmt, wird in Funktionen verwendet:
    • <*const T>::offset und <*mut T>::offset
    • <*const T>::wrapping_offset und <*mut T>::wrapping_offset
    • <*const T>::add und <*mut T>::add
    • <*const T>::sub und <*mut T>::sub
    • <*const T>::wrapping_add und <*mut T>::wrapping_add
    • <*const T>::wrapping_sub und <*mut T>::wrapping_sub
    • <[T]>::as_mut_ptr
    • <[T]>::as_ptr_range
    • <[T]>::as_mut_ptr_range

Darüber hinaus können Sie sich den Artikel „Rust: Eine kritische Retrospektive“ mit einer Zusammenfassung der Eindrücke der Rust-Sprache ansehen, nachdem während der Entwicklung des in der Firmware verwendeten Xous-Mikrokernel-Betriebssystems 100 Codezeilen darin geschrieben wurden. Zu den Nachteilen gehören eine schwer verständliche Syntax, Unvollständigkeit und kontinuierliche Weiterentwicklung der Sprache, das Fehlen wiederholbarer Builds, typische Probleme mit dem Abhängigkeitsvertrauen in Crates.io und die Notwendigkeit, beim Schreiben von sicherem Code eine gewisse Disziplin aufrechtzuerhalten. Zu den Funktionen, die die Erwartungen übertrafen, gehören Tools zum Refactoring von Code und zur Überarbeitung von „Hacks“, die während des Rapid Prototyping hinzugefügt wurden.

Source: opennet.ru

Kommentar hinzufügen