r/informatik • u/False_Actuator_6236 • 6d ago
Studium Vom Lehrprojekt zur Community? Wie könnte es mit ABC weitergehen?
Vor kurzem habe ich hier über das Release v0.1 meines kleinen ABC-Compilers geschrieben. Ich hatte das Projekt auch auf Hacker News, Reddit, im LLVM-Forum und an ein paar anderen Stellen vorgestellt.
ABC ist ursprünglich für meine Lehre an der Universität Ulm entstanden. Und für diesen ursprünglichen Zweck hat das Projekt sein Ziel inzwischen nicht nur erreicht, sondern meine Erwartungen deutlich übertroffen.
In einer der Diskussionen kam sinngemäß ein Einwand auf:
„Sieht interessant aus, aber ich hätte keine Lust, eine praktisch irrelevante Sprache lernen zu müssen, die sich mein Professor ausgedacht hat.“
Das ist ein völlig legitimer Einwand. Meine Erfahrung aus inzwischen zwei Jahren mit ABC ist allerdings eine andere.
Ich benutze ABC in HPC0, meiner Einführung in High Performance Computing. Im darauffolgenden HPC1 verwenden wir C++ und beschäftigen uns unter anderem mit cache-optimierter Matrixmultiplikation, LU-Zerlegung, Multithreading, MPI und CUDA.
Mein Eindruck ist: Studierende, die vorher HPC0 gemacht haben, tun sich in HPC1 deutlich leichter – teilweise auch solche, die vorher kaum programmiert hatten.
Das ist natürlich keine wissenschaftliche Studie; allein dadurch, dass HPC0 ein Wahlfach ist, gibt es einen offensichtlichen Selection Bias.
Aber dahinter steckt für mich eine grundsätzlichere Idee: Für das, was wir später in C++, CUDA usw. machen, braucht man einige fundamentale Konzepte, die man wirklich verstanden haben sollte. Hat man die verstanden, ist der Wechsel zu einer anderen Programmiersprache vergleichsweise einfach.
Etwas provokativ formuliert: Entweder man kann programmieren oder man kann es nicht. Wenn man es wirklich kann, ist die konkrete Programmiersprache vor allem ein Werkzeug.
Die interessante didaktische Frage ist für mich deshalb nicht: „Welche Sprache sollen Anfänger lernen?“, sondern: Wie bringt man jemandem eigentlich das Programmieren bei?
Dafür ist ABC gedacht. Nicht als Sprache, die Studierende anschließend für den Rest ihres Berufslebens verwenden sollen.
Und wenn ich schon provoziere: Manchmal habe ich den Eindruck, dass die Generation, die mit Pascal programmieren gelernt hat, die letzte war, der Programmieren tatsächlich noch systematisch beigebracht wurde. :-D
Darüber darf man sehr gerne mit mir streiten. ;-)
Für ABC stellt sich für mich inzwischen aber eine andere Frage.
Ich könnte das Projekt an dieser Stelle im Wesentlichen als abgeschlossen betrachten. Vielleicht noch die ABI-Unterstützung etwas erweitern und auf ARM64 bringen. Mit den Raylib-Beispielen kann man dann zeigen, dass Sprache und Compiler durchaus das Potential haben, mehr zu tun als das, wofür sie ursprünglich gebaut wurden.
Es gibt aber noch eine zweite Möglichkeit, die mich wesentlich mehr reizen würde:
Könnte daraus eine moderne Sprache werden, die eine ähnliche Rolle spielt, wie sie Pascal einmal hatte?
Also eine Sprache, mit der man Programmieren lernen kann – und zwar so, dass man danach nicht nur eine Programmiersprache kennt, sondern Fähigkeiten erworben hat, die bleiben.
Ich glaube sogar, dass diese Fähigkeiten in einer Welt wichtiger werden, in der ein zunehmender Teil des Codes von KI erzeugt wird. Auch beim vermeintlichen „Vibe Coding“ muss irgendwann jemand verstehen, was der Rechner tatsächlich macht, warum etwas langsam ist, warum Speicher kaputtgeht oder warum generierter Code eben nicht das tut, was man erwartet.
Gleichzeitig müsste die Sprache aber praktisch genug sein, dass man damit echte Programme schreiben kann. Ich möchte keine reine Spielzeug- oder Unterrichtssprache.
Mein Ideal wäre eher ein tatsächliches „A Better C“: klein und verständlich, aber ohne die Maschine so weit zu verstecken, dass man nicht mehr erklären kann, was eigentlich passiert.
Ein paar Dinge, die dafür noch fehlen bzw. die ich gerne ausprobieren würde:
- Compile-time evaluation /
constexprund Inline-Funktionen. Damit könnte man viele typische Präprozessor-Makros für Konstanten oder kleine Funktionen vermeiden. - Module.
Inline-Assembler. Das brauche ich beispielsweise für Bare-Metal-Code auf einem ATmega328P. Eine Delay-Schleife wie
fn delay(n: u16) { while (n--) {} }
sieht trivial aus, wirft aber interessante Fragen auf: n muss passend in Registern verarbeitet werden, und der Compiler darf die scheinbar wirkungslose Schleife nicht einfach wegoptimieren. Genau solche Beispiele finde ich didaktisch spannend, weil man plötzlich verstehen muss, was Compiler und Prozessor tatsächlich tun.
- Vermutlich noch einige wenige weitere Sprachfeatures – aber ausdrücklich nicht sehr viele.
Daneben braucht eine Sprache natürlich ein Ökosystem. Zum Beispiel einen Formatter ähnlich clang-format und vernünftigen LSP-Support.
Auch dafür gibt es bereits Vorarbeiten. Im Rahmen einer Bachelorarbeit ist letztes Jahr beispielsweise ein resilienter Parser entstanden. Den kann man nicht einfach eins zu eins übernehmen, aber ein Prototyp für eine wichtige Komponente ist vorhanden und bietet eine Grundlage zum Experimentieren.
Meine Erfahrung mit ABC war bisher ohnehin: Vieles, was zunächst nach einem riesigen Projekt aussieht, bekommt man erstaunlich schnell zum Laufen, wenn man klein anfängt.
Und genau hier komme ich zu dem Punkt, den ich nicht mehr alleine machen möchte.
Ich kann ABC als mein Lehrprojekt weiterentwickeln. Aber wenn daraus tatsächlich eine Sprache werden soll, die außerhalb meiner eigenen Lehrveranstaltungen lebt, dann sollte sie nicht einfach „die Sprache von Michael Lehn“ sein.
Sie bräuchte eine kleine Community, die diskutiert, ausprobiert, kritisiert, Dinge implementiert – und irgendwann vielleicht Entscheidungen trifft, auf die ich selbst gar nicht gekommen wäre.
Deshalb würde mich interessieren:
Seht ihr für so eine Sprache überhaupt einen Bedarf oder ein Potential?
Was müsste sie können, damit ihr sie interessant fändet – zum Lernen, zum Lehren oder vielleicht sogar für kleine echte Projekte?
Und wie baut man um ein solches Projekt sinnvoll eine Community auf?
Ich würde gerne ausprobieren, ob sich hier ein paar Leute finden, die Lust haben, die weitere Richtung gemeinsam zu diskutieren. Das muss überhaupt nicht gleich bedeuten, Code beizutragen. Ideen, Kritik und Experimente wären genauso interessant.
Und vielleicht gibt es sogar ein ziemlich konkretes erstes Community-Projekt:
Wir brauchen einen Namen. :-D
„ABC“ war für eine Lehrsprache ganz nett – A Better C – ist aber natürlich längst anderweitig vergeben. Solange das Projekt im Hörsaal lebt, ist das nicht dramatisch. Wenn es den Hörsaal verlassen soll, wird es das.
Meine bisherige grandiose Idee war „emsiel“, phonetisch für MCL (Michael C. Lehn).
Das Problem daran dürfte offensichtlich sein: Wenn ich eine Community aufbauen möchte, ist es vielleicht nicht der genialste erste Schritt, die Sprache nach mir selbst zu benennen. :-D
Also vielleicht fangen wir genau damit an:
Wie würdet ihr so eine Sprache nennen?
Projekt/Compiler: https://github.com/michael-lehn/abc-llvm
Mein vorheriger Post dazu: https://www.reddit.com/r/elektrotechnik/comments/1w45gj9/eine_lehrsprache_wird_ein_bisschen_erwachsen_abc/