Obwohl es bereits sehr viele Pro­gram­mier­spra­chen gibt – von C++ über Pascal bis hin zu Java – werden doch immer wieder neue ent­wi­ckelt. Diese sollen entweder einfacher, sicherer oder schneller sein. Die Pro­gram­mier­spra­che Rust verfolgt gleich alle drei Ziele und ist damit sehr er­folg­reich. Laut einer Umfrage unter Nutzern der Ent­wick­ler-Plattform Stack Overflow ist Rust im Jahr 2019 die be­lieb­tes­te Pro­gram­mier­spra­che von allen.

Was ist Rust?

Die Pro­gram­mier­spra­che Rust ist 2010 bei Mozilla ent­stan­den. Dort wurde die Sprache erst als Hobby-Projekt eines einzelnen Ent­wick­lers verfolgt und dann ein­ge­setzt, um eine neue Browser-Engine für Firefox zu ent­wi­ckeln. Das Projekt ist in­zwi­schen Open Source und wird durch eine aktive Community gepflegt, fi­nan­zi­el­le Un­ter­stüt­zung erhält das Projekt aber immer noch von Mozilla.

Die Pro­gram­mier­spra­che bewegt sich zwischen niederen Sprachen C und sehr abs­tra­hier­ten Sprachen wie Java. Bei Rust handelt es sich ei­gent­lich um eine Pro­gram­mier­spra­che für die Sys­tem­pro­gram­mie­rung. Damit sind solche Sprachen gemeint, mit denen sich Be­triebs­sys­te­me oder An­wen­dun­gen, die eng mit Windows, Linux oder macOS verzahnt sind, rea­li­sie­ren lassen. Gleich­zei­tig setzt man Rust aber auch bei der Pro­gram­mie­rung von Web­an­wen­dun­gen ein – also auf sehr viel kleinerer Ebene.

Be­son­der­hei­ten von Rust

Der größte Vorteil von Rust gegenüber anderen Pro­gram­mier­spra­chen liegt in der Si­cher­heit. Dies wird u. a. mit der Be­hand­lung von Fehlern erreicht. Sollte beim Kom­pi­lie­ren ein Fehler auftreten, der sich nicht beheben lässt, wird das passend benannte „panic!“-Makro gestartet. Dieses räumt auf und liefert eine Feh­ler­mel­dung, damit kein Schaden entstehen kann.

Aber auch die Spei­cher­ver­wal­tung gilt als aus­ge­spro­chen sicher. Der Vorteil ist, dass Rust „memory safety“ ohne einen „garbage collector“ erreicht. Der Speicher war über Jahre hinweg bei vielen Pro­gram­mier­spra­chen ein beliebter An­griffs­punkt von Hackern. Sollte ein Speicher voll­lau­fen, liefert das einen Fehler im System und damit eine Schwäche, die aus­ge­nutzt werden kann. Ein „garbage collector“ sorgt dafür, dass nicht benötigte Objekte wieder aus dem Speicher ver­schwin­den. Das ver­lang­samt al­ler­dings die Aus­füh­rung des Codes. Der Compiler von Rust macht den „garbage collector“ obsolet. Statt­des­sen wird bereits beim Kom­pi­lie­ren überprüft, ob es Fehler im Speicher geben könnte.

Die starken Si­che­rungs­funk­tio­nen gehen aber hier eben nicht auf Kosten der Per­for­mance. Rust ist eine Sprache für die Sys­tem­pro­gram­mie­rung wie C/C++ und liefert auch die gleiche Ge­schwin­dig­keit beim Ausführen. Das hat zum einen mit dem Verzicht auf einen „garbage collector“ zu tun. Zum anderen sorgen die „zero cost abs­trac­tions“ für hohe Ge­schwin­dig­kei­ten während der Lauf­zei­ten. Der Begriff bedeutet ei­gent­lich nur, dass man abstrakt pro­gram­mie­ren kann und für diesen Komfort dennoch keine Einbußen bei der Per­for­mance in Kauf nehmen muss.

Diese Tatsache macht Rust zu einer Mischung aus High-Level- und Low-Level-Pro­gram­mier­spra­chen. Ähnlich wie C/C++ ist Rust sehr nah an der Hardware – was für die hohe Ge­schwin­dig­keit sorgt –, kann aber relativ einfach pro­gram­miert werden, wie man es sonst von High-Level-Sprachen kennt.

Letztlich findet man sich sowohl als Anfänger wie auch als er­fah­re­ner Pro­gram­mie­rer schnell in Rust zurecht. Die Sprache entfernt sich in der Be­nut­zungs­wei­se kaum von bekannten Al­ter­na­ti­ven. Ein großer Vorteil liegt aber darin, mit wie viel Aufwand Feh­ler­mel­dun­gen kon­zi­piert wurden. Wo andere Pro­gram­mier­spra­chen nur kryp­ti­sche Errors ausgeben, liefert Rust sinnvolle und hilf­rei­che Hinweise, wie man den Fehler beheben kann.

Tipp

Rust ist eine der Pro­gram­mier­spra­chen, die stark von We­b­As­sem­bly un­ter­stützt werden. Somit wird Rust auch dafür ein­ge­setzt, schnelle An­wen­dun­gen für das Web zu ent­wi­ckeln.

Rust-Syntax – mit Beispiel

Rust ähnelt auf den ersten Blick in seiner Syntax sehr stark C oder C++ – auch Sprachen zur Sys­tem­pro­gram­mie­rung. Wie von dort gewohnt, arbeitet man auch bei Rust mit Funk­tio­nen, Schleifen, Abfragen, Kon­stan­ten und Variablen. Die Klam­mer­set­zung ist hier und da anders, als man es aus älteren Sprachen kennt, das Prinzip ändert sich aber nicht. Natürlich hat Rust aber auch Ei­gen­hei­ten:

  • Neue Funk­tio­nen werden durch den Befehl „fn“ definiert.
  • Die Sprache arbeitet mit Makros, die sich durch ein Aus­ru­fe­zei­chen am Ende des Begriffs aus­zeich­nen.
  • 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 be­son­de­res Ver­ständ­nis von Ownership.

Unter Ownership versteht man in der Rust-Syntax das Ver­hält­nis einer Variablen zu ihrem Wert. Die Be­son­der­heit liegt darin, dass ein be­stimm­ter Wert nur zu einer Variablen gehören kann. Übergibt man den Wert, ist die Variable nicht mehr an­sprech­bar:

fn main() {
    let hello = String::from("Hello, world!");
    let hello1 = hello;
    println!("{}", hello);
}

Dieser Code kann so nicht funk­tio­nie­ren: Der Inhalt von „hello“ wurde an „hello1“ übergeben und kann daher im Makro nicht wieder auf­ge­ru­fen werden. Statt­des­sen muss man die neue Variable im letzten Befehl in­te­grie­ren, was dann zur korrekten Ausgabe führt.

fn main() {
    let hello = String::from("Hello, world!");
    let hello1 = hello;
    println!("{}", hello1);
}
Fazit

Rust bietet mehr Si­cher­heit, mehr Per­for­mance und einen ein­fa­che­ren Umgang. Zwar geht die Pro­gram­mier­spra­che keine komplett neuen Wege, sondern baut auf dem auf, was man bei­spiels­wei­se aus C/C++ kennt, bietet aber in­ter­es­san­te neue Features. Besonders wenn man bereits mit anderen Sprachen vertraut ist, ist der Umstieg nicht schwierig.

Wer die moderne Pro­gram­mier­spra­che aus­pro­bie­ren möchte, findet in unserem Rust-Tutorial die ersten Schritte.

Zum Hauptmenü