Rust – die moderne Programmiersprache vorgestellt
Obwohl es bereits sehr viele Programmiersprachen gibt – von C++ über Pascal bis hin zu Java – werden doch immer wieder neue entwickelt. Diese sollen entweder einfacher, sicherer oder schneller sein. Die Programmiersprache Rust verfolgt gleich alle drei Ziele und ist damit sehr erfolgreich. Laut einer Umfrage unter Nutzern der Entwickler-Plattform Stack Overflow ist Rust im Jahr 2019 die beliebteste Programmiersprache von allen.
Was ist Rust?
Die Programmiersprache Rust ist 2010 bei Mozilla entstanden. Dort wurde die Sprache erst als Hobby-Projekt eines einzelnen Entwicklers verfolgt und dann eingesetzt, um eine neue Browser-Engine für Firefox zu entwickeln. Das Projekt ist inzwischen Open Source und wird durch eine aktive Community gepflegt, finanzielle Unterstützung erhält das Projekt aber immer noch von Mozilla.
Die Programmiersprache bewegt sich zwischen niederen Sprachen C und sehr abstrahierten Sprachen wie Java. Bei Rust handelt es sich eigentlich um eine Programmiersprache für die Systemprogrammierung. Damit sind solche Sprachen gemeint, mit denen sich Betriebssysteme oder Anwendungen, die eng mit Windows, Linux oder macOS verzahnt sind, realisieren lassen. Gleichzeitig setzt man Rust aber auch bei der Programmierung von Webanwendungen ein – also auf sehr viel kleinerer Ebene.
Besonderheiten von Rust
Der größte Vorteil von Rust gegenüber anderen Programmiersprachen liegt in der Sicherheit. Dies wird u. a. mit der Behandlung von Fehlern erreicht. Sollte beim Kompilieren ein Fehler auftreten, der sich nicht beheben lässt, wird das passend benannte „panic!“-Makro gestartet. Dieses räumt auf und liefert eine Fehlermeldung, damit kein Schaden entstehen kann.
Aber auch die Speicherverwaltung gilt als ausgesprochen sicher. Der Vorteil ist, dass Rust „memory safety“ ohne einen „garbage collector“ erreicht. Der Speicher war über Jahre hinweg bei vielen Programmiersprachen ein beliebter Angriffspunkt von Hackern. Sollte ein Speicher volllaufen, liefert das einen Fehler im System und damit eine Schwäche, die ausgenutzt werden kann. Ein „garbage collector“ sorgt dafür, dass nicht benötigte Objekte wieder aus dem Speicher verschwinden. Das verlangsamt allerdings die Ausführung des Codes. Der Compiler von Rust macht den „garbage collector“ obsolet. Stattdessen wird bereits beim Kompilieren überprüft, ob es Fehler im Speicher geben könnte.
Die starken Sicherungsfunktionen gehen aber hier eben nicht auf Kosten der Performance. Rust ist eine Sprache für die Systemprogrammierung wie C/C++ und liefert auch die gleiche Geschwindigkeit beim Ausführen. Das hat zum einen mit dem Verzicht auf einen „garbage collector“ zu tun. Zum anderen sorgen die „zero cost abstractions“ für hohe Geschwindigkeiten während der Laufzeiten. Der Begriff bedeutet eigentlich nur, dass man abstrakt programmieren kann und für diesen Komfort dennoch keine Einbußen bei der Performance in Kauf nehmen muss.
Diese Tatsache macht Rust zu einer Mischung aus High-Level- und Low-Level-Programmiersprachen. Ähnlich wie C/C++ ist Rust sehr nah an der Hardware – was für die hohe Geschwindigkeit sorgt –, kann aber relativ einfach programmiert werden, wie man es sonst von High-Level-Sprachen kennt.
Letztlich findet man sich sowohl als Anfänger wie auch als erfahrener Programmierer schnell in Rust zurecht. Die Sprache entfernt sich in der Benutzungsweise kaum von bekannten Alternativen. Ein großer Vorteil liegt aber darin, mit wie viel Aufwand Fehlermeldungen konzipiert wurden. Wo andere Programmiersprachen nur kryptische Errors ausgeben, liefert Rust sinnvolle und hilfreiche Hinweise, wie man den Fehler beheben kann.
Rust ist eine der Programmiersprachen, die stark von WebAssembly unterstützt werden. Somit wird Rust auch dafür eingesetzt, schnelle Anwendungen für das Web zu entwickeln.
Rust-Syntax – mit Beispiel
Rust ähnelt auf den ersten Blick in seiner Syntax sehr stark C oder C++ – auch Sprachen zur Systemprogrammierung. Wie von dort gewohnt, arbeitet man auch bei Rust mit Funktionen, Schleifen, Abfragen, Konstanten und Variablen. Die Klammersetzung ist hier und da anders, als man es aus älteren Sprachen kennt, das Prinzip ändert sich aber nicht. Natürlich hat Rust aber auch Eigenheiten:
- Neue Funktionen werden durch den Befehl „fn“ definiert.
- Die Sprache arbeitet mit Makros, die sich durch ein Ausrufezeichen am Ende des Begriffs auszeichnen.
- Variablen lassen sich mit „let“ bestimmen; damit die Angaben verändert werden können, muss dies explizit mit „mut“ erlaubt werden.
- Rust hat zudem ein besonderes Verständnis von Ownership.
Unter Ownership versteht man in der Rust-Syntax das Verhältnis einer Variablen zu ihrem Wert. Die Besonderheit liegt darin, dass ein bestimmter Wert nur zu einer Variablen gehören kann. Übergibt man den Wert, ist die Variable nicht mehr ansprechbar:
fn main() {
let hello = String::from("Hello, world!");
let hello1 = hello;
println!("{}", hello);
}
Dieser Code kann so nicht funktionieren: Der Inhalt von „hello“ wurde an „hello1“ übergeben und kann daher im Makro nicht wieder aufgerufen werden. Stattdessen muss man die neue Variable im letzten Befehl integrieren, was dann zur korrekten Ausgabe führt.
fn main() {
let hello = String::from("Hello, world!");
let hello1 = hello;
println!("{}", hello1);
}
Rust bietet mehr Sicherheit, mehr Performance und einen einfacheren Umgang. Zwar geht die Programmiersprache keine komplett neuen Wege, sondern baut auf dem auf, was man beispielsweise aus C/C++ kennt, bietet aber interessante neue Features. Besonders wenn man bereits mit anderen Sprachen vertraut ist, ist der Umstieg nicht schwierig.
Wer die moderne Programmiersprache ausprobieren möchte, findet in unserem Rust-Tutorial die ersten Schritte.