Ich berate Dich gerne.
Anneke Schmeer, Customer Success Managerin
von Tim Mittermüller
| zuletzt aktualisiert am 30.04.2024
- |
- Technologien
Kaum eine Programmiersprache erfuhr kürzlich einen so rasanten Aufstieg wie Rust. Der „Neuling“ macht quer durch die Code-Community von sich reden – und die Lobeshymnen reißen nicht ab.
Grund genug für unsere Softwareexpert:innen, die Programmiersprache Rust auf Herz und Nieren zu prüfen und zu evaluieren, ob ein Einsatz in unseren Projekten sinnvoll sein könnte.
Unser Fazit: Grundsolide mit viel Potenzial!
Im Folgenden findest Du unseren Blick aus der Praxis auf Rust:
was es auszeichnet und warum es so viel Aufmerksamkeit erregt,
welche Vorteile es für Unternehmen und Entwickler:innen bietet,
sowie woran man vielleicht noch arbeiten muss.
Eine knappe Zusammenfassung findest Du übrigens am Ende des Artikels.
Die Basics: Was die Programmiersprache Rust ist und was sie besonders gut kann
Was ist Rust?
Rust ist eine moderne, systemnahe Programmiersprache, die 2006 als Privatprojekt des Mozilla-Mitarbeiters Graydon Hoare initial entwickelt wurde. 2010 wurde die Weiterentwicklung von Mozilla übernommen und 2015 schließlich die erste stabile Version veröffentlicht.
Rust konzentriert sich auf Sicherheit, Geschwindigkeit und Parallelität. Es wurde entwickelt, um die Fehleranfälligkeit von Software zu verringern, ohne dabei die Leistung zu beeinträchtigen – ein Kompromiss, den Entwickler:innen bisher häufig eingehen mussten.
Die wichtigsten Argumente für die Programmiersprache Rust
Rust zeichnet sich durch seine Sicherheitsfunktionen und seine Performance aus. Beides sind maßgebliche Faktoren bei der Entscheidung für eine Programmiersprache und deren konkrete Eignung.
Vor allem in folgenden Feldern spielt die Programmiersprache Rust ihre Stärken aus:
Sicherheit und Stabilität
Rust legt besonders viel Wert auf Sicherheit. Das tut sie, indem sie klare Regeln definiert, an welchen Stellen im Code mit welchen Daten wie interagiert werden kann. So kann bspw. nicht gleichzeitig an einer Stelle editiert werden, während eine andere Stelle liest. So werden ganze Kategorien an Fehlerquellen schon beim Kompilieren verhindert, bevor der Code ausgeführt wird (bspw. Memory-Leak und Data Races). In Sprachen, in denen diese Hilfe nicht zur Verfügung steht, kommt es hingegen häufig zu Situationen, in denen das Debugging zur Laufzeit schwierig ist.
Wartbarkeit und Erweiterbarkeit
Je nach Programmiersprache sind wachsende Codebasen mit der Zeit immer schwieriger zu handhaben. Es gibt eine Vielzahl von Design Patterns, deren Aufgabe es ist, diesen Prozess zu erleichtern. Anpassungen am Code verursachen oft eine Kette von Hinweisen durch den Compiler, die alle notwendigen Anpassungen im Code aufzeigen. Rust Typsystem und Konzepte (zum Beispiel „exhaustive pattern matching”) führen letztlich dazu, dass auch eine große Codebasis häufig direkt funktioniert, sobald sie kompiliert.
Performance
Rust geht kaum Kompromisse bei der Performance ein. Es vermeidet verlangsamenden Overhead durch Garbage Collection oder Laufzeittypisierung und spielt deshalb in der gleichen Liga mit traditionellen Low-Level-Sprachen wie C und C++.
Diese Performance ist entscheidend für Anwendungen, die hohe Anforderungen an Geschwindigkeit und Effizienz stellen – also z.B. Echtzeitanwendungen, eingebettete Systeme oder große verteilte Systeme.
Mit Rust können Entwickler:innen sicher sein, dass ihre Anwendungen nicht nur sicher, sondern auch schnell und reaktionsfähig („predictable performance“) sind, selbst unter extremen Bedingungen.
Was unterscheidet Rust von den meisten anderen Sprachen?
Der wesentliche Unterschied zu anderen Programmiersprachen liegt für uns in Rusts Umgang mit Speicher.
Die herkömmlichen Wege
Um Speicher zu managen, lauten die zwei mit Abstand verbreitetsten Strategien entweder „Manual” oder „Garbage Collected”.
Manual bedeutet, dass der Arbeitsspeicher manuell vom Betriebssystem erfragt wird und später wieder zurückgegeben werden muss.
Garbage Collected bedeutet, dass die Laufzeitumgebung der Sprache im Hintergrund das Erfragen und Zurückgeben von Speicher an das Betriebssystem übernimmt.
Rusts Ownership-Modell
Rust hingegen setzt auf ein strenges Ownership-Modell (das hier genau erklärt wird).
So wird sichergestellt, dass Speicher ordnungsgemäß verwaltet wird und keine Data Races oder Sicherheitslücken auftreten. Jeder Wert hat einen eindeutigen Eigentümer, und es gibt klare Regeln für das Ausleihen und Übertragen von Werten.
Borrowing (Ausleihen)
Um Werte im Code zu teilen, gibt es die Möglichkeit diese auszuleihen. Dies ermöglicht den Zugriff auf Werte, ohne deren Eigentümer zu ändern. Diese Ausleihen unterliegen jedoch strengen Regeln um sicherzustellen, dass sie während ihrer Gültigkeitsdauer sicher und ohne Inkonsistenzen verwendet werden können.
Die besten Anwendungsgebiete von Rust – und wie wir es verwenden
Rusts Einsatzbereich ist enorm vielseitig. So vielseitig, dass es beinahe in jedem Bereich einsatzfähig ist. Die zentrale Frage lautet daher viel eher, ob die konkreten Anforderungen zu den Stärken von Rust passen – oder ob diese nicht von anderen Sprachen (noch) besser erfüllt werden.
Basierend auf über 25 Jahren Digitalexpertise sehen wir einige Einsatzgebiete, bei denen Rust seine vollen Stärken wie kein zweiter ausspielen kann.
Wofür wir Rust ideal geeignet sehen
Sicherheitskritische Systeme
Die Programmiersprache Rust eignet sich besonders gut für sicherheitskritische Anwendungen, in denen Fehler verheerende Auswirkungen haben können. Branchen wie die Luft- und Raumfahrt, die Automobilindustrie und die Medizintechnik verlassen sich auf Rust, um hochzuverlässige und fehlertolerante Systeme zu entwickeln. Die Garantien von Rust bieten hier ein hohes Maß an Vertrauen, da potenzielle Probleme bereits während der Entwicklung erkannt und behoben werden können.
Webentwicklung
Auch in der Webentwicklung gewinnt die Programmiersprache Rust zunehmend an Bedeutung. Mit Frameworks wie Axum und Actix bietet Rust eine moderne und leistungsfähige Alternative zu anderen Sprachen und Frameworks. Rust eignet sich besonders gut für Backend-Systeme, die hohe Anforderungen an Sicherheit, Geschwindigkeit und Skalierbarkeit stellen. Führende Technologieunternehmen nutzen Rust für die Entwicklung von APIs, Microservices und Webanwendungen, die auch unter Last zuverlässig und effizient bleiben müssen.
Embedded-Entwicklung
Rust hat sich als beliebte Wahl für die Embedded-Entwicklung etabliert, insbesondere für IoT-Anwendungen und eingebettete Systeme. Die Sicherheitsfunktionen von Rust sind in diesem Bereich besonders wichtig, da Fehler in eingebetteten Systemen oft schwerwiegende Konsequenzen haben können. Mit Rust können Entwickler:innen sicherstellen, dass ihre Systeme nicht nur effizient, sondern auch robust und fehlertolerant sind – und das selbst in ressourcenbeschränkten Umgebungen.
Unsere Erfahrungen mit Rust
Warum haben wir uns für Rust entschieden?
In unserem Alltag erlaubt es uns Rust, in neue technische Bereiche einzusteigen, die zuvor mit unseren Bestandssprachen nicht möglich waren. PHP und Typescript schließen es bspw. aus, native Bibliotheken zu bauen, die als Erweiterung für Nginx, Node.js oder die PHP Runtime eingesetzt werden können.
Ein gewichtiger Vorteil für Rust, den wir in der Praxis nicht mehr missen möchten!
Wo setzen wir Rust ein?
Das strenge Design von Rust kommt besonders unseren Pipelines zugute – und verhindert durch sein pedantisches Typsystem Bugs. Das reduziert Kosten für uns und unsere Kunden.
Denn wir entwickeln Tooling, das für uns sicherstellt, dass bspw. die Container-Images, die in unseren Kubernetes-Konfigurationen verwendet werden, nur aus bestimmten Quellen stammen und auch in ihren Registries existieren. Weil unser Tooling in Pipelines direkt mit unseren Entwickler:innen interagiert, sind Bugs direkt mit Kosten verbunden. Rust ist aufgrund seines pedantischen Sprachdesigns dafür gut geeignet. Fehler im Umgang mit dem Dateisystem und Netzwerkanfragen werden im Typsystem von Rust - insbesondere durch den Result-Typ - immer explizit behandelt und verhindern, dass man etwas übersieht.
Was bringt uns der Einsatz von Rust?
Das Typsystem von Rust findet viele Fehler, bevor die Tests, das QA-Team oder im schlimmsten Fall das Produktivsystem darauf stoßen. Das Resultat: Die Qualität des ausgelieferten Codes ist besser. Wir sparen Zyklen zwischen QA- und Entwicklungsteams, weil mehr Probleme schon während der Entwicklung entdeckt werden. Und unsere Kunden profitieren so von stabilen Systemen.
Rust erweist sich zudem als produktives Werkzeug für die Zusammenarbeit großer Teams von Entwickler:innen mit unterschiedlichen Kenntnissen. Low-Level-Code ist anfällig für viele subtile Fehler, die schwer zu finden sind und in anderen Programmiersprachen häufig nicht vor der Veröffentlichung entdeckt werden können – selbst mit Tests, Analysetools und gründlichen Code-Reviews…
In Rust hingegen übernimmt der Compiler einen Großteil dieser Arbeit, indem er verhindert, dass schwerwiegende Fehler beim Speichermanagement und in parallel arbeitenden Code auftreten. Dadurch - und durch das Typsystem der Sprache - kann sich das Team besser auf die Funktionalität seiner Software konzentrieren.
Die Schwächen von Rust
Community und Ökosystem
Die Richtung, die Rust als moderne Technologie einschlägt, ist klar erkennbar. Dennoch ist die Programmiersprache vergleichsweise jung, was Vorteil und Nachteil zugleich ist. So ist sie einerseits sehr modern. Andererseits ist die Community deutlich kleiner als etwa die Typescript-Community.
Das hat zur Folge, dass die Anzahl an verfügbaren Bibliotheken und Frameworks noch gering ist und sich für manche Anwendungsbereiche noch keine entsprechenden Lösungen finden lassen. Dieser Nachteil ist aber aller Voraussicht nach nicht von Dauer: Die Community wächst stetig und mit ihr entstehen täglich neue Libraries und Tools.
Damit einher geht allerdings noch ein weiterer temporärer Nachteil: Die vergleichsweise kleine Community bedeutet, dass es entsprechend schwierig ist, qualifizierte Rust-Entwickler:innen zu finden.
Nicht förderlich für diese Nachteile: Die Programmiersprache hat eine recht steile Lernkurve. Das liegt insbesondere an dem neu- und einzigartigen Ansatz des Speichermanagements. Das kann zu Beginn zu längeren Prototyping-Phasen führen, zahlt sich später jedoch aus.
Was darf sich noch verbessern?
So positiv die Entwicklung von Rust insgesamt sein mag, gibt es doch auch einige kritische Punkte zu bedenken. 43 % der befragten Rust-Entwickler:innen haben der Rust Survey 2023 zufolge Bedenken, dass die Technologie künftig zu komplex werden könne – schließlich ist sie schon heute nicht sehr einsteigerfreundlich. Sie fordern, die Weiterentwicklung von Rust entsprechend zu verlangsamen und vorhandene Features zunächst zu stabilisieren.
Für eine gute Perspektive der Programmiersprache sind besonders junge, nachkommende Entwickler:innen entscheidend. Und damit diese überhaupt Interesse an Rust gewinnen, verlangen mehr und mehr Menschen, dass die Komplexität entsprechend reduziert werden muss.
Zusammengefasst: Das sind die größten Vorteile von Rust
Gilt es, sich für eine Programmiersprache zu entscheiden, so sind die drei zentralen Argumente für Rust aus unserer Sicht Sicherheit, Wartbarkeit und Performance.
In unserer Checkliste haben wir die bedeutendsten Vorteile der Programmiersprache kompakt für Dich zusammengefasst:
Sicherheit
starke Typisierung und Ownership-Model verhindern viele Fehlerarten
kein Null-Pointer-Dereferencing oder Buffer Overflows
Leistung
kompiliert zu Maschinencode ohne großen Laufzeit
auch für WebAssembly geeignet
native Unterstützung für Asynchronität
simple und effiziente Nutzung von Multi-Core-Prozessoren
Produktivität
moderne Toolchain (Cargo) für dependency Management, Building, Testing und Dokumentation
modernes Typsystem
kann zur Erstellung von nativen Bibliotheken genutzt werden, die in den meisten Sprachen über FFI (Foreign Function Interface) genutzt werden können
kann zur Erstellung von WebAssembly Bibliotheken genutzt werden um auch im Browser verwendet zu werden
Portabilität
Cross-Compilation ist relativ einfach
lauffähig auf einer Vielzahl von Plattformen: MacOS, Windows, Linux, Browser, Android, IoS und sogar ohne Betriebssystem auf Embedded Devices
Verbreitung
exzellente Dokumentation und Community-Support
wachsendes Ökosystem von Libraries und Frameworks, die unter anderem für Webanwendungen entwickelt werden (z.B. Axum, Actix)
Fazit: Ein Schritt weiter in Richtung sicherer, performanter und eleganter Softwareentwicklung
Hunderte von großen und kleinen Unternehmen verwenden Rust in der Produktion für eine Vielzahl von Aufgaben. Dazu gehören auch große Namen der Technologiebranche wie Figma, Microsoft, Discord, Google, Amazon, Meta und Cloudflare. Es wird zum Beispiel in großen Teilen der Webbrowser Firefox und Chromium verwendet, in AWS, in Microsoft Azure, in Android, in Windows, in Linux und in Pingora von Cloudflare, das kürzlich Open Source wurde.
Doch Rust ist nicht nur eine Programmiersprache – sondern auch eine Bewegung. Sie steht für sichere und performante Softwareentwicklung, worauf auch wir in unseren Produkten größtmöglichen Wert legen. Selbstverständlich also, dass wir – natürlich immer ordentlich abgewägt – mehr und mehr auf Rust setzen.
Rust bietet eine breite Palette von Anwendungsmöglichkeiten und eignet sich für Unternehmen und Projekte in verschiedenen Branchen. Die Vielseitigkeit und Leistungsfähigkeit von Rust machen es zu einer zukunftssicheren Wahl für Entwickler:innen und Organisationen, die eine moderne und sichere Programmiersprache suchen.
Und: Die Zukunft von Rust sieht vielversprechend aus. Eine wachsende Community, eine reife Codebasis und ständige Weiterentwicklung. Entsprechend gut ist Rust positioniert, um in den kommenden Jahren noch wichtiger zu werden.
Wir sind gespannt, wie sich Rust in den kommenden Jahren weiterentwickeln wird und freuen uns darauf, diese Entwicklung mitzuerleben. Rust hat bereits heute die Art und Weise, wie Software entwickelt wird, nachhaltig verändert und unterstützt Entwickler:innen, sicherere Software zu schreiben.
Wer jetzt noch etwas mehr über Rust und seine Möglichkeiten lernen möchte, sollte sich mal mit dem Buch “The Rust Programming Language” beschäftigen.
tl;dr
Rust ist eine moderne Programmiersprache, die Sicherheit, Performance und Wartbarkeit in den Vordergrund stellt. Bei brainbits nutzen wir sie immer mehr und sehen in ihr eine vielseitige und leistungsstarke Programmiersprache mit großem Potenzial.
|
|
Rust eignet sich in unserer Einschätzung am ehesten für:
Sicherheitskritische Systeme (z.B. Luft- und Raumfahrt, Automobilindustrie, Medizintechnik)
Webentwicklung (z.B. Backend-Systeme, WebAssembly)
Embedded-Entwicklung (z.B. IoT-Anwendungen)
Native Bibliotheken und Tools