Menü
Developer

Programmiersprache: Rust 1.33 kann Daten im Speicher verankern

Das neue Release der Programmiersprache führt das Pinning-Konzept ein und erweitert die erlaubten Ausdrücke in konstanten Funktionen.

Von
vorlesen Drucken Kommentare lesen 29 Beiträge
Programmiersprache: Rust 1.33 kann Daten im Speicher verankern

Mozilla hat planmäßig Rust 1.33 veröffentlicht. Nach der mit sprachlichen Neuerungen eher sparsamen Vorgängerversion hält jetzt mit Pinning ein neues Konzept zur Verankerung von Daten im Speicher Einzug in die Programmiersprache. Reguläre Entwickler betrifft es zunächst eher indirekt, da es vor allem für das Schreiben von Library-Code relevant ist. Neu ist zudem, dass sich konstante Funktionen nun für weitere Anwendungsfelder verwenden lassen.

Als const definierte Funktionen lassen sich in Rust aus konstanten Kontexten heraus aufrufen. Für den Fall interpretiert der Compiler sie beim Übersetzen – außerhalb des konstanten Kontexts verhalten sie sich wie reguläre Funktionen. Für den ersten Fall muss der Funktionskörper seinerseits einen konstanten Kontext darstellen. Die darin erlaubten Befehle sind freilich begrenzt.

Für Rust 1.33 haben die Macher nun einige Befehle beziehungsweise Ausdrücke für den Einsatz innerhalb konstanter Kontexte und damit in als const fn definierten Funktionen stabilisiert. Unter anderem gilt die Ergänzung für Variablendeklarationen mit let inklusive über mut als veränderbar deklarierten Variablen wie folgende Beispiele aus dem Pull Request zu den jüngsten Stabilisierungen zeigen:

let x = 42;
let x: u8;
let mut x: u8;
let mut x = 24;

Mutable References und Borrows, also &mut T beziehungsweise &mut x sind dagegen weiterhin nicht in konstanten Kontexten erlaubt. Aus Gründen der Rückwärtskompatibilität sind auch let-Zuweisungen, die && oder || verwenden nicht gestattet, da sie innerhalb von als const oder static deklarierten Bereichen als & beziehungsweise | interpretiert werden.

Neuerdings stabilisiert sind dafür Expression Statements, die mit einem Semikolon enden und bei deren Ausführung das Resultat ignoriert wird. Auch Zuweisungen wie x = y inklusive solchen mit einem zusätzlichen Operator wie x += y sind erlaubt. Das gilt auch für Zuweisungen, bei denen das Ziel eine Projektion wie das Feld eines struct oder einer Indexanweisung ist wie in x[3] = 42.

Rust 1.33 führt mit Pinning ein neues Konzept ein. Damit lassen sich Objekte quasi fest im Speicher verankern. Ihre Position bleibt damit verlässlich an derselben Stelle. Der in dem Modul std::pin definierte Pin<P> stellt sicher, dass jede Zuweisung vom Zeigertyp P einen festen Platz im Speicher erhält. Damit ist weder das Verschieben noch die Freigabe des belegten Speicherbereichs erlaubt.

Über das in std::marker definierte Unpin lassen sich jedoch Typen deklarieren, die nach dem Anheften sicher über Aufrufe wie mem::replace verschoben werden können. Das Konzept des Pinning ist vor allem für Library-Entwickler vorgesehen. Es stellt wohl einen wichtigen Schritt für die Einführung des Async/Await-Patterns da, die aber weiterhin noch auf sich warten lässt..

Eine weitere nennenswerte Neuerung ist der sogenannte Underscore-Import, der Bibliothekinhalte importiert und deren Verwendung ohne den passenden Namensraum erlaubt, wie in folgendem Beispiel:

use std::io::Read as _;

// Erlaubt, weil nur ein 'Read' im Modul existiert
pub trait Read {}

Mozilla Research hat Rust von Beginn an mit dem Fokus auf Sicherheit und Nebenläufigkeit entwickelt. Die Programmiersprache soll unter anderem Schwachstellen durch Speicherzugriffsfehler und Pufferüberlaufen weitgehend vermeiden. Das erste stabile Release erschien 2015. Mit der Veröffentlichung von Rust 1.31 startete im Dezember 2018 die Ära von Rust 2018.

Das Rust-Team verzichtete dabei bewusst auf einen Versionswechsel zu Rust 2.x, da Rust 2018 nahezu keine Änderungen mitgebracht hat, die zu Inkompatibilitäten führen (Breaking Changes). Daher sehen die Macher keinen Grund, neue Sprachfeatures auf die frische Edition zu reduzieren. Der Rust-Compiler wird den "Rust 2015"-Modus für die bisherige Edition, die den Namen erst seit den Plänen für Rust 2018 hat, unterstützen.

Weitere Details zu Rust 1.33 wie der automatische Rebuild einer Crate beim Ändern von Dateien während des Build-Vorgangs lassen sich dem Rust-Blog entnehmen. Eine vollständige Übersicht der Änderungen und Stabilisierungsmaßnahmen findet sich in den Release Notes. Auf der Tools-Seite findet sich ein Installationswerkzeug für Rust. Das Repository auf GitHub enthält zudem unter anderem den Sourcecode für den Compiler und die Standardbibliothek sowie eine Dokumentation. (rme)