Esoterische Programmiersprachen

Vor kurzem wurden vom Autor dieses Artikels fast jeden Tag eine neue Programmiersprache veröffentlicht [2]. Ein Großteil gehört zu den esoterischen Sprachen - aber was versteht man darunter?

So manch einer hat sich bestimmt gefragt, woher diese Schwemme an neuen Programmiersprachen für den Atari herkommt. Der überwiegende Teil dieser neuen Sprachen gehört den sogenannten "esoterischen Programmiersprachen" an. Dieser Sprachbereich war auf dem Atari bisher nicht vertreten und obwohl deren Nutzen eher umstritten ist, haben sich viele z.B. Wierd heruntergeladen. Die Eso-Sprachen sind im Internet ein heißes Thema und ständig erscheinen neue Sprachen. Um diese Sprachen hat sich eine kleine Community gebildet, die entweder Sprach-Kost abseits vom C/C++/Java-Einheitsbrei brauchen oder einfach nur masochistisch veranlagt sind.

Intercal, Mutter der Eso-Sprachen

Manchmal wissen Programmierer nicht, was sie mit ihrer neuen Kreation anrichten. Nun muß man Donald R. Woods und James M. Lyon zugute halten, das es 1972 praktisch keine Denkverbote gab, wie eine Sprache auszusehen hat. Es gab allerdings auch nicht allzuviele Programmierer.
Intercal hieß ihr Werk und es fiel durch einige seltsame Eigenheiten auf. Die Zielsetzung schien darin zu bestehen, sich von an allen anderen Sprachen zu unterscheiden - kein leichtes Unterfangen, tummelten sich doch mit Algol, Basic, Cobol, Focal, Snobol u.v.a. diverse Sprachen auf dem Markt. Das einzige, was Intercal mit diesen Sprachen teilt, sind die Grundelemente (Variablen) und die Möglichkeit zur Ein-/Ausgabe. Die Sprache selber ist nicht besonders mächtig, aber dafür umso schwerer zu erlernen. Dies hat nicht seinen Grund in besonderer Maschinennähe, sondern einzig und allein in dem Bestreben, anders zu sein. Wie Intercal-Code aussehen kann, zeigt folgende Programmzeile:

	,1SUB#1#1 <- '\*(vb",1SUB#1#1"\*(ct#1'~'#0\*(ct#65535'

Um Intercal hat sich trotz der seltsamen Syntax eine kleine Fangemeinde gebildet, die es sogar geschafft hat, eine Newsgroup ins Leben zu rufen. Dieses Newsgroup ist heute aber weitgehend verwaist. Dafür hat ein Student einmal eine Arbeit über Intercal geschrieben, die vom Professor wenig wohlwollend aufgenommen wurde: "Ah, ich sehe Sie haben Humor. Zu Ihrem Nachteil habe ich keinen."
Intercal diente Ende der 90er zahlreichen Programmierern als Vorbild, auch eine "etwas andere" Sprache zu programmieren. Dank des Internets konnten diese Sprachen schnell verbreitet und bewertet werden.

Definition der Eso-Sprachen

Die Eso-Datenbank definiert eine esoterische Programmiersprache als eine Sprache, die verzweifelt versucht, möglichst unbrauchbar zu sein. Unbrauchbar soll die Sprache durch die Absicht und den Erfindungsgeist ihres Entwicklers werden - wenn eine Sprache keine Verbreitung findet, gilt sie nicht als esoterisch. Die Unbrauchbarkeit wird entweder durch ein verwirrendes Sprachdesign erreicht, oder durch Begrenzen der möglichen Befehle. Ersterer Ansatz wurde durch Intercal verkörpert, der letztere fand in Brainfck seine Vollendung. Brainfck hat insgesamt nur acht Befehle.
Eine Herausforderung für den Programmierer einer Eso-Sprache besteht darin, sie "Turing complete" zu machen. Turing hatte die Idee zur sogenannten Turing Maschine, einem sehr vereinfachten Computermodel, die dennoch in der Lage war, alle möglichen mathematischen Probleme zu berechnen. Ein Programm, das eine solche Maschine simuliert, gibt es ebenfalls für den Atari. In jedem Fall ist eine Eso-Sprache die ultimative Herausforderung für jeden Programmierer.

Vertrieb

Eso-Sprachen sind grundsätzlich nicht kommerziell und werden meistens als Sourcecode vertrieben. Die beliebtesten Sprachen dafür sind aufgrund ihrer Plattformunabhängigkeit C, Perl und Python. Für einige Sprachen existiert nur eine Dokumentation und kein Interpreter. Andere wiederum haben sich als so beliebt erwiesen, das für sie sogar ein Compiler geschrieben wurde - meistens ein Konverter nach C. Es gibt eigene Webseiten, die sich nur mit Eso-Sprachen beschäftigen. Die Macher dieser Seiten sorgen auch dafür, dass die neue Sprache bekannt gemacht wird. In der Esoteric Language Database [1] werden alle Sprachen besprochen und bewertet.

ST - esoterisch

Für den ST erschienen nun fertig kompilierte Interpreter verschiedener Sprachen: Dis, Focal, Fromage, Malbolge, Mouse, MTFI, PAL, Rube II, Thue, Turingol und Wierd.
Neben diesen wird an Portierungen von Brainf*ck, Iag, Intercal, Kvivakkul und Sally gearbeitet. Aufgrund verschiedener Probleme sind diese Sprachen noch nicht verfügbar.

Dis

Dis ist eng verwandt mit Malbolge und stammt vom gleichen Autor. Das Problem war, das Malbolge ihm etwas zu esoterisch geraten ist und derart schwer war, dass er kein einziges Programm schreiben konnte. Malbolge war geschrieben worden, um die Hölle auf Erden für Programmierer zu sein und nach einer genaueren Untersuchung kam der Malbolge-Autor zu dem Entschluss, seine Sprache zu "splitten". Die Light-Version von Malbolge sollte etwas menschlicher sein, für die Namengebung nahm er "The Divine Comedy" zu Hilfe und benannte diese Sprache nach der Hauptstadt der Hölle, Dis. Außer das beide Sprachen höllisch schwer zu programmieren und auch so benannt sind, haben sie aber nichts mit dem Teufel zu tun.
Die Umgebung von Dis ist eine CPU mit drei Registern A, C und D. A steht für Akkumulator und dient zur Manipulation von Daten und erledigt auch die Standard-Ausgabe. C ist der Code-Zeiger und wird automatisch nach jeder ausgeführten Anweisung erhöht. D ist der Daten-Zeiger, wird auch automatisch erhöht und die Zeigeradresse wird für Datenmanipulationen verwendet. Ein Dis-Programm besteht aus den Anweisungen !{}|^>_* . Leerzeichen werden ignoriert und jedes andere Zeichen erzeugt einen Fehler. Diese sieben Befehle bewirken grob erklärt folgendes:

* setzen des Daten-Zeigers
^ setzen des Code-Zeigers
> Rotation der Werte
| Der Wert von D wird mit dem von A verknüpft
} lesen eines ASCII-Wertes von der Standardeingabe
{ Die Umkehrfunktion von }
! virtuelle Maschine pausieren
_ "tue nichts"

Schon beim Anblick dieser Befehle läßt sich erahnen, das ein Dis-Programm abstrakt aussieht:

	*>>*|{{{!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!{**

Das ist das "666"-Programm. Die Hauptschwierigkeit von Dis liegt in den Befehlen, denn eigentlich ist die Sprache sehr einfach und subtrahiert und addiert mit Werten, um das gewünschte Ergebnis zu erhalten.

Focal

Focal ist eigentlich keine esoterische Programmiersprache. Sie soll hier aber mit aufgenommen werden, weil sie schon ziemlich alt und vergessen ist und somit in gewisser Hinsicht exotisch.
Focal wurde 1981 für die damals sehr beliebten PDP-8-Computer geschrieben. Der PDP-8 ist in der Emulatorenszene nur für ein Spiel bekannt: "Space War!". Dieses Spiel gibt es auch für den ST und stellt zwei Raumschiffe dar, die sich beschießen und dabei gegen die Gravitation der Sonne ankämpfen. Mehr für die ernsthafte Nutzung des PDP-8 wurde Focal entwickelt, das dann auf die Systeme Unix, VMS und VAX (mit der bekanntlich der ST designed wurde) umgesetzt worden ist. Focal ST hat einen eingebauten Kommandointerpreter und startet Programme mit folgender Zeile:

	lib call queens.foc
	g

Das Beispiel startet das Programm "queens.foc".

Focal kennt folgende Kommandos:
ask: Eingabe eines numerischen Wertes
comment: Kommentar
do: Aufruf einer Unterroutine
erase: löschen des Variablenspeichers oder des Programms selber
for: Schleife
goto: Zu einer bestimmten Zeile springen
if: Bedingung
library: wird für den Datenträgerzugriff benutzt
quit: Beenden des Programms oder des Interpreters
return: Rückkehr aus einer Unterroutine
set: Variable setzen
type: Ausgabe
write: listet das Programm

Daneben gibt es noch diverse mathematische Operatoren. Bei der Kommandoliste kann man sich natürlich fragen, warum die Macher nicht gleich auf Basic zurückgegriffen haben, denn das gab es schließlich auch für den PDP-8. Die Antwort liegt wie immer da draußen und im Mysterium der Zeit begraben, aber zumindest läuft ein ST-Focal-Programm garantiert auch auf dem PDP-8 und der VAX. Alle Kommandos lassen sich auch abkürzen, womit ein Focal-Programm dann Ähnlichkeiten mit Pilot hat. Beispiel:

	10.70 t "Hallo Welt", !

Im Focal-Archiv sind zwei umfangreiche Beispielprogramme, u.a. auch eines, das für das "Acht-Damen-Problem" im Schach Lösungen erstellt.

Fromage

Diese Sprache klingt vom Namen her sehr nach Käse, ist aber angeblich nur eine Abkürzung für "FReakish Outright Mad languAGE". Der Interpreter dürfte einer der kleinsten überhaupt sein, ist 1 KB groß und in "Obfuscated C" geschrieben. Das ist nicht etwa eine neue Sprache, sondern einfach ein Programmierstil, der dafür sorgt, das garantiert niemand den Quellcode versteht. Es gibt sogar einen "Obfuscated C"-Wettbewerb.
Zehn Operatoren gibt es in Fromage, die zur Bitmanipulation, Sprung und Bedingung herangezogen werden. Durch Verschachtelungen kann ein Fromage-Listing sehr chaotisch aussehen. Das berühmte Hallo-Welt-Beispiel sieht in Fromage aber sehr sauber aus:

	>:>>>:>>>>:<<<<<<H
	:>>:>:>>:>:<<<<e
	:>>>:>::<<ll
	:>:>:<<<<<<<o
	:>>>:>:>:>:>:<<<<<<<blank
	:>>:>>:>:>:>:<<<<<w
	:>:>>>>:<<<<<o
	:>:>:>>:>:<<<<<r
	:>:>:>:>>:<<<<l
	:>>>>:<<<<<<<d
	:>:>>:>:>:>>:return

Malbolge

Malbolge ist die Muttersprache von Dis und benannt nach Dante's achtem Kreis der Hölle. Der Autor von Malbolge hat die zwei beliebtesten Eso-Sprachen untersucht: Intercal war ihm zu flexibel und Brainf*ck zu intuitiv. Seine Programmiersprache sollte aber die reinste Gehirnfolter werden. Malbolge bedient sich bei beiden Sprachen und führt ihre Stärken, immer im Sinne der Eso-Tauglichkeit, zusammen. Schon die Beschreibung liest sich grausam. Wie Dis verwendet auch Malbolge drei Register.
Wenn der Interpreter versucht ein Programm auszuführen, überprüft er, ob es sich bei der aktuellen Anweisung um einen ASCII-Charakter mit dem Wert zwischen 33 und 126 handelt. Wenn dem so ist, so wird 33 abgezogen, der Wert vom Code-Register addiert und dann durch 94 geteilt. Der Rest dient als Index für die folgende Liste auf 94 Zeichen:

	+b(29e*j1VMEKLyC})8&m#~W>qxdRp0wkrUo[D7,XTcA"lI
	.v%{gJh4G\-=O@5`_3i<?Z';FNQuY]szf$!BS/|t:Pn6^Ha

Es gibt noch eine zweite Liste, die ebenfalls notwendig ist, aber hier nicht aufgeführt werden soll.
Andrew Cooke ist es im Gegensatz zum Autor der Sprache gelungen, ein Malbolge-Programm zu schreiben. Das folgende Programm sollte auf nüchternen Magen genossen werden:

	(=<`$9]7<5YXz7wT.3,+O/o'K%$H"'~D|#z@b=`{^Lx8%$Xmrkpohm-kNi;gsedcba`_^]\
	[ZYXWVUTSRQPONMLKJIHGFEDCBA@?>=<;:9876543s+O<oLm

Sein abschließender Kommentar: "Ich hasse diese Sprache! Aber dafür wurde sie ja erfunden.".

Mouse

Der Name alleine ist schon alleine für diverse Scherze gut, schließlich heißt es denn "Ich programmiere in Mouse". Das Mouse die Maus nicht unterstützt, sei nur nebenbei erwähnt. Mouse wurde 1979 im amerikanischen BYTE-Magazin vorgestellt. Gerade nach einer Runde Malbolge ist Mouse die reinste Erholung. 21 Kommandos umfaßt die Sprache, davon wird ein Großteil zur Stackmanipulation eingesetzt. Der Stack ersetzt die aus anderen Sprachen bekannten Variablen und sorgt auch bei den meisten anderen Sprachen dafür, das die Sprache "Turing complete" bleibt. Im Gegensatz zu Basic oder C, wo mehrere Variablen definiert werden können, gibt es aber nur einen Stack. Ist ein Wert auf dem Stack abgelegt, kann er mit den vier Grundrechenarten behandelt werden. Bedingungen und Schleifen greifen ebenfalls auf den Stack zu. Das "Hallo Welt"-Beispiel ist in Mouse sehr einfach:

	"HELLO, WORLD.!"
	$$$$

Die vier Dollar-Zeichen signalisieren das Programmende. Anführungszeichen bewirken, das der in ihnen eingeschlossene Text ausgegeben wird.
Mit dem Fragezeichen können Zahlen eingelesen werden.
Ob Mouse nun esoterisch ist oder nicht, ist umstritten.

MTFI

MTFI ist nicht etwa eine eigenständige Sprache, sondern ein Interpreter für eine ganze Sprachfamilie. Die Buchstaben stehen für "Magus Technica Funge Interpreter". Das Programm führt Programme aus, die in den Sprachen Befunge-93, Befunge-96 und in allen Funge-97-Varianten geschrieben wurde. Per Voreinstellung arbeitet der Interpreter im Befunge-93-Modus, über die Kommandozeile kann ein anderer Modus erzwungen werden.
Befunge wurde 1993 entworfen und sollte Originell, Unterhaltend und schwer zu Kompilieren sein. Zumindest letzteres Ziel wurde verfehlt. Der Unterschied zu den meisten anderen Sprachen liegt in der Art, wie Befunge Programme abarbeitet. In normalen Sprachen wird das Programm Zeile für Zeile bearbeitet, sofern nicht ein Sprung zu einer anderen Programmstelle erfolgt. Befunge legt das Programm in einem zweidimensionalen Netz ab und kann das Programm von links nach rechts, unten, oben... interpretieren. Dazu ist die Sprach selbstmodifizierend.
Befunge führte eine etwas andere visuelle Sprache ein, das in der letzten Ausgabe vorgestellte Wierd stammt z.B. von Befunge ab. Das "Hallo Welt"-Programm sieht so aus:

	                 v
	>v"Hello world!"0<
	,:
	^_25*,@

PAL

Weder eine eigenständige Sprache, noch esoterisch, so ist PAL doch relativ nutzlos. PAL ist ein Cross-Assembler für den PDP-8, d.h. man schreibt Assembler-Programme im Text-Editor auf dem ST, schickt sie dann nur PAL und erhält als Resultat eine Programmdatei, die der PDP-8 versteht. Der PDP-8 wurde von DEC immerhin 30 Jahre in verschiedenen Varianten gefertigt und war ziemlich erfolgreich. Auch wenn der PDP-8 eine menge fröhlich blinkender LEDs hatte, konnte man mit ihm arbeiten. Eines der Beispielprogramme gibt das Disk-Directory aus (damals war das Diskettenformat noch 8 Zoll). Leider sind Assembler-Programme sehr lang, deshalb entfällt an dieser Stelle das "Hallo Welt".

Rube II - Das Klickenklacker

Diese Sprache stammt nicht aus Deutschland. Rube II ist der Nachfolger von Rube. War Befunge eine sehr grafische Sprache, so ist Rube II eine physikalische. In Rube II verhält sich eine Gruppe von Objekten nach vordefinierten Gesetzen der (Programm-)Physik. Eine Rube-Programm läuft ewig in Zeiteinheiten, die "Frames" genannt werden. Jeder Programmschritt bedeutet einen neuen Frame, der aus dem vorherigen konstruiert wird. Die benötigten Bewegungen werden durchgeführt und Kollision festgestellt. Objekte erhalten eine Wertigkeit, was wiederum ihr Kollisionsverhalten beeinflusst.
Stationäre Objekte haben die höchste Wertigkeit und verbleiben an ihrem Platz.
Motiv-Objekte können andere bewegbare Objekte in eine bestimmte Richtung verschieben.
Bewegbare Objekte sind Daten, die herumgeschoben werden.
Auf alle nicht-stationären Objekte wirkt die Gravitation, die sie ein Feld nach unten zieht pro Frame.
Läuft ein Rube-Programm auf dem Bildschirm, so sieht es tatsächlich nach einem Daumenkino aus. Um aber alle Ausgaben zu sehen, muß rube2.ttp schon in einem Fenster laufen.
"Hallo Welt" sieht in Rube so aus:

	(000a2d61747c625f27206c6f6c6c5084
	=================================W=
	 I                                C  F
	 F                               = >

Thue

Thue basiert auf einem Konzept des norwegischen Mathematikers Axel Thue. Die Sprache selber definiert mehr ein Grammatik-System für andere Sprachen, ähnlich wie yacc oder lex. Ein Thue-Programm besteht aus zwei Teilen: der erste Teil definiert die Grammatik/Produktions-Regeln. Dieses Regeln sind sehr einfach und eigentlich nur eine Anleitung zum Suchen/Ersetzen. Damit der Benutzer überhaupt irgendwie eingreifen kann, kennt Thue ein Eingabe- und ein Ausgabe-Symbol. Thue übersetzt das Programm so lange, bis es keine Regeln mehr anwenden kann.
Das beliebte Beispielprogramm sieht so aus:

	__::=~Hello, World!
	
	 ::= 
	
	__

Turingol

Ein Turingol-Programm definiert Programme für eine Turing-Maschine. Turingol ist eine Lehrsprache und wurde auch als solche - ganz ernsthaft - verwendet. Den Ernst der Sprache unterstreicht die Dokumentation, die gleich in drei Formaten beiliegt (DVI, PS, TEX).

Fazit

Der Atari hat sprachenmäßig wieder zugelegt. Diese Sprachen völlig in die Scherz-Ecke abzuschieben, tut ihnen Unrecht, denn einige dieser Sprachen zeigen interessante Konzepte auf, die "normale" Sprachen nie wagen würden.

Links:
[1] purists.org/esoteric/
[2] http://www.mypenguin.de/prg/
[3] catseye.mb.ca/esoteric/


Mia Jaap
Aus: ST-Computer 11 / 2001, Seite 34

Links

Copyright-Bestimmungen: siehe Über diese Seite