Programmiersprache: Rust steuert zum sechsten Geburtstag auf neue Edition zu

Das für Oktober geplante Rust 2021 erweitert die automatischen Importe aus der Standard-Library und kann direkt über Arrays iterieren.

In Pocket speichern vorlesen Druckansicht 115 Kommentare lesen

(Bild: rodho/Shutterstock.com)

Lesezeit: 6 Min.
Von
  • Rainald Menge-Sonnentag
Inhaltsverzeichnis

Für die Programmiersprache Rust steht im Herbst ein größeres Update an: Rust 2021 wird die dritte Edition nach Rust 2015 und Rust 2018. Wie vor drei Jahren bringt die Umstellung ein paar Neuerungen mit, die potenziell zu Inkompatibilitäten führen können. Da die Auswahl der Edition auf Paketebene erfolgt, soll der Umstieg jedoch geschmeidig sein.

Im Zuge der Veröffentlichung von Rust 2018 in Rust 1.31 hat das Rust-Team in einem Artikel auf Mozilla-Hacks den Unterschied zwischen dem Wechsel zu einer neuen Edition und dem Sprung auf eine neue Hauptversion erläutert. Vor allem soll das Update so wenige Breaking Changes wie möglich mitbringen. Seinerzeit führte das Team das Async-Await-Pattern ein, das als Nebenwirkung die neuen Keywords async und await mitbrachte. Das konnte zum Problem werden, wenn Code die zuvor nicht reservierten Begriffe beispielsweise als Variablennamen verwendet hat.

Entwicklerinnen und Entwickler legen für jedes Crate, wie die Pakete in Rust heißen, die jeweilige Edition fest, sodass sie keine Änderungen für älteren Code vornehmen müssen, um ihn mit Sourcecode für die jüngste Edition zu verwenden. Unter der Haube erstellt der Compiler schließlich eine einheitliche interne Darstellung für gemischten Code.

Die sogenannte Prelude der Standard-Library bringt automatische Importe mit, die grundsätzlich nicht zu Konflikten mit manuellen Importen führen. Der Compiler zieht die manuellen im Zweifel stets vor, und für die meisten Elemente ist eine klare Unterscheidung durch die Referenzierung über die Modulebene möglich. Schwierig wird es jedoch bei den Traits, Methoden, die in Rust für einen spezifischen Typ definiert sind. Sie können durchaus mit manuell definierten Namen kollidieren. Daher erfolgt die Erweiterung nicht in einem regulären Update, sondern im Zuge der kommenden Edition, die drei neue Traits zum Prelude hinzufügt: std::convert::TryInto, std::convert::TryFrom und std::iter::FromIterator.

Passend zur letzten Ergänzung betrifft eine weitere Neuerung das Iterieren über Arrays. Bis zum aktuellen Rust 1.52 implementieren nur Referenzen auf Arrays den Trait IntoIterator, aber nicht die Arrays selbst. Die Erweiterung des Trait darauf ist jedoch nicht ganz so problemlos, wie anzunehmen wäre, wie das zugehörige Issue im Detail erklärt. Als kleinen Kniff wird IntoIterator künftig in allen Editionen funktionieren, aber der Compiler kümmert sich unter der Haube um eine unterschiedliche Auflösung, um Inkompatibilitäten zu vermeiden.

Eine weitere Änderung betrifft Closures, ein Konzept für anonyme Funktionen in Rust. Sie holen sich eine Referenz zu den verwendeten Objekten aus dem Kontext. Ab Rust 2021 greifen sie sich dazu nur noch die tatsächlich genutzten Teilobjekte, also beispielsweise im Konstrukt || a.x + 1 lediglich das gefragte Feld a.x und nicht wie bisher eine Referenz auf das komplette Struct a. Damit ist der Zugriff beispielsweise auch dann noch möglich, wenn zuvor ein anderes Feld beispielsweise über drop (a.y) entfernt wurde. Bisher führt das zu einem Fehler, da Rust nicht mehr das vollständige Struct a referenzieren kann, das für das Closure aber auch nicht erforderlich ist.

Schließlich gibt es eine Anpassung beim Verwenden von Ausgabemeldungen für unerwartete Programmabbrüche über das Makro panic!. Bisher nutzt es String-Formatierungen nur dann, wenn der Aufruf mehr als einen Parameter mitgibt. Künftig verarbeitet es ebenso wie println! den ersten Parameter als Format-String. Die Änderung zielt vor allem auf die geplante Umsetzung für implizite Parameter in solchen Strings, die für println!("Hallo {person}!") den Wert der Variable person automatisch einfügt.

Darüber hinaus reserviert Rust 2021 die Syntax für Identifier als Präfixe wie für prefix#identifier, prefix"string", prefix'c' und prefix#123, wobei prefix für nahezu beliebige Identifier steht. Derzeit haben diese Präfixe noch keine Bedeutung, sondern bereiten lediglich künftige Pläne vor. Außerdem wird der in Rust 1.51 eingeführte neue Feature Resolver in der kommenden Edition zum Standardvorgehen.

Parallel zur Veröffentlichung der Pläne feiert die ursprünglich bei Mozilla entwickelte Programmiersprache ihren sechsten Geburtstag seit dem 1.0-Release. Das Team hat dazu einen Blogbeitrag mit den jüngsten Erfolgsmeldungen veröffentlicht. Rust war vor sechs Jahren bei Mozilla entstanden und steht inzwischen unter dem Dach seiner eigenen Foundation.

Die Programmiersprache findet derweil wachsenden Zulauf aus unterschiedlichen Bereichen. Die Hauptmotivation für den Einsatz von Rust ist die erhöhte Sicherheit bei Speicherzugriffen. Rust setzt von Haus aus auf Memory Safety und vermeidet im Gegensatz zu C oder C++ typische Fehler, die zu Sicherheitslücken führen können.

Die Linux-Community diskutiert seit geraumer Zeit über den Einsatz von Rust und hat im Juli 2020 die Pläne konkretisiert. Microsoft experimentiert ebenfalls an einigen Stellen mit der Programmiersprache und hat im Mai 2020 eine Preview von Rust/WinRT vorgestellt. Anfang April hat Google das Android Open Source Project (AOSP) für Rust geöffnet. Damit soll die Programmiersprache für die Weiterentwicklung des Betriebssystems zum Einsatz kommen. Ende April ist Facebook der Rust Foundation beigetreten.

Details zu den Plänen rund um Rust 2021 lassen sich dem Rust-Blog entnehmen. Das Team will die geplanten Änderungen bis September testen und schließlich in Rust 1.56 einfließen lassen, das am 21. Oktober erscheinen soll. Zuvor ist im Juli ein Update zur Umsetzung geplant.

[Update 17.5.2021 17:00 Uhr] Der sechste Geburtstag wurde auf das Erscheinen der Version 1.0 konkretisiert.

(rme)