FOSDEM 24: Rust statt Rost fĂĽr GNU GCC
Mehr Compiler für die Sprache Rust sollen her! Ein Projekt, das seine Pläne zur FOSDEM präsentiert, will die GNU Compiler Collection um Rust ergänzen.
Schöner Quellcode, einwandfreies Speichermanagement – aber mit was kompilieren? Das Projekt Gccrs arbeitet an einer Erweiterung für GCC (GNU Compiler Collection), die mit Rust umgehen kann. Schließlich kann diese Compiler Collection schon C, C++, Objective C, Ada 95, Fortran 77, Go, und D mit den jeweiligen Frontends in ausführbaren Programmcode übersetzen. Es gibt noch mehr Frontends für weitere Sprachen, die aber nicht Teil der Standard-Distribution des GNU GCC wurden. Teils, weil die Übersetzung des Quellcodes nicht ausreichend gründlich ist, aber auch, wenn Sprachen wegen ihrem Alter nicht mehr gebräuchlich sind. Pascal ist ein Beispiel dafür, denn deren Programmierer-Community schrumpft.
Lust auf Rust: Hype oder hilfreich?
Ein Rust-Frontend wäre hingegen eine willkommene Ergänzung, denn die Nachfrage nach alternativen Compilern für eine leicht aktualisierbare Toolchain, die nicht gleich ein neues Fass aufmacht, wird händeringend gesucht. Gccrs ist einer von zwei Projekt-Ansätzen, GCC fit für Rust zu machen und präsentiert die beachtlichen Fortschritte auf der FOSDEM24. Die anschließende Diskussion geriet dabei beinahe länger als der Vortrag selbst. Denn die Anstrengung hinter einem Rust-Fontend für GCC erscheint gegenüber der bestehenden Toolchain von Rustup wie eine Neuerfindung des Rades, das erst mal nicht rund laufen wird. Arthur Cohen der maßgebliche Kopf hinter Gccrs, sagt dabei aber selbst, GCC war der erste Compiler, den er professionell nutzen wollte. Und diese alte Liebe rostet eben nicht. Doch auch für die Konsistenz von Toolchains für eher langsam fortschreitende Linux-Distributionen wäre eine Re-Implementierung eines Rust-Compilers in GCC durchaus hilfreich.
Rust ist eine jener Programmiersprachen, die in den vergangenen Jahren enormen Anklang gefunden hat. Bei einer stringenten Verwendung der verfügbaren Compiler-Flags gibt es weniger Fehlerpotential bei der Speicheradressierung. Und die Chancen, mit syntaktisch korrektem Code dennoch undefinierte Verhaltensweisen im kompilierten Programm zu provozieren, sind geringer, als in den verwandten Sprachen C und C++. Es gibt Bestrebungen, älteren Quellcode von C/C++ nach Rust zu überführen, oder größere Projekte um Subsysteme zu ergänzen, die in Rust geschrieben sind. Die prominenten Ansätze umfassen beispielsweise die GNU Coreutils für Linux und UNIX-ähnliche Betriebssysteme, die als Utils in Rust neu, jedoch als Drop-in-Replacement auferstehen.
Rust-Compiler: Die Entwicklung drängt
Auch die Linux-Kernel-Entwicklung will Rust als weitere Programmiersprache neben C aufnehmen und hat mit dem Linux Kernel 6.1 immerhin schon eine Testumgebung ausgerollt. In absehbarer Zeit können kleinere Linux-Subsysteme in Rust-Quellcode entwickelt werden. Dabei zeigen sich schon ganz praktische Probleme: Was soll den schönen Rust-Quellcode kompilieren? Um einen Kernel komplett kompilieren zu können, müssen Linux-Distributionen eine komplette Toolchain, also alle Werkzeuge von Linker bis Compiler, mit ausliefern. Aber die Rust-Gemeinde selbst nutzt eine eigene Toolsammlung namens Rustup mit dem Compiler rustc. Ausgerechnet Rustup steht in einigen Linux-Distributionen wie dem Dauerläufer Debian aber nicht immer in den aktuellen Versionen zur Verfügung, denn die jeweiligen Veröffentlichungszyklen sind zu unterschiedlich. Es besteht die Gefahr, dass eine Neukompilierung des Linux-Kernels auf diesen Linux-Systemen in der nahen Zukunft nicht gelingt, ohne externe Repositorys für Rustup hinzuzuziehen. Diese Situation erinnert an Clang/LLVM, das immerhin den Linux-Kernel kompilieren kann, aber optional ist, da keine Subsysteme im Kernel diesen Compiler und dessen Optimierungen fest voraussetzen.
Schon gestanden: Verbrechen am Compiler
Gccrs verwendet als Referenz die Implementierung von Rust 1.49. Das entwickelte Frontend soll GNU GCC bis herunter zur Version 4.8 unterstĂĽtzen, also eine Version, die vor zehn Jahren erschien. Das wird nicht gelingen ohne eine Reihe von "Verbrechen" gegenĂĽber dem Compiler. So verlangt Gccrs nach einer Binary, die Makros von Rust erst mal fĂĽr GNU GCC ĂĽbersetzt, da GCC nicht selbst damit umgehen kann. Auch nicht gerade elegant: Das Foreign Function Interface (FFI) von Rust erlaubt den Aufruf von Funktionen in anderen Sprachen, etwa von C. Auch dafĂĽr muss Gccrs erst noch einen Ăśbersetzer bereitstellen.
Die größte Herausforderung ist die Implementierung des "Borrow-Checkers" von Rust-Compilern, der schließlich Rust erst zu einer sicheren Programmiersprache macht. Eine Neu-Implementierung wäre zu aufwändig und Gccrs setzt deshalb auf die Bibliothek Polonius von Rust, welche aktuell noch nicht als stabil gilt.
Damit sich die Toolchain aber selbst kompilieren kann, inklusive Polonius, ist eine separate Version von Gccrs nötig. Diese wird als Developer-Version strikt vom ausgelieferten Frontend getrennt sein. Sonst gäbe es kaum Vorteile, sondern nur einen GCC, der nebenbei eben noch Rust kompiliert, ohne dabei wirklich ausreichend überprüften Programmcode zu generieren.
Frust: Keine konsistente Toolchain
Diese Pläne scheinen bezüglich der gletscherhaft bedächtigen Fortschritte bei GNU GCC als Unternehmung für die nächsten zehn Jahre. Zuletzt präsentiert Arthur Cohen aber noch zwei Asse: Sowohl haben sich Entwickler von GNU GCC für diesen Ansatz begeistert, als auch Köpfe hinter dem Rust-Compiler selbst. Ein ambitioniertes Projekt, eine Menge Kritik auf der FOSDEM24, aber viele helfende Hände: Das Github-Repository für Gccrs stößt bereits auf enormes Interesse und listet zahlreiche Mitwirkende. Auch das GCC Steering Comitee hat Gccrs schon grünes Licht gegeben und GCC 14 soll das Frontend schon mal als Beta aufnehmen. Für GNU GCC scheint zudem ein Rust-Fontend in seiner Evolution ein unausweichlicher Schritt zu sein.
Bei Linux-Distributionen, die als Langläufer ausgelegt sind, sollte Gccrs zudem auf weiteres Wohlwollen fallen. Doch die Trennung zwischen einer Compiler-Ausgabe, der sich selbst kompiliert und dessen Kompilat, das paketiert werden kann, wirft reichlich Sand ins Getriebe dieser neuen Rust-Toolchain. Das Prinzip einer Selbstübersetzung, die GNU GCC vertritt, ist damit nicht mehr ganz erfüllt. Für Linux-Distributionen aber ist Gccrs, weil es eine leichter paketierbare Rust-Toolchain als Rustup, eine willkomene Alternative.
(bme)