Die vergessene Programmiersprache

Schon früher in diesem Blog habe ich mich als Ada-Anhänger geoutet. Ich habe in Ada eine komplette CD-/DVD-/BluRay-Brenner-Software geschrieben, weiß also so ungefähr von was ich rede. Die weitaus meisten Zeilen Code habe ich allerdings in anderen Programmiersprachen, vornehmlich in Java, verbrochen.

Schon als ich damals 1996 nach vielen Jahren Ada meine ersten Gehversuche mit Java (Version 1.0.2, die Programmier-Opas erinnern sich) machte, rieb ich mir verwundert die Augen. Wie kann man Mitte der 90er, mit so vielen Vorarbeiten wie Algol und Smalltalk und Pascal und Modula und Ada eine derart rudimentäre, vor allem bei den Basisdatentypen so schwach aufgestellte Sprache wie Java auf den Markt werfen? Es wirkte wie eine minimale OO-Erweiterung wie es sich C-Fans ausmalen würden. Keine Generics, keine Enums, keine funktionalen Elemente, kein vernünftiges Scoping (Methode-in-Methode), kein Operator Overloading, keine „unsigned“-Typen, ein sehr schwaches Konzept der Nebenläufigkeit…vom Sprachstandpunkt aus wirkte es wie ein Zurück-in-die-70er. C, eine Prise Objektorientierung, der Rest des Gehirnschmalzes steckte dann in der Standardbibliothek und der virtuellen Maschine nebst der Applet-Idee.

Seither ist viel Zeit vergangen. Jede Menge Programmiersprachen kamen und die meisten gingen auch wieder. Im Bereich systemnahe Programmierung scheint derzeit Rust immer noch der Hype der Stunde zu sein. Und jeder Ada-Kenner fragt sich: was soll denn an Rust eigentlich so besonders sein? Wäre da Ada nicht von Anfang an und seit 1980 die bessere Wahl gewesen? Um Salz in die Ada-Wunde zu streuen, arbeiten sich die Rust-Evangelisten ja auch immer an C als Benchmark ab, anstatt mal über den Tellerrand zu schauen.

Eine Frage kann ich jedenfalls beantworten: warum Ada keine weitere Verbreitung geschafft hat. Das liegt schlicht am (fehlenden) Ökosystem. Vor GNAT gab es keinen bezahlbaren, qualitativ hochwertigen Compiler. Und seit GNAT gibt es leider immer noch keine problemlos und überall einsetzbare Toolchain. Die von AdaCore gepflegten Pakete haben schon auf der Windows-Plattform ihre Stabilitätsproblemchen wenn man auf die „Libre“-Schiene setzt. Andere CPUs als x86/x64 werden sowieso nur sparsam unterstützt. Jahrelang musste man, wenn man für ARM compilieren wollte, ganz bestimmte FSF-GCC-Versionen einsetzen und extreme Vorsicht walten lassen – meist kam man nicht umhin, GNAT selbst zu bootstrappen. Dazu das IDE-Problem: egal ob Plugins für die großen IDEs wie Eclipse, VisualStudio oder NetBeans, oder Standalone-Pakete wie GPS: die Qualität war bestenfalls durchwachsen, teilweise katastrophal schlecht oder in den Anfängen stecken geblieben (Projekt Hibachi). Und manchmal auch nur ein klassisches „one-off“ wie GNATbench im Libre-Bereich. Geholfen hat sicher auch nicht AdaCore’s Taktik, die Libre-Toolchain GPL-only zu machen. So mussten interessierte Entwickler, die nicht an die GPL gebunden sein wollten, auf die FSF-GCC-Variante ausweichen, mit den ganzen zusätzlichen Reibungsverlusten. Oder die one-offs wie „GNAT for JVM“ oder „GNAT for .NET“ – sowas sorgt einfach nicht für das Gefühl von Stabilität und Verlässlichkeit, eigentlich Stärken von Ada.

Dadurch ergab sich auch eine große Distanz zwischen Hobby-Programmierern und der Profi-Welt: Ada ist ja sehr verbreitet in gewissen Industriebereichen, vor allem Militär und Luftfahrt. Dort dominieren die extrem teuren Ada-Toolchains und IDEs mit ihren zig Zertifizierungen und Gedöns, die Bemühungen z.B. von Aonix mit ObjectAda im Zeitalter von Windows 95 und NT waren auch eher kurzlebiger Natur. Und so leben die Profis in ihrer Welt, und die Hobby-Programmierer verwenden weit überwiegend lieber eine leichter zugängliche Programmiersprache.

Nimmt man dann noch die Problematik „Drittbibliotheken“ dazu, die in der Ada-Welt eher sparsam vorhanden waren, hat man eben einfach kein konkurrenzfähiges Ökosystem, sondern Gefrickel. Untauglich für Neueinsteiger, mühsam für interessierte Hobbyisten, frustrierend selbst für Profis. Immerhin gibt es inzwischen Bemühungen, einen Ada-spezifischen Paket- und Library-Manager zu entwickeln mit dem schönen Namen Alire. Noch Beta. Too little, too late. Auch die Bemühungen um Ada-Unterstützung in Visual Studio Code unterzubringen sind respektabel, stecken aber noch in den Kinderschuhen und sind mit dem Stand anderer Sprachunterstützung wie beispielsweise für Python noch lange nicht vergleichbar.

Will man heute eine Programmiersprache in den breiten Einsatz bringen, reicht eben ein Compiler und ein bisserl Toolchain drumrum bei weitem nicht aus. Man braucht über viele Systeme verfügbare, stabile Toolchains. Man braucht IDEs. Man braucht Bibliotheken. Beispielanwendungen. Dokumentation. Tutorials. Viele Seiten, die sich mit Ada beschäftigen, scheinen direkt dem Internet der 90er entsprungen zu sein (hier z.B. eine ZIP-Bibliothek). Damit kann man bei den Entwicklern von heute einfach nicht mehr in der Breite landen und bleibt im Exotendasein stecken.

Es ist unendlich schade um das Potenzial, das in Ada steckt. Aber meine Prognose lautet: das wird nix mehr. Ada wird zurecht vergessen bleiben.

Die guten Erinnerungen an Ada

Meine Programmierlaufbahn begann mit einem Schneider CPC 464 und dem eingebauten Locomotive BASIC 1.0. Ich hangelte mich am (durchaus ansprechenden) Handbuch entlang durch die Untiefen der Sprache. In ganz jungen Jahren und Mitte der 80er fand man das irgendwie alles cool und hat wenig hinterfragt, aber die Tatsache, dass man Zeilennummern verwenden musste und es als einziges Strukturierungsmittel GOTO und GOSUB gab, fand ich damals schon nicht gut. Auch wenn ich noch nicht ahnte, wieviel besser man es machen kann.

Mit den Zwischenstationen Logo, Z80-Assembler, Turbo Pascal, BBC BASIC, ARM-Assembler, C, Modula-2, HP-PA-RISC-Assembler und LISP lernte ich dann Ada kennen. Damals noch in der Variante Ada 83, also erst mal objektbasiert und nicht objektorientiert. Es war wie eine Erleuchtung. Endlich eine Sprache, die einfach alles konnte. Und in schöner Syntax verpackt. Die nicht nur auf ein paar guten Ideen basierte, wo man dann so eine Restsprache drumrum gestrickt hat. Wo schon bei liebevollen Details im Typsystem klar wird: da haben schlaue Köpfe lange gehirnt. Dazu das wunderbare „Language Reference Manual“, wo eben die definitiven Antworten drin stehen. Und das „Rationale“, wo man nachlesen konnte, warum was wie umgesetzt wurde. Und Ada 95 verstärkte diesen großartigen Eindruck noch.

Nun bin ich gestern auf einen Artikel namens „A Random Walk Through Ada“ von David Given gestoßen, der mich wieder an viel erinnert hat, was ich an Ada so alles großartig fand und finde. Leider habe ich die Weiterentwicklungen Ada 2005 und Ada 2012 nicht mehr im Detail verfolgt, weil sich die IT-Industrie ja entschieden hatte, irgendwelche anderen Sprachen zu favorisieren.

Der Artikel ist absolut lesenswert und erklärt schön, was an Ada so liebenswert ist. Eine Warnung allerdings: man wird sich dann zukünftig bei der Beschäftigung mit den diversen neuen Sprachen, die jedes Jahr aufpoppen, immer fragen, warum deren Erfinder die vielen guten Ideen der Vergangenheit schlicht ignorieren. Das scheint mir generell so eine Art Krankheit der IT zu sein: das ständige Bedürfnis, das Rad neu zu erfinden. Ohne dabei ein besseres Rad zu erschaffen, sondern nur ein anderes.

Nur eine minimale Unschärfe des Artikels will ich kritisieren: zwar ist die Container-Bibliothek, die es seit Ada 2005 in den Standard geschafft hat (und die es unter dem schönen Namen „Charles“ auch für Ada 95 gibt), nach der STL von C++ modelliert worden, aber der Autor von Charles, Matthew Heaney, ist keineswegs auch der Autor der C++-STL – die haben wir vielmehr den Herren Stepanov und Lee zu verdanken. Stepanov selbst begann seine Experimente mit generischen Containerbibliotheken allerdings mit Ada (damals noch Ada 83), vielleicht daher die Verwechslung.

GNAT GPL 2016 verfügbar

Vor einigen Tagen hat AdaCore die Verfügbarkeit von GNAT GPL 2016 angekündigt. Die 2016er Variante steht in den Geschmacksrichtungen Linux-x86-64bit, Windows-x86-32bit, Mac OS X-x86-64bit, RPi2-32bit (Linux-hosted, und zwar x86-64-Linux) und ARM ELF (Windows- oder Linux-hosted) zum Download bereit.

GNAT kann natürlich Ada 2012 compilieren, aber auch die älteren Standards Ada 2005 und Ada 95 werden weiterhin verstanden. Neue Versionen von GtkAda, Win32Ada und GPS, der GNAT-IDE, runden die Sache ab. Basis ist GCC 4.9. Merkwürdig: die GNAT GPL-Seite erzählt immer noch Geschichten von der Vorversion.

Die älteren Versionen stehen weiterhin auch zum Download bereit. Besonders schade finde ich, dass das JVM-Target offenbar ins Hintertreffen geraten ist, die letzte Version die das Compilieren von JVM-tauglichen Class-Dateien aus Ada-Sourcen unterstützt hat, war GNAT GPL 2013. Ich hatte ein schönes Beispiel am Start, um eine Swing-GUI in Ada an den Start zu bringen, darüber wollte ich immer mal bloggen…aber mit so einer alten GNAT-Version macht das ja keinen Spaß.

Mein Ada-Wiedergänger

Es war einmal ein Informatik-Student der Uni Stuttgart im vierten Semester. Bis dato wurde er programmiertechnisch mit Modula-2, Prolog und Lisp traktiert. Dann: Das Software-Praktikum in der Abteilung „Software Engineering“ mit dem Thema „Durchführung eines Softwareprojekts: Entwicklung eines Fahrplanauskunftssystem“ stand an. Die Implementierung erfolgte in Ada 83 unter DEC Ultrix (schon damals eher exotisch), zuvor habe ich deshalb den Ada-Kompaktkurs bei Jürgen Schwille (inzwischen hat es der zum Prof.Dr. gebracht und unterrichtet an der DHBW Stuttgart) genießen dürfen.

Gemessen an den damals verfügbaren Alternativen (C, BASIC, Pascal, Modula-2 und vielleicht noch Objective-C, wenn man sich zufällig einen NeXT leisten konnte) war Ada eine Offenbarung. Die Multithreading-Abstraktion in Form des „Taskings“, die „Derived Types“, die Abstraktionsmöglichkeiten über Packages und Generics – obwohl oft als „Designed By Committee“ verschrien, fand ich Ada damals gemessen an der Leistungsfähigkeit bemerkenswert elegant.

Anno 1995 kam dann mit Ada 95 ein großes Sprachupdate. Hierarchische Packages, Objektorientierung via „Tagged Types“, eine stark erweiterte Standardbibliothek – das nächste Uni-Projekt, das Fachpraktikum mit Thema „Entwicklung eines Terminkalenders unter Gesichtspunkten des Software Engineerings“ in der interessanten Kombination Backend in Ada – Frontend in Tcl/Tk, machte mich zum Ada-Fan.

Endlich war mit GNAT auch ein freier Ada-Compiler verfügbar, der sogar auf RISC OS portiert wurde. Das gab mir die Gelegenheit, mal schnell eine CD-Brenner-Software namens CDBurn in Ada zu entwickeln. Um Mitstreiter in Sachen Ada unter RISC OS zu finden, habe ich 1999 einen Artikel namens „Die Programmiersprache Ada“ für die GAG-News geschrieben – ein wenig Ada-Historie, kurze Codebeispiele, was für den Einsatz unter RISC OS spricht, Literaturempfehlungen.

Der Artikel ist m.E. nicht besonders gut gelungen. Oberflächlich, sehr bemühte Beispiele, setzt gewisse Programmierkenntnisse voraus ohne diese genau zu spezifizieren…aber mangelhafte Qualität hat ja noch nie Verbreitung behindert. Die TU München hat anno 2005 meinen Text für ein Ada-Proseminar als Mini-Einführung verwendet – keine Ahnung, wie die drauf gekommen sind. Und heute sehe ich bei einer statistischen Auswertung der Referrer-URLs auf meine Domains, dass auch die Uni Stuttgart, genauer das Institut für Automatisierungs- und Softwaretechnik, in Unterlagen für das Fachpraktikum Automatisierungstechnik meinen Artikel als Literaturreferenz aufführt.

Jetzt mal ehrlich: wenn mein höchst mittelmäßiger Artikel ein zitierwürdiges Werk im deutschsprachigen Ada-Universum ist, steht es sehr sehr schlecht um diese Programmiersprache. Und das wäre ein Jammer, denn besonders die letzten beiden Sprachupdates Ada 2005 und Ada 2012 haben eine Menge getan, um die Sprache modern zu halten, ohne die ursprünglichen Stärken zu verlieren.

Also: flugs mal bei AdaCore vorbeischauen, GNAT GPL 2014 Edition runterladen , und loslegen – meine Empfehlung ist, eher das Eclipse-Plugin GNATbench zu verwenden, anstatt es mit GPS zu versuchen. Dann ein Tutorial – Vielleicht nicht unbedingt mit meinem Artikel, sondern lieber „Ada Distilled“ von Richard Riehle, das Lovelace Tutorial von David Wheeler  (echt oldschool), das Wikibook zur Ada-Programmierung, den Ada Crash-Course oder, falls man einen Background in C oder C++ hat, mit diesem PDF anfangen.

Besonders mutige Naturen laden die GNAT-Variante für die JVM herunter (gibt es leider nur in der GNAT GPL 2013-Variante) – damit kann man Ada-Quellcode in Bytecode compilieren und auf der JVM ausführen. Erste Aufgabe: schreibe ein Ada-Programm, das mit Swing-Mitteln einen JFrame öffnet. Der erste Einsender einer richtigen Lösung erhält einen Sonderbonus.