Die fabelhafte Welt der Mathematik: Die skurrilsten Programmiersprachen der Welt
Wenn ich jemanden nach seiner Lieblingssprache frage, erwarte ich in den seltensten Fällen eine Programmiersprache als Antwort. Da ich aber viele Informatiker in meinem Freundeskreis habe, ist mir das schon passiert. Als ich das erste Mal von der enormen Vielfalt an Programmiersprachen erfuhr, war ich ziemlich überrascht. Von Fortran, C, C++, Java oder Python haben zumindest Personen mit einer technischen Affinität sicherlich schon einmal gehört. Ich wusste auch, dass es Sprachen wie Haskell gibt, denen komplexe mathematische Konzepte zu Grunde liegen. Erstaunt haben mich so genannte esoterische Programmiersprachen, die keinem praktischen Einsatz dienen. Zu diesen gehört etwa »Whitespace«, dessen Code bloß aus Leerzeichen, Tabs und Zeilenumbrüchen besteht; oder »Ook!«, eine Sprache, die eigens für Orang-Utans konzipiert wurde.
Dass die großen Menschenaffen wohl kaum Computersoftware entwickeln werden, sollte klar sein. Doch das Beispiel zeigt, wie stark man sich beim Entwerfen einer Programmiersprache austoben kann. Es gibt ein paar Grundregeln, die man beachten muss; doch darüber hinaus sind der Fantasie keine Grenzen gesetzt. Um das zu verstehen, unternehmen wir einen kleinen Ausflug in die Vergangenheit.
Wir springen in das 19. Jahrhundert, als der Mathematiker Charles Babbage das erste Modell einer mechanischen Rechenmaschine entwarf. Indem man die Maschine richtig einstellt (programmiert), sollte sie die richtigen Ergebnisse ausspucken. Doch dafür musste man die einzelnen technischen Bauteile direkt ansteuern. Ada Lovelace verfasste auf diese Weise die ersten Algorithmen, die Babbages Maschine ausführen sollte – auch wenn das Gerät nicht gebaut wurde. Die von ihr entwickelten Algorithmen waren extrem kompliziert: Selbst für einfachste Berechnungen waren viele verschiedene Anweisungen nötig. Der Grund dafür ist, dass man die gesamte Rechnung in winzig kleine Schritte für die einzelnen Bauteile der Maschine aufteilen musste.
Tatsächlich unterscheiden sich heutige Rechner nicht allzu stark von der Funktionsweise der von Babbage geplanten Rechenmaschine. Computer enthalten zahlreiche Transistoren, die elektrische Signale in Form von Bits (Nullen oder Einsen) verarbeiten. So können etwa zwei Bit-Werte durch einen Transistor addiert werden. Mit solchen grundlegenden Operationen arbeiten auch heutige Computer. Deshalb muss jeder noch so komplizierte Algorithmus in winzige Zwischenschritte aufgeteilt werden, welche die einzelnen Bauteile der Maschine verarbeiten. Um eine Berechnung auszuführen, muss man theoretisch jedem einzelnen Transistor eines Computers sagen, was er machen soll.
Das kleine Einmaleins von Computern
Heutige Rechner enthalten mehrere Milliarden Transistoren. Sie alle einzeln anzusteuern ist völlig unmöglich. Doch das ist glücklicherweise nicht nötig; zumindest muss man das nicht mehr von Hand machen. Bei den heutigen Programmiersprachen besteht der Code aus recht einfachen Befehlen (etwa steht »print« in einigen Sprachen für einen Ausgabebefehl), die für einen Menschen nachvollziehbar sind. Ein so genannter Compiler übersetzt die Inhalte in Maschinencode. Dabei handelt es sich um Anweisungen, die dem Computer sagen, wie er welche Bauteile ansteuern soll.
Um eine funktionsfähige Programmiersprache zu entwickeln, muss man also den dazu passenden Compiler mitliefern. Darüber hinaus muss man sicherstellen, dass sich mit der Programmiersprache alle Rechenoperationen durchführen lassen, zu denen ein Computer in der Lage ist. Letztere Bedingung wird als »Turingvollständigkeit« bezeichnet und geht auf den Informatikpionier Alan Turing zurück.
Mit seinem theoretischen Konzept eines Computers setzte Turing in den 1930er Jahren den Grundstein der Informatik. Anders als Babbage hatte er keine konkrete Anwendung im Blick (etwa eine bestimmte Berechnung auszuführen), sondern er wollte herausfinden, welche Probleme aus mathematischer Sicht überhaupt durch einen Algorithmus berechenbar sind.
Dazu entwickelte er die inzwischen nach ihm benannte Turingmaschine, ein fiktives Gerät, das ein unendlich langes Band ausliest und beschreibt. Die Fähigkeiten der Maschine sind begrenzt: Sie kann das Band nach links oder rechts bewegen und so zu unterschiedlichen Symbolen springen, um sie dann auszulesen oder zu überschreiben. Auf diese Weise, so zeigte Turing, lässt sich jedes beliebige Problem bewältigen, das in endlich vielen Rechenschritten lösbar ist.
Unsere heutigen Computer fußen auf diesen Überlegungen. Damit eine Programmiersprache jeden erdenklichen Algorithmus ausführen kann, muss sie alle Funktionen einer Turingmaschine umsetzen können. In diesem Fall ist die Sprache turingvollständig.
Falls Sie also eine neue Programmiersprache erfinden möchten, müssen Sie sicherstellen, dass Ihre Sprache turingvollständig ist und einen dazugehörigen Compiler liefern. Auf diese Weise entstanden in Lauf der Zeit verschiedene Programmiersprachen, wobei jede ihre eigenen Vor- und Nachteile besitzt. So ist Python recht einfach zu nutzen, insbesondere für wissenschaftliche Zwecke, erfordert aber bei der Ausführung viele Ressourcen. Das ist hingegen bei Sprachen wie C anders, diese sind aber bei einigen Anwendungen komplizierter zu handhaben.
Brainfuck: Der Name ist Programm
Doch es gibt außerdem Programmiersprachen, die keinen praktischen Zweck erfüllen. So suchte der Informatiker Urban Müller 1993 nach einer möglichst minimalistischen Programmiersprache: Sie sollte aus einer sparsamen Syntax bestehen und einen kleinen Compiler erfordern. Und so entwickelte Müller »Brainfuck«, eine Sprache aus bloß acht Befehlen, die aus je einem einzigen Zeichen bestehen: + – < > [ ] , .
Damit ist die Funktionsweise von Brainfuck sehr nah an der einer Turingmaschine. Möchte man einen Algorithmus entwickeln, muss man diesen in sehr viele kleine Zwischenschritte aufteilen, was extrem aufwändig ist. Zudem ist der so entstehende Code kaum lesbar – daher der Name – während Sprachen wie Python zumindest verständliche Worte und Symbole verwenden (»+« steht für Addition, »if« steht für eine bedingte Anweisung), was zumindest geschulte Personen nachvollziehen können.
Möchte man einen Computer zum Beispiel dazu bewegen, »Hello World!« auszuspielen, genügt in Python der einfache Befehl »print(›Hello World!‹)«. Man muss kein studierter Informatiker sein, um diesen Code zu verstehen. In Brainfuck sieht der gleiche Befehl allerdings wesentlich komplizierter aus:
++++++++++
[
>+++++++>++++++++++>+++>+<<<<-
]
>++.
>+.
+++++++.
.
+++.
>++.
<<+++++++++++++++.
>.
+++.
------.
--------.
>+.
>.
+++.
Wirklich nutzbar ist Brainfuck also nicht. Aber Müller hat sein Ziel erreicht: Der bisher kleinste Brainfuck-Compiler ist bloß 98 Bytes groß – während die Compiler gängiger Programmiersprachen mehrere Megabytes bemessen, also millionenfach umfangreicher sind.
Ook!: Eine Sprache für Orang-Utans
An Brainfuck angelehnt ist »Ook!«, eine Programmiersprache, die für Orang-Utans entwickelt wurde. Wie der Informatiker David Morgan-Mar auf seiner Website erklärt, hat er sie nach drei Prinzipien konzipiert: Erstens sollte die Sprache für Orang-Utans lesbar und schreibbar sein; deshalb sollte zweitens die Syntax möglichst einfach und einprägsam sein – und bloß nicht das Wort »Affe« enthalten. Morgan-Mars dritte Regel: Bananen sind gut.
Ook! besteht aus den drei Begriffen Ook., Ook? und Ook!, die sich paarweise zu den acht Befehlen aus Brainfuck verbinden lassen. So entspricht beispielsweise »Ook. Ook?« dem Brainfuck-Befehl »>«. Der Compiler von Ook! Ist daher ähnlich aufgebaut wie jener von Brainfuck – und ähnlich kompliziert stellt sich der Programmcode für die Ausgabe von »Hello World!« dar:
Ook. Ook? Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook! Ook? Ook? Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook? Ook! Ook! Ook? Ook! Ook? Ook. Ook! Ook. Ook. Ook? Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook! Ook? Ook? Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook? Ook! Ook! Ook? Ook! Ook? Ook. Ook. Ook. Ook! Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook! Ook. Ook! Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook! Ook. Ook. Ook? Ook. Ook? Ook. Ook? Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook! Ook? Ook? Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook? Ook! Ook! Ook? Ook! Ook? Ook. Ook! Ook. Ook. Ook? Ook. Ook? Ook. Ook? Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook! Ook? Ook? Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook? Ook! Ook! Ook? Ook! Ook? Ook. Ook! Ook! Ook! Ook! Ook! Ook! Ook! Ook. Ook? Ook. Ook? Ook. Ook? Ook. Ook? Ook. Ook! Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook! Ook. Ook! Ook! Ook! Ook! Ook! Ook! Ook! Ook! Ook! Ook! Ook! Ook! Ook! Ook. Ook! Ook! Ook! Ook! Ook! Ook! Ook! Ook! Ook! Ook! Ook! Ook! Ook! Ook! Ook! Ook! Ook! Ook. Ook. Ook? Ook. Ook? Ook. Ook. Ook! Ook.
Whitespace: Perfekte Tarnung
Einen noch komplexeren Code präsentierten die Informatiker Edwin Brady und Chris Morris im Jahr 2002. »Whitespace« enthält wie Ook! nur drei Syntaxen:
Sie können nichts erkennen? Kein Wunder, die Symbole sind nämlich das Leerzeichen, ein Tab und ein Zeilenumbruch. Indem man auch diese paarweise zusammenfügt, lässt sich eine turingvollständige Sprache entwickeln.
Brady und Morris hoben hervor, dass Whitespace Tinte spare und sich sehr gut zur Tarnung eigne. So könnte man einen schriftlichen Text verfassen, in dessen Leerzeichen und Zeilenumbrüchen ein Whitespace-Code programmiert sei. Ob das in der Praxis wirklich genutzt wird, ist fraglich; die meisten Menschen dürften auf gewöhnliche Verschlüsselungsverfahren zurückgreifen, um sensible Codes oder Ähnliches zu schützen. Denn wie die meisten anderen esoterischen Programmiersprachen ist Whitespace alles andere als effizient nutzbar. Das »Hello World!«-Programm sieht folgendermaßen aus:
Shakespeare Programming Language: Es wird poetisch
Deutlich poetischer gestaltet sich die 2001 von Jon Åslund und Karl Wiberg entwickelte Sprache »Shakespeare Programming Language« (kurz: SPL), die sich an die Werke von William Shakespeare anlehnt. Anders als gewöhnliche Programmiersprachen besitzt SPL keine feste Syntax. Stattdessen definiert man in jedem Programm die zu verwendenden Befehle neu.
Jedes SPL-Programm muss mit einer Überschrift beginnen, die jedoch keine Relevanz für die Funktion des Algorithmus hat. Anschließend definiert man die Variablen des Programms, wie bei anderen gängigen Sprachen. Das Besondere bei SPL: Die Variablen dürfen bloß Namen von Protagonisten aus Shakespeare-Stücken haben, zudem muss man jeder Figur eine Beschreibung hinzufügen – auch wenn diese beim Ausführen des Programms keine Rolle spielt und ignoriert wird. Weitere Teile des Codes werden in Akte und Szenen unterteilt, die Handlungsanweisungen folgen ebenfalls einem shakespearehaften Stil.
Dadurch ist der Code zwar an sich lesbar – welche Anweisungen er enthält und was das Programm genau macht, ist allerdings sehr schwer nachzuvollziehen. So lautet das »Hello World!«-Programm in SPL:
Do Not Adieu, a play in two acts.
Romeo, a young man with a remarkable patience.
Juliet, a likewise young woman of remarkable grace.
Ophelia, a remarkable woman much in dispute with Hamlet.
Hamlet, the flatterer of Andersen Insulting A/S.
Act I: Hamlet's insults and flattery.
Scene I: The insulting of Romeo.
[Enter Hamlet and Romeo]
Hamlet:
You lying stupid fatherless big smelly half-witted coward!
You are as stupid as the difference between a handsome rich brave
hero and thyself! Speak your mind!
You are as brave as the sum of your fat little stuffed misused dusty
old rotten codpiece and a beautiful fair warm peaceful sunny summer's
day. You are as healthy as the difference between the sum of the
sweetest reddest rose and my father and yourself! Speak your mind!
You are as cowardly as the sum of yourself and the difference
between a big mighty proud kingdom and a horse. Speak your mind.
Speak your mind!
[Exit Romeo]
Scene II: The praising of Juliet.
[Enter Juliet]
Hamlet:
Thou art as sweet as the sum of the sum of Romeo and his horse and his
black cat! Speak thy mind!
[Exit Juliet]
Scene III: The praising of Ophelia.
[Enter Ophelia]
Hamlet:
Thou art as beautiful as the difference between Romeo and the square
of a huge green peaceful tree. Speak thy mind!
Thou art as lovely as the product of a large rural town and my amazing
bottomless embroidered purse. Speak thy mind!
Thou art as loving as the product of the bluest clearest sweetest sky
and the sum of a squirrel and a white horse. Thou art as beautiful as
the difference between Juliet and thyself. Speak thy mind!
[Exeunt Ophelia and Hamlet]
Act II: Behind Hamlet's back.
Scene I: Romeo and Juliet's conversation.
[Enter Romeo and Juliet]
Romeo:
Speak your mind. You are as worried as the sum of yourself and the
difference between my small smooth hamster and my nose. Speak your mind!
Juliet:
Speak YOUR mind! You are as bad as Hamlet! You are as small as the
difference between the square of the difference between my little pony
and your big hairy hound and the cube of your sorry little
codpiece. Speak your mind!
[Exit Romeo]
Scene II: Juliet and Ophelia's conversation.
[Enter Ophelia]
Juliet:
Thou art as good as the quotient between Romeo and the sum of a small
furry animal and a leech. Speak your mind!
Ophelia:
Thou art as disgusting as the quotient between Romeo and twice the
difference between a mistletoe and an oozing infected blister! Speak
your mind!
[Exeunt]
Die vier hier vorgestellten esoterischen Programmiersprachen sind bei Weitem nicht die einzigen. Es gibt bildbasierte Sprachen, deren Syntax aus Bildern besteht; bei »Whenever« werden die Codezeilen nicht nacheinander ausgeführt, sondern in einer beliebigen Reihenfolge; und es gibt auch eine Sprache, bei der die Befehle aussehen wie ein Kochrezept. Das zeigt: Auch in Disziplinen wie Informatik gibt es jede Menge Platz für Kreativität und Humor.
Sie haben auch ein Lieblingsthema zu Mathematik und würden gerne mehr darüber in dieser Kolumne lesen? Dann schreiben Sie es mir gerne in die Kommentare!
Schreiben Sie uns!
Beitrag schreiben