Menü
Developer

Programmiersprache: Rust 1.31 markiert den Start von Rust 2018

Mit dem scheinbar kleinen Releasewechsel findet der Umstieg auf die seit Anfang des Jahres geplante neue Edition Rust 2018 statt.

Von
vorlesen Drucken Kommentare lesen 18 Beiträge
Programmiersprache: Rust 1.31 markiert den Start von Rust 2018

Mozilla hat Rust 1.31 nach einer sechswöchigen Betaphase planmäßig veröffentlicht. Trotz der eher unscheinbaren Versionsnummer hat das Release eine große Bedeutung, da es den Start einer neuen Edition der Programmiersprache bedeutet, die das Team Rust 2018 nennt. Abgesehen davon finden Entwickler ein paar sprachliche Ergänzungen, darunter konstante Funktionen und ein präziserer Umgang mit der Memory Safety für Borrows.

Rust 2018 ist eine neue Edition der Programmiersprache, die jedoch nicht als Major Release daherkommt. Das Rust-Team verzichtet bewusst darauf, einen Versionswechsel als Rust 2.x zu markieren. Ein Artikel zur neuen Edition auf Mozilla.org hebt unter anderem als Unterschied zu Versionssprüngen anderer Programmiersprachen hervor, dass es fast keine Änderungen gibt, die zu Inkompatibilitäten führen (Breaking Changes). Daher gibt es 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.

Bereits seit der ersten Ankündigung von Rust 2018 Anfang des Jahres stellte das Team klar, dass es den Fokus für die Edition vor allem auf bessere Produktivität lege, nachdem es sich zuvor primär auf die Stabilität konzentriert habe. Die sprachlichen Ergänzungen halten sich in Grenzen. Ein wichtiger Punkt ist jedoch, dass die wenigen geplanten Breaking Changes bereits in Release 1.31 integriert sind, auch wenn die Umsetzung erst zu einem späteren Zeitpunkt erfolgt.

So soll Rust mittelfristig ebenso wie zahlreiche andere Programmiersprachen das async/await-Pattern für asynchrone, nicht blockierende Funktionen erhalten. Obwohl es noch nicht Bestandteil von Rust 1.31 ist, gelten async und await ab sofort als Keywords, was eine anderweitige Verwendung verbietet. Der Compiler verarbeitet Code standardmäßig wie bisher und akzeptiert beispielsweise eine Variable namens await. Entwickler wählen den "Rust 2018"-Modus explizit aus, womit die neuen Features zur Verfügung stehen, folgerichtig aber die Keywords als Variablennamen verboten sind.

Der Kommandozeilenbefehl cargo fix untersucht vorhandenen Code auf die durch die Neuerungen verbotenen Elemente. Um die Anpassungen so unkompliziert wie möglich zu machen, gilt die Zuweisung einer Edition auf Modulebene, also für einzelne Crates, wie die Module in Rust heißen. Mit dem Einfügen der Zeile "edition=2018" in die "cargo.toml"-Datei legen Entwickler die neue Edition für das Crate fest, das trotzdem weiterhin mit "Rust 2015"-Modulen zusammenarbeitet.

Die meisten künftigen Funktionen werden für beide Rust-Editionen zur Verfügung stehen.

(Bild: Mozilla.org)

Neue Sprachfeatures werden sich größtenteils auf beide Editionen auswirken. Ausnahme sind die Funktionen, die Breaking Changes mitbringen. Das ist ein weiterer Grund für das Team, keinen Versionssprung vorzunehmen.

Unabhängig von den sprachlichen Ergänzungen soll Rust 2018 sowohl allgemein als auch für spezifische Anwendungsfälle die Produktivität steigern. Zur Umsetzung haben sich vier Arbeitsgruppen auf die Bereiche WebAssembly, Embedded Computing, Netzwerk und Kommandozeilenwerkzeuge konzentriert.

Bei den Werkzeugen rund um die Programmiersprache ist unter anderem das Rust-Plug-in für IntelliJ IDEA zu nennen, um JetBrains Flaggschiff-IDE zum Entwickeln von Rust-Code zu verwenden. Eine allgemeine Integration in Entwicklerwerkzeuge stellt der Rust Language Server (RLS) dar, der sich über das 2016 von Codenvy, Microsoft und Red Hat eingeführte Language Server Protocol in Code-Editoren wie Visual Studio Code, Eclipse, Atom, Emacs und Vim einbinden lässt und damit unter anderem Autovervollständigung und Syntaxhervorhebung für Rust-Code ermöglicht.

Rust 1.31 bringt präziseres Borrow Checking als ein Beispiel für die geplante Produktivitätsverbesserung. Borrow Checking ist Teil des Sicherheitskonzepts von Rust, um Memory Safety zu gewährleisten. Allerdings bezieht es sich dabei auf die jeweiligen Codeblöcke, nicht auf die tatsächliche Verwendung, wie folgendes Beispiel aus dem Rust-Blog verdeutlicht:

fn main() {
let mut x = 5;
let y = &x;
let z = &mut x;
}

Der Rust-Compiler spuckt dafür bisher eine Fehlermeldung aus, da die Sprache konsequent die letzte Zuweisung verbietet: Das Borrowing von x für die Variable z erfolgt durch &mut als mutable, also mit der Erlaubnis zum Verändern des Wertes. Aufgrund der in der darüber stehenden Zuweisung von x zur Variable y als nicht veränderlichen Wert, ist das Verbot aus Gründen des Speicherschutz konsequent und der Compiler reagiert mit folgender Meldung:

error[E0502]: cannot borrow `x` as mutable 
because it is also borrowed as immutable

Ab Version 1.31 verarbeitet der Compiler den Code trotz des Verstoßes ohne Fehlermeldung, da die lokale Variable y nach der letzten Zuweisung nicht verwendet wird, also kein Zugriff auf das Immutable Borrowing erfolgt. Er betrachtet somit den tatsächlichen Code statt den gesamten Gültigkeitsbereich.

Der Cartoon des Rust-Teams bringt die Schwierigkeit mit Mutable Borrows auf den Punkt

(Bild: Mozilla.org)

Konsequenterweise sind auch die Fehlermeldungen aussagekräftiger, falls in einem komplexeren Code als dem simplen Beispiel die Variable y an späterer Stelle verwendet wird, was die Zuweisung als Mutable Borrow tatsächlich verbietet.

Eine weitere sprachliche Neuerung von Rust 1.31 ist const fn zum Definieren konstanter Funktionen, die sich wie herkömmliche Funktionen verwenden lassen. Die Besonderheit kommt in konstanten Kontexten zur Geltung, da der Compiler dabei das Ergebnis bereits beim Kompilieren berechnen kann, sodass das Ausführen der Funktion zur Laufzeit entfällt.

Weitere Neuerungen in Rust 1.31 lassen sich dem Rust-Blog entnehmen. Mit der neuen Edition hat das Team auch die Website von Rust überarbeitet, wie ein separater Blogbeitrag erläutert. (rme)