Rust im Jahr 2025: Auf dem Weg zu Foundational Software
(smallcultfollowing.com)- Rust feiert in diesem Jahr sein 10-jähriges Bestehen und etabliert sich als zentrale Sprache für die Entwicklung von Foundational Software
- Foundational Software bezeichnet die Schicht, die allem zugrunde liegt, etwa Betriebssystem-Kernel, Cloud-Plattformen, Embedded-Geräte und CLI-Tools
- Rust bietet Performance und Zuverlässigkeit auf C/C++-Niveau und senkt zugleich dank eines Typsystems mit garantierter Speichersicherheit die Hürden
- Rusts Mission beschränkt sich nicht nur auf den Basisbereich, sondern wirkt mit Projekten wie Dioxus, Tauri, Leptos auch auf die Entwicklung höherer Anwendungsebenen aus
- Künftig sind Sprachinteroperabilität, Ausbau des Typsystems und Stärkung des Ökosystems als zentrale Investitionsbereiche geplant
Rusts Vision: Foundational Software
- Rusts Kernvision ist es, Foundational Software einfacher zu schreiben und zu warten
- Dazu zählen Betriebssystem-Kernel, Cloud-Infrastruktur, Embedded-Geräte und CLI-Tools, also die Grundlagen aller Systeme
- Rust wird bereits in vielen Bereichen eingesetzt, darunter im Windows- und Linux-Kernel, in der VSCode-Suchmaschine ripgrep, in Deno und im Python-Paketmanager uv
- Bei solcher Software sind Performance, Zuverlässigkeit und Produktivität gleichzeitig entscheidend
- Wenn die Grundlage versagt, wirkt sich das auf alle darüberliegenden Schichten aus, daher ist Stabilität unverzichtbar
- Leistungseinbußen setzen die Grenzen für die Performance der höheren Schichten, deshalb ist minimaler Overhead nötig
Performance, Zuverlässigkeit und Produktivität von Foundational Software
- Foundational Software hat wie jede Software vielfältige Anforderungen, nur ist hier jeder einzelne Aspekt noch wichtiger
- Zuverlässigkeit hat höchste Priorität. Wenn das Fundament zusammenbricht, scheitert alles, was darauf aufbaut
- Performance-Overhead bestimmt die Leistungsgrenze der höheren Schichten und muss daher minimiert werden
- Bisher gab es zur Erfüllung dieser Anforderungen im Wesentlichen zwei Optionen
- C/C++: bietet große Freiheit, verlangt dafür aber ein entsprechend hohes Maß an Perfektion
- Höhere Programmiersprachen wie Java oder Go: erfordern spezielle Codierweisen, um die Performance zu halten, und schränken den Einsatz von Abstraktion und Komfort ein
- Rust verändert diesen Ansatz durch die Kombination aus Zero-Cost-Abstraktionen und einem Typsystem, das Speichersicherheit garantiert
- Damit wird es möglich, High-Level-Code sicher zu schreiben und zugleich Low-Level-Performance und Speicherstabilität zu erreichen
Hürden senken und Entwickler stärken
- In Rust-Vorträgen werden Typsystem und statische Prüfungen oft mit „Spinat“ verglichen: gut für einen, aber nicht unbedingt beliebt
- In der Praxis ist das Typsystem jedoch ein äußerst wirkungsvolles Werkzeug für Entwickler
- Einsteiger können durch das Typsystem lernen, wie erfolgreiche Softwarestrukturen aufgebaut werden
- Erfahrene Entwickler entdecken Fehler in ihren eigenen Architekturentwürfen schneller
- Yehuda Katz’ Aussage, dass „Abstraktionen, die man in einem Zustand tiefer Konzentration schafft, dem müden zukünftigen Ich helfen“, fasst das sehr gut zusammen
Bereiche außerhalb der Foundational Software
- Auch wenn Rusts Mission auf Foundational Software fokussiert ist, bedeutet das nicht, dass andere Bereiche ignoriert werden
- Projekte wie Dioxus, Tauri, Leptos erweitern Rust auch in Richtung höherer Anwendungsebenen wie GUIs und Webseiten
- Rusts wichtigste Stärken liegen zwar grundsätzlich im Bereich Foundational Software, doch diese Versuche sollten nicht übersehen werden
Ambitionierte Ziele und Wachstum
- Da Foundational Software Kontrolle über Details auf niedriger Ebene erfordert, wird Zugänglichkeit und Ergonomie oft als weniger wichtig angesehen
- Gerade weil diese Detailkontrolle nötig ist, ist gute Usability umso wichtiger
- Wenn Entwickler sich nur auf die wirklich wichtigen Teile konzentrieren können, steigt die Produktivität deutlich
- Projekte, die den Einsatz von Rust auf höherer Ebene vorantreiben, eröffnen Chancen, das Programmieren mit Rust insgesamt komfortabler zu machen
- Diese Verbesserungen fließen dann direkt auch in die Entwicklung von Foundational Software zurück
- Entscheidend ist, die Kontrolle und Zuverlässigkeit zu bewahren und zugleich die Ergonomie zu erhöhen
Warum Full-Stack-Unterstützung wichtig ist
- Ein weiterer Grund, warum angenehme Entwicklung von High-Level-Anwendungen in Rust wichtig ist, besteht darin, dass sich damit der gesamte Stack mit einer einzigen Technologie aufbauen lässt
- Entwickler, die Rust zunächst nur in Teilbereichen wie Data-Plane-Services einsetzen wollten, weiten den Einsatz häufig auf den gesamten Bereich aus
- Der Grund dafür ist Rusts hohe Produktivität und die Möglichkeit, Bibliotheken und Code in einer Sprache gemeinsam zu nutzen
- Im Kern bleibt einfacher Code in jeder Sprache einfach
Die Erfahrung von Iterative Deepening
- Idealerweise sollte die erste Erfahrung mit Rust einfach sein, und mit dem Fortschritt eines Projekts sollte sich schrittweise und lokal mehr Kontrolle hinzufügen lassen
- Das klingt einfach, ist in der Praxis aber eine sehr schwierige Aufgabe
- Viele Projekte scheitern daran, dass die Einstiegshürde für Anfänger hoch ist oder dass für höhere Kontrollstufen sehr viel Wissen erforderlich ist
- Rust gelingt das nicht immer, arbeitet aber kontinuierlich daran, sich in diesem Punkt zu verbessern
Der weitere Plan
- Dieser Text ist der erste Beitrag einer Reihe; in vier weiteren Teilen sollen die Investitionsfelder vorgestellt werden, die Rust besser für Foundational Software machen sollen
- Sprachinteroperabilität (smooth language interop) und Erweiterbarkeit (extensibility)
- Klarheit des Ziels durch das Typsystem (clarity of purpose)
- Stärkung des Ökosystems: bessere Leitlinien, Werkzeuge und Nutzung der Rust Foundation
- Der letzte Beitrag behandelt die Organisation von Rust-Open-Source-Projekten und wie Beiträge und Wartung möglichst zugänglich und angenehm gestaltet werden können
15 Kommentare
Rust wirkt zwar irgendwie ganz ordentlich, ist für mich aber wohl die einzige Sprache, die ich wegen ihres toxischen Fandoms(?) meide.
Ich wünschte, es gäbe für C oder C++ einen standardmäßigen Paketmanager. Wenn ich mir Cargo anschaue, denke ich das immer wieder.
Wie lecker Spinat doch ist....
Heutzutage gibt es praktisch keinen Bereich mehr, in dem Rust nicht eingesetzt wird.
Ich arbeite zwar bei einem ziemlich großen Unternehmen, aber es gibt dort keinen Bereich, in dem Rust eingesetzt wird. Bitte stellen Sie das nicht verzerrt dar.
Legen Sie sich nicht mit mir an.
Boah...;;
Legt euch bitte nicht mit mir an, zitter zitter
Krass ;;
Boah;;;
Mal ganz davon abgesehen, wegen der heutigen Rust-Fanatiker drehe ich fast durch. Offline sind sie selbst unter den Minderheiten eine absolute Randgruppe, online aber fast wie ISIS ... Ach, wenn sie sich doch einfach irgendwo an einem Ort versammeln und nur unter sich bleiben würden ...
Bei manchen, die wie Rust-Evangelisten auftreten, fragt man sich oft, ob sie es selbst überhaupt richtig verwenden.
Trotzdem ... Sie mögen Rust doch, oder?
Ihr dürft Rust-Fanatiker hassen, aber bitte liebt Rust ;_;
Selbst wenn man wie bei FFmpeg Prügel bezieht, müsse man dennoch den gesamten Code in Rust schreiben oder so ähnlich.
Hacker-News-Kommentare
Wenn es um Kernsoftware geht, ist das größte Manko von Rust meiner Meinung nach die ABI. Wenn man ein OS in Rust bauen und reichhaltige Dienste anbieten will, müssen Anwendungen auch nach einem Upgrade des OS nutzbar bleiben, ohne Bibliotheken neu kompilieren zu müssen. Windows löst dieses Problem mit COM, Apple tat es früher mit dynamic dispatch in ObjC (und heute mit der Swift-ABI), Android mit der JVM und Bytecode. Rust unterstützt faktisch nur
extern "C", daher ist die Nutzung dynamischer Bibliotheken eingeschränkt. Eine ABI ohne VM-Schicht (JVM, .NET) bereitzustellen ist extrem schwierig, und weil man einmal festgelegte Implementierungsdetails niemals mehr ändern darf, ist es nachvollziehbar, dass das keine hohe Priorität hat. Tatsächlich waren nur Swift und COM mit so einem Modell wirklich erfolgreich. Wenn Rust eine vollständige ABI bekäme, wäre es fast eine perfekte Sprache. (Wenn Abhängigkeiten in Binärform verwaltet würden, würden auch die Compile-Zeiten stark sinken.)dlopen) gibt es Werkzeuge wie stabby und abi_stable, die ziemlich gut funktionieren. Für allgemeinere Sprachinteroperabilität könnte crABI (crABI-Vorschlag) künftig eine Alternative sein. Das ist allerdings kein Problem, das Rust allein lösen kann; dafür braucht es Unterstützung und Zusammenarbeit vieler Communities, etwa anderer Sprachen und Linux-Distributionen. Außerdem wird erwähnt, dass Rust I/O und Speicherallokation explizit auswählt, weshalb ein Modell wie bei Swift, das alles über Shared Libraries löst, möglicherweise nicht gut passt.repr(wasm)/extern "wasm", aber mit wit-bindgen oder dem Ziel wasm32-wasip2 lässt es sich ohne große Mühe nutzen. Einführungsvideo zu Wasm Componentsextern "C"-ABI bereits alles Nötige erledigen. Und es soll auch Vorschläge geben, dieextern-ABI auf mehr Typen auszuweiten.Ich mag Rust wirklich sehr, aber es gibt einige dauerhaft nervige Probleme, die mehr Aufmerksamkeit bekommen sollten.
test-Submodul fällt unter diese Regel. Um Tests sauber zu trennen, müsste man alle Testfunktionen im Crate-Root definieren, was in der Praxis ineffizient ist.proc macround Ähnliches ausreichend Hygiene garantiert ist.Über den Ausdruck „Smooth, iterative deepening“ nachdenkend, scheint Rust die Cross-Language-Kompatibilität zu stark zu betonen, was eher die Komplexität erhöht und die Sicherheit gefährden könnte. Hilfreicher wäre es in so einem Fall, eher die unterste Schicht des Systems wie
libczu ersetzen. Go führt fast keine sprachübergreifenden Aufrufe aus. Google hat Kernbibliotheken selbst entwickelt und damit das Fundament gestärkt, während bei Rust viele unterschiedliche Versionen grundlegender Bibliotheken nebeneinander existieren und vieles unvollständig ist.Es wird hervorgehoben, dass „Allokationen vermeiden, keinen GC triggern“ nicht zu modernen Konzepten von GC und JIT passt. Moderner GC hat teils nahezu keine stop-the-world-Latenz mehr, und der gesamte CPU-Aufwand für GC hängt stark vom Verhältnis zwischen resident set und Heap-Größe ab. JIT hat gegenüber AOT sogar mehr Optimierungsmöglichkeiten und kann aggressiver explorieren (dank spekulativer Optimierung). Wirklich relevant sind Start-/Warmup-Latenz, Speicher-Overhead und durchschnittliche Performance, nicht die verschlechterte Worst-Case-Performance. Außerdem ist manuelle Speicherverwaltung nicht zwingend effizienter, und selbst wenn der tatsächliche RAM-Verbrauch dreimal so hoch wäre, könnten die Kosten trotzdem null sein. Empfehlenswert ist dazu auch dieser ISMM-Konferenzvortrag.
Es wird gesagt, dass die markierten Kommentare und die Diskussion die Kernfragen gut getroffen hätten. Fragen wie „Lasst uns einen Sprachstandard mit offizieller Spezifikation schaffen“ und „Wir brauchen mehrere Implementierungen“ seien praktisch sehr wichtig. Besonders @infogulch habe gut herausgestellt, dass eine Sprache eine offizielle Spezifikation braucht, wenn sie zur industriellen Grundlage werden soll (Referenzkommentar).
Leute stellen oft schon die Frage infrage, ob Rust überhaupt eine Spezifikation haben sollte, und genau das zeigt, wie wenig tatsächliches Engineering es im Software Engineering gibt.
Zu einem Kommentar, Rust sei „eine Sprache für Leute, die nur wie Programmierer aussehen wollen“, sagt jemand, dass man selbst Programmieren liebe und Rust deshalb wie ein frischer Schock gewesen sei. Man wolle auf keinen Fall in die Zeit zurück, in der C++ extrem schmerzhaft war. Auch Sprachstandard (Spende der Ferrocene-Spezifikation) oder die Anzahl der Implementierungen halte man nicht für entscheidend. Python und Java funktionieren ebenfalls gut, obwohl sich alles auf eine zentrale Implementierung stützt. C++ habe durch die Unterstützung mehrerer Compiler letztlich nur die plattformspezifische Komplexität vergrößert. Was genau mit dem „Durcheinander“ von cargo gemeint sei, sei unklar; aus C++-Sicht sei es dort viel unbequemer gewesen.