Textantrieb

Manuskript

Software

Programmiersprachen und Text

Die Programmiersprachen sind gegenwärtig kleine, statische, mitten im Ozean der Inkompatibilität verstreuten Inseln. Lass uns einen großen, reichen, dynamischen Kontinent der Interoperabilität bauen, indem wir ihre Grundlage, den Text, erschließen!

Heute wird jede Programmiersprache, jedes Auszeichnungsformat, als eine von den anderen abgegrenzten Einheit implementiert. Jede Programmiersprache hat den eigenen Kompiler und die eigene Laufzeitunterstützung. Der Quellcode eines jeden Entwicklungsprojektes ist in unüberbrückbaren Parzellen zerlegt. Jedes Stück Quellcode muss in genau einer Notation vorliegen und bedarf spezieller Werkzeuge für seine Verarbeitung. Jedes Quellcode verarbeitende Programm führt eine Syntaxanalyse durch und entweder übersetzt den erzielten syntaktischen Baum, um beispielsweise Objekt- oder ausführbare Dateien zu erstellen, oder aber interpretiert ihn, das heißt es führt durch ihn gesteuert einige Operationen durch. Der syntaktische Baum ist intransparent, lokal, unbeständig und zweckgebunden.

Es gibt bereits einige verbesserte Herangehensweisen. So ist beispielsweise in LISP der syntaktische Baum explizit und durch Code erreichbar. Auch in der GNU-Kompilerfamilie GCC spielt der syntaktische Baum eine Schlüsselrolle als Vermittler zwischen den jeweils eine Sprache parsenden Frontends und den jeweils für eine Architektur ausführbaren Code generierenden Backends. Diese Lösungen stellen jeweils schon einen richtigen Ansatz dar. Doch packen wir es an der Wurzel! Nennen wir den syntaktischen Baum den Text und bringen wir ihn ans Licht.

Denken wir uns ein Programmiersystem, das auf einer Textengine basiert, die der hiesigen ähnelt. Der syntaktische Baum kann in den Textspeicher abgelegt werden. Damit erzielen die verschiedenen Funktionen wie Parsen, Übersetzen und Interpretieren völlige Unabhängigkeit voneinander. Nicht nur das. Die sprachlichen Mittel selbst verlassen das Gehege und lassen sich miteinander frei kombinieren. So bleibt beispielsweise eine Makro-Sprache, über die man verfügt, nicht auf die Zielsprache begrenzt, für die sie implementiert wurde, sondern lässt sich auf Anhieb auf alle anderen Sprachen anwenden, indem man sie in einem zusätzlichen anfänglichen Buildschritt einsetzt. Außerdem ist die Semantik auf dieser Weise durch Code zugänglich, man kann sie abfragen, übersetzen und ergänzen, und zwar mit den herkömmlichen Mitteln der Textengine. Das heißt, man ist nicht mehr auf eine bestimmte Sprache beschränkt, wenn es um eine bestimmte Semantik geht.

Ein solcher Ansatz ist nicht nur praktisch nützlich, sondern auch theoretisch belehrend. Denn die effektive Trennung von Darstellung und Semantik zeigt, dass im heutigen Sprachbegriff Konfusion herrscht. Eine Sprache unterstützt eine bestimmte Semantik, diese gehört aber nicht zur Sprache, denn sie lässt sich auch durch andere Mittel ausdrücken. Die Sprache ist die Schnittstelle zur Semantik und die Notation (Sprachdarstellung) wiederum die Schnittstelle zur Sprache. Das bedeutet auch, dass die Sprache als ein technologisches Produkt angesehen werden kann. Sprachkritik ist nicht nur ein kulturelles Feld von Interesse in den natürlichen Sprachen, sondern auch eine ingenieursmäßige Angelegenheit, die Programmiersprachen betrifft.