Donnerstag, 22. November 2007

Esoterisches

Bin neulich im Institut mal kurzzeitig zum c't-Lesen gekommen und stieß auf den Artikel "Hexenwerk" im Heft 22/2007. Dieser wirklich ausgesprochen spannende und lustige Artikel stellt einige esoterische Programmiersprachen vor.

Eso. PS sind Programmiersprachen, die nicht für den praktischen Einsatz entwickelt wurden, sondern ungewöhnliche Sprachkonzepte umsetzen. Eine einfache Bedienung ist selten, teilweise werden Sprachen konzipiert, um möglichst komplizierte Algorithmen oder unverständliche Syntax zu haben, oft aber auch um neue Ideen auszuprobieren, oder um ungewöhnliche Möglichkeiten wie extreme Vereinfachung aufzuzeigen.

Solche Dinger haben uns den heutigen Programmiertag sehr aufgelockert.

Es wurden Sprachen vorgestellt, die sich teilweise sosehr meinem Verständnis entziehen, dass es einfach nur noch lustig ist. Hier ein kleiner Abriss derer:

Eines der einfacheren Sachen war sicherlich Brainfuck. Mit einem Befehlssatz von nur 8 Zeichen schon relativ kryptisch, aber ich denke, wenn man das Schema begriffen hat, ist es leicht, wenigstens einfachste Routinen, wie eine Addition zu schreiben:
+++>+++++<[->+<] //Ausgabe: 3+5

Etwas schwieriger gestaltet sich da schon das Hantieren mit
FALSE, einer Sprache, die von einem Niederländer kommt. Der Name ist eine Hommage an dessen Lieblings-Boolean-Wert... (haben wir nicht alle einen Lieblings-Boolean-Wert? *lol*). Diese Sprache ist vollkommen Stack-basiert. Doch wenn man die Denkweise einmal begriffen hat, kann man auch hier (ich betone EINFACHSTE) Sachen lesen. Auch hier ein Beispiel (Ausgabe aller Primzahlen bis 100):
99 9[1-$][\$@$@$@$@\/*=[1-$$[%\1-$@]?0=[\$.' ,\]?]?]#
Alles klar? *gg*

So richtig lustig zu lesen ist hingegen Befunge. Der Code wird zweidimensional geschrieben und gespeichert. Die jeweilige Leserichtung wird von den Zeichen <, >, ^, v gesteuert. Garantiert verwirrendes Beispiel - ein Befunge-Interpreter in Befunge geschrieben (besser als Bild darstellbar):
*räusper*

Spannend fand ich auch folgenden Code (auch hier ist ein Screenshot von der offiziellen Seite besser):
Whitespace. Eine Sprache, die nur mit Leerzeichen, Tabulatoren und Zeilenumbrüchen arbeitet. Besonders lustig dann, wenn man sich den Code einer herkömmlichen Programmiersprache nimmt und die beliebig setzbaren Zwischenräume kodiert (wie die c't-Leute es taten). Klasse, ein Programm von 2 unterschiedlichen Compilern akzeptiert. Also schaut euch euren nächsten C-Code mal etwas genauer an ;)

Doch es wird noch skurriler: Zum Bleistift mit INTERCAL.
INTERCAL wurde mit dem Ziel entwickelt, das Programmieren schwierig zu gestalten und die entstehenden Programme effektiv unlesbar zu machen.
Interessant an der Sprache ist zwar die ausgesprochene Unlesbarkeit durch unäre OR-Anweisungen (!!!) oder COME FROM-Anweisungen (einem umgekehrten GoTo-Befehl), aber besonders gelungen ist der Compiler-Humor. Hin und wieder muss man vor seine Befehle ein PLEASE setzen, sonst meckert der Compiler und bricht ab:
ICL774I RANDOM COMPILER BUG
ON MY WAY HOME
TAKE YOUR TIME AND RESUBMIT
Doch wehe, man ist zu höflich. Auch das stört den Compiler:
ICL099I PROGRAMMER IS OVERLY POLITE
ON THE WAY TO SOMEWHERE ELSE
CORRECT SOURCE AND RESUBMIT
Doch was der richtige Grad ist, ist nirgends zu finden *gg*

Es gibt auch Sprachen, die wirklich wie ein Text aussehen sollen, so wie Chef. Jeder Code liest sich wie ein Kochrezept. Man findet Schlüsselwörter wie [übersetzt] "Rührschüssel" oder "Backblech". Den Vogel in dieser Region schießt aber Shakespeare Programming Language. Dort ist jeder Code wie ein Shakespeare-Drama aus. Ein "HelloWorld"-Programm ist wohl gigantische 2,5kB groß.

Völlig andersartig ist Piet. Die Programme sind GIF-Bilder. So sieht wohl "HelloWorld" aus:

Um so langsam zum Ende zu kommen, möchte ich nun die Sprache vorstellen, die als die schlimmstmögliche Sprache schlechthin gilt: Malbolge.
Als Beweis für die schwierige Entwicklung von Programmen steht, dass das erste Malbolge-Programm erst zwei Jahre nach dem Entstehen der Programmiersprache entstanden ist. Dieses Programm wurde nicht von einem Menschen programmiert, sondern von einem Programm gefunden, das in Lisp geschrieben und mit einem Such-Algorithmus versehen wurde. Entwickelt wurde dieses Suchprogramm von Andrew Cooke.

Was Malbolge so schwer macht ist, dass es den ASCII-Wert eines Zeichens verwendet, den Modulo von 94 darauf anwendet und dann erst als Kommando benutzt. Um die Schwierigkeit noch zu steigern, wird danach ein Zähler erhöht, welcher auf zukünftige Werte addiert wird.

Dennoch gelang es Lou Scheffer, ein Programm zu entwickeln, das seine Ein- auf seine Ausgabe kopiert. Sein Bericht darüber endet mit Vorschlägen, wie die Sprache noch schwerer beherrschbar zu machen wäre.

+++++++

(=<`:9876Z4321UT.-Q+*)M'&%$H"!~}|Bzy?=|{z]KwZY44Eq0/ {
mlk** hKs_dG5[m_BA {?-Y;;Vb'rR5431M}/.zHGwEDCBA@98\ 65
43W 10/.R,+O<
//"Hello, world."


Und zu guter Letzt mein erklärter Liebling: Ook!
. Einfach nur lustig! Ook. *gg*

Ook! ist eine Variante der esoterischen Programmiersprache Brainfuck für Orang-Utans, entwickelt von David Morgan-Mar.[1] Obwohl bei Ook! der humoristische Ansatz im Vordergrund steht, eignet es sich gut dazu einige Grundlagen zum Design von Programmiersprachen zu verdeutlichen. Wie Brainfuck ist auch Ook! Turing-vollständig, obwohl es einen sehr kleinen Syntaxumfang hat.

Die Designkriterien der Sprache sind:

  1. Eine Programmiersprache sollte schreib- und lesbar für Orang-Utans sein.
  2. Die Syntax sollte einfach sein, leicht zu merken und das Wort Monkey (engl. Affe) vermeiden.
  3. Bananen sind gut.
Augenscheinlich ist diese Programmiersprache angelehnt an die Bibliothekarsfigur aus den Scheibenweltromanen von Terry Pratchett (Vergleiche hierzu die Eigenschaft, jedes Wort und jeden Satz mit „Ook“ („Ugh“ im Deutschen) ausdrücken zu können und seine Empfindlichkeit, wenn er als „Monkey“ bezeichnet wird – er bevorzugt „Ape“ (die Übersetzung ins Deutsche musste sich statt der Übersetzung von „Monkey“ mit dem Wort „Tier“ behelfen).

Ook hat nur drei Syntaxelemente:

  • Ook.
  • Ook?
  • Ook!

Diese werden zu Zweiergruppen zusammengefasst, die sich daraus ergebenden 9 Möglichkeiten lassen sich wie Brainfucksymbole verwenden, das nur 8 Befehlsbezeichnungen kennt (die Kombination Ook? Ook? wird nicht verwendet). Jedes Ook!-Programm besteht also aus einer geraden Zahl von Ooks. Zeilenumbrüche werden ignoriert.

[de.wikipedia.org, Stand: 22.11.2007]

Hier ein Screenshot aus der Pi-Berechnung in Ook!. Man beachte die Scrollbalken!

Tja, und wo ich grad mal dabei bin:

Ist zwar keine esoterische Sprache, dennoch immer wieder interessant und witzig: Perl-Poetry!
APPEAL:

listen (please, please);

open yourself, wide;
join (you, me),
connect (us,together),

tell me.

do something if distressed;

@dawn, dance;
[...]
+++ oder +++
if ((light eq dark) && (dark eq light)
&& ($blaze_of_night{moon} == black_hole)
&& ($ravens_wing{bright} == $tin{bright})){
my $love = $you = $sin{darkness} + 1;
};

Which was derived from these lyrics, by Jim Steinman's song The Invocation.

If light were dark and dark were light
The moon a black hole in the blaze of night
A raven's wing as bright as tin
Then you, my love, would be darker than sin.


Außerdem:

Hier ein wenig sehr krasser C-Code (Ja, es ist ein lauffähiges Betriebssystem!!! Gefunden auf IOCCC.org). Hier die Erklärung, was es alles kann!

Listening To:
Joe Satriani - Flying In A Blue Dream

2 Kommentare:

Anonym hat gesagt…

Ist dir aufgefallen, dass du etwa in bei der Hälfte des Artikels erwähntest, zum Ende kommen zu wollen? *g*

Phosphor hat gesagt…

Ich möchte gerne Ook! lernen. Ich finde Bananen gut und mag Bücher und finde eindeutig, dass Orang Utans zu den Herrentieren und nicht zu den Affen gehören.
Muss ich da einen VHS-Kurs besuchen?

+++++cäpitälishen:::"DEATH">ES GIBT KEINE GERECHTIGKEIT; ES GIBT NUR MICH.>>>[><] ...sand riesling on.(y/n) ###§§§__y. More sand.+++ stop sand riesling now.---SAY PLEASE.**Oh, please ++++++[>|<]~riesling sand was quit.++++/cäpitälischen:::"DEATH">

Hello, world.