6. Esoterische Programmiersprachen

6.1. Einleitung

Im Rahmen des DVA-Praktikums wurde ein exploratives Miniprojekt zu sogenannten esoterischen Programmiersprachen durchgeführt. Ziel war es, ungewöhnliche und nicht primär zur praktischen Softwareentwicklung gedachte Sprachen zu untersuchen, anhand kleiner Programme zu testen und deren Eigenheiten zu dokumentieren.

Im Fokus standen die Sprachen:

  • Brainfuck – eine minimalistische Sprache mit nur acht Befehlen

  • Prolog – eine deklarative Sprache aus dem Bereich der künstlichen Intelligenz

  • Whitespace – eine Sprache, die ausschließlich Leerzeichen, Tabs und Zeilenumbrüche verwendet

  • Shakespeare – eine Sprache, die auf dem Shakespeare-Stil basiert - Sie besteht aus Szenen, Akten, Monologen und Dialogen

Dieses Projekt verdeutlicht kreative und teils humorvolle Ansätze in der Sprachgestaltung und bietet zugleich eine Gelegenheit, sich mit fundamentalen Programmierkonzepten auf unkonventionelle Weise auseinanderzusetzen.

6.2. Brainfuck

6.2.1. Was ist Brainfuck?

Brainfuck ist eine Turing-vollständige, aber extrem minimalistische Programmiersprache, die 1993 von Urban Müller entwickelt wurde. Der gesamte Befehlssatz besteht aus nur acht Zeichen: > < + - . , [ ]

Tab. 6.2.1 Brainfuck-Befehle und ihre Bedeutung

Zeichen

Semantik

>

erhöht den Zeiger um eins

<

vermindert den Zeiger um eins

+

erhöht den aktuellen Zellwert um eins

-

vermindert den aktuellen Zellwert um eins

.

gibt den aktuellen Zellenwert als ASCII-Zeichen aus

,

holt ein Zeichen von der Eingabe und speichert dessen ASCII-Wert in der aktuellen Zelle

[

springt nach vorne, hinter den passenden ]-Befehl, wenn der aktuelle Zellenwert 0 ist

]

springt zurück, hinter den passenden [-Befehl, wenn der aktuelle Zellenwert nicht 0 ist

Die Sprache operiert auf einem eindimensionalen Array von Bytes und verwendet einen Datenzeiger, um auf Zellen zuzugreifen und diese zu manipulieren.

6.2.2. Beispiel: „Hello World“

++++++++++[>+++++++>++++++++++>+++>+<<<<-]>++.>+.+++++++..+++.>++.<<+++++++++++++++.>.+++.------.--------.>+.>.+++.

Dieses Programm gibt Hello World! aus – schwer zu lesen, aber funktionsfähig.

6.2.3. Erklärung:

Tab. 6.2.2 Brainfuck Hello-World – kommentierter Code

++++++++++ [ >+++++++>++++++++++>+++>+<<<<- ]

Schleife zur Vorbereitung der Textausgabe

>++.

Ausgabe von ‚H‘

>+.

Ausgabe von ‚e‘

+++++++.

Ausgabe von ‚l‘

.

Ausgabe von ‚l‘

+++.

Ausgabe von ‚o‘

>++.

Ausgabe eines Leerzeichens

<<+++++++++++++++.

Ausgabe von ‚W‘

>.

Ausgabe von ‚o‘

+++.

Ausgabe von ‚r‘

------.

Ausgabe von ‚l‘

--------.

Ausgabe von ‚d‘

>+.

Ausgabe von ‚!‘

>.

Zeilenvorschub

+++.

Wagenrücklauf

6.2.4. Eigenschaften:

  • Extrem kompakt, aber kaum lesbar

  • Nützlich zur Veranschaulichung von Turing-Vollständigkeit

  • Ideal zur Demonstration von Speicherzugriff und Kontrollstrukturen in ihrer grundlegendsten Form

  • extrem kleiner Compiler mit nur 171 Bytes für x86-Linux, für MS-DOS gibt es einen Interpreter mit einer Größe von nur 98 Bytes (der rustc Compiler hat rund 40MB)

[kryptografie] [brainfuck-wiki] [brainfuck]

6.3. Prolog

6.3.1. Was ist Prolog?

Prolog ist eine deklarative Sprache, die besonders in der künstlichen Intelligenz und bei logischen Schlussfolgerungen Anwendung findet. Sie basiert auf Fakten, Regeln und Anfragen (engl. „queries“).

Typisch für Prolog ist die unidirektionale Ausführung: Es wird beschrieben, was gelten soll – nicht wie man dorthin kommt.

6.3.2. Beispiel: Familienstammbaum

parent(alice, bob).
parent(bob, carol).

grandparent(X, Y) :- parent(X, Z), parent(Z, Y).
grandchild(X, Y)  :- parent(Z, X), parent(Y, Z).

% Anfrage: Wer ist Großelternteil von carol?
% grandparent(X, carol).
% Ausgabe: X = alice

% Anfrage: Wer ist Enkel von alice?
% grandparent(X, alice).
% Ausgabe: X = carol

% Anfrage: Ist carol Enkel von alice?
% grandchild(carol, alice).
% Ausgabe: true

6.3.3. Erklärung:

In Prolog baut man Programme durch eine Kombination aus Fakten, Regeln und Abfragen auf.

6.3.3.1. Fakten

Fakten sind Grundannahmen über die Welt. Sie bestehen aus Prädikaten und Argumenten und geben einfache Wahrheiten an:

parent(alice, bob).
parent(bob, carol).

Diese Fakten sagen aus: - Alice ist Elternteil von Bob - Bob ist Elternteil von Carol

6.3.3.2. Regeln

Regeln definieren logische Beziehungen zwischen Fakten. Sie bestehen aus einem Kopf (was bewiesen werden soll) und einem Körper (Bedingungen), getrennt durch :- („wenn“):

grandparent(X, Y) :- parent(X, Z), parent(Z, Y).

Das liest sich: „X ist Großelternteil von Y, wenn es ein Z gibt, so dass X Elternteil von Z ist und Z Elternteil von Y ist.“

Regeln erlauben es, neues Wissen aus bestehenden Fakten abzuleiten.

6.3.3.3. Abfragen (Queries)

Abfragen sind Fragen an das System, die geprüft werden:

?- grandparent(alice, carol).

Hier wird gefragt: „Ist Alice Großelternteil von Carol?“ Prolog versucht, Beweise anhand der Fakten und Regeln zu finden und antwortet mit true oder false.

Man kann auch Variablen in Abfragen verwenden, um herauszufinden, welche Werte passen:

?- grandparent(X, carol).

Prolog gibt zurück: X = alice Das heißt: „Alice ist Großelternteil von Carol.“

6.3.4. Eigenschaften:

  • Logik-basiert, keine klassische Kontrollflussstruktur

  • Leistungsstark bei Regeldefinition und Wissensrepräsentation

  • Anwendung in Expertensystemen, Sprachverarbeitung, KI

6.3.5. Unterschied zu imperativen Sprachen

Während imperative Sprachen Schritte zur Lösung vorschreiben, beschreibt Prolog Beziehungen und überlässt die Lösung dem System.

[prolog-doc] [prolog-wiki]

6.4. Whitespace

6.4.1. Was ist Whitespace?

Whitespace ist eine Sprache, bei der einzig nicht-sichtbare Zeichen (Leerzeichen, Tabulatoren, Zeilenumbrüche) als gültige Befehle interpretiert werden. Alles Sichtbare wird vom Interpreter ignoriert.

Ziel ist ein augenzwinkernder Umgang mit Syntax – der Code ist „unsichtbar“.

6.4.2. Beispiel: „Hello World“

Der Code setzt sich aus Leerzeichen (rot) und Tabs (blau) sowie Zeilenumbrüchen zsm. Und gibt am Ende Hello World! aus:

_images/5_1_Whitespace.png

6.4.3. Eigenschaften:

  • Witzige Idee: Code ist auf den ersten Blick nicht sichtbar

  • Vollständig turingmächtig

  • Erfordert spezielle Editoren / Formatierung, um sinnvoll geschrieben oder gelesen zu werden

[whitespace] [spektrum]

6.5. Shakespeare

6.5.1. Was ist Shakespeare?

Shakespeare ist eine Sprache, die auf dem Shakespeare-Stil basiert - Sie besteht aus Szenen, Akten, Monologen und Dialogen zwischen Charakteren wie Hamlet, Romeo und Juliet. Ziel ist es, Programmcode poetisch und literarisch wirken zu lassen.

6.5.2. Beispiel: „Hello World“

Das Programm gibt den Text „Hello World!“ aus. Es geschieht dies, indem verschiedene Charaktere (z. B. Hamlet, Romeo, Juliet) auf poetische Weise Variablenwerte manipulieren. Dabei entstehen ASCII-Zeichen durch wortreiche mathematische Ausdrücke. Jeder „Speak your mind!“-Befehl gibt den aktuellen ASCII-Wert des Sprechers aus. Der Code demonstriert die Eigenheit von SPL, logische Operationen in literarischer Sprache zu verpacken.

Die Wertzuweisungen erfolgen über Adjektivketten. Jedes positive Adjektiv zählt +1, jedes negative -1, ein Substantiv beendet die Wertbildung. So ergibt z. B.:

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.

Zwei Ketten werden addiert. Die erste ergibt etwa -6, die zweite +6 – insgesamt also 0. Diese Werte manipulieren das Register des jeweiligen Charakters. Mit aufeinanderfolgenden Zuweisungen und „Speak your mind!“-Befehlen entstehen so ASCII-Zeichen wie z. B. ‚H‘, ‚e‘, ‚l‘, ‚l‘, ‚o‘.

Die Reihenfolge und Kombination der poetischen Ausdrücke erzeugt gezielt Zeichenwerte, wobei der Text nach und nach ausgegeben wird.

6.5.3. Eigenschaften:

  • Programme sind aufgebaut wie Shakespeare-Dramen

  • Variablen = Charaktere, Werte = Adjektiv-Satzkonstruktionen

  • Rechenoperationen durch poetische Formulierungen

  • Ausgabe durch „Speak your mind!“ (ASCII-Zeichen) oder „Open your heart!“ (Zahl)

[shakespeare-esolang]

6.6. Chef

6.6.1. Was ist Chef?

Chef ist eine esoterische Programmiersprache, die 2002 von David Morgan-Mar erfunden wurde. Programme in Chef sehen aus wie Kochrezepte – mit einer Zutatenliste, Kochanweisungen und einem Serviervorgang. Variablen werden als Zutaten dargestellt, Kontrollstrukturen als Back- oder Mischvorgänge, und die Ausgabe entspricht dem Servieren eines Gerichts.

Chef wurde so entworfen, dass die resultierenden Programme nicht nur ausführbar, sondern auch als unterhaltsam zu lesende Kochanleitungen erscheinen.

6.6.2. Beispiel: „Hello World“

Die Zahlen der Zutaten (in Gramm) entsprechen ASCII-Werten: z. B. 72 = ‚H‘, 101 = ‚e‘, usw. - „Put … into the mixing bowl“ entspricht dem Pushen auf einen Stack. - „Pour … into the baking dish“ triggert die Ausgabe der ASCII-Werte.

6.6.3. Eigenschaften:

  • Programme sehen aus wie echte Rezepte

  • Stack-basierte Sprache mit starkem Fokus auf Ausgabereihenfolge

  • Unterhaltsam, lesbar und syntaktisch kreativ

  • Variablen heißen z. B. „potatoes“ oder „lard“ – Typenvielfalt spielt keine Rolle

[chef-esolang]

6.7. Malbolge

6.7.1. Was ist Malbolge?

Malbolge ist eine esoterische Programmiersprache, die 1998 von Ben Olmstead entworfen wurde. Sie wurde bewusst so gestaltet, dass sie extrem schwer zu verstehen und zu programmieren ist. Selbst triviale Programme wie „Hello World“ galten lange Zeit als nahezu unlösbar ohne automatische Codegenerierung.

6.7.2. Beispiel: „Hello World“

(=<`#9]7<6Z43W2vUT.-RQ+O,
J*I)G%$"!~}|{zyxwv,[email protected]
lkjihgfedcba`_^]\[ZYXWV
TSRQPONMLKJIHGFEDCBA@?>=<;
:9876543210/.-,+*)('&%$#"!

6.7.3. Erklärung:

  • Der Code wirkt völlig kryptisch – das liegt daran, dass Malbolge absichtlich so entworfen wurde, dass selbst triviale Programme wie „Hello World“ kaum von Menschen geschrieben werden können.

  • Der Code muss in einem speziellen Malbolge-Interpreter ausgeführt werden, z. B. online unter [https://tio.run/#malbolge](https://tio.run/#malbolge).

6.7.4. Eigenschaften:

  • Extrem schwer verständlich – fast alles muss automatisiert generiert werden

  • Speicherzellen werden auf ungewöhnliche Weise chiffriert

  • Kontrolle über Sprünge und Ausgabe erfolgt indirekt durch selbstmodifizierenden Code

Malbolge gilt als Paradebeispiel für eine esoterisch absurde Turingmaschine, die fast niemand manuell programmiert.

[malbolge-esolang]

6.8. Vergleich der Sprachen

Tab. 6.8.1 Vergleich esoterischer Programmiersprachen

Sprache

Paradigma

Besonderheiten

Lernfaktor

Brainfuck

Imperativ, Turing-Maschine

Nur 8 Befehle, direkter Speicherzugriff, sehr kompakt

Grundlegendes Verständnis von Speicher & Schleifen erforderlich

Prolog

Deklarativ, logisch

Fakten, Regeln und Queries zur Wissensrepräsentation

Ungewöhnliche Denkweise, aber hilfreich für KI-Verständnis

Whitespace

Stack-basiert, esoterisch

Nur Leerzeichen, Tabs und Zeilenumbrüche sind Code

Erfordert spezielle Editoren, extrem schwer zu debuggen

Shakespeare

Literarisch-poetisch, imperativ

Dramenstruktur, Variablen als Charaktere, Adjektiv-Mathematik

Hoher Aufwand für einfache Programme, aber kreativ und originell

Chef

Stack-orientiert, esoterisch

Quelltext sieht aus wie Kochrezepte, lesbar und unterhaltsam

Verständlich bei Kenntnis von Stack-Prinzipien, humorvoll

Malbolge

Selbstmodifizierend, kryptisch

Absichtlich unverständlich, extrem schwer manuell programmierbar

Praktisch nicht lernbar ohne Hilfstools – eher intellektuelles Experiment

6.9. Fazit

Dieses Miniprojekt bietet einen spielerischen Zugang zu ungewöhnlichen Sprachkonzepten und zeigt, dass Sprache nicht nur Funktionalität, sondern auch Ausdrucksform sein kann. Die Beschäftigung mit Brainfuck, Prolog und Whitespace fördert das Verständnis grundlegender Konzepte wie Speicherverwaltung, Logikverarbeitung und Stack-Operationen auf eine unkonventionelle Weise.

Gleichzeitig erlaubt es einen Perspektivwechsel und hinterfragt, was „gute Lesbarkeit“, „Design“ oder „Benutzbarkeit“ in einer Sprache eigentlich bedeuten.

Das Projekt hat gezeigt: auch jenseits etablierter Sprachen lassen sich spannende, lehrreiche und kreative Erfahrungen sammeln.

6.10. Literaturangaben

[brainfuck]

Brainfuck – Esoteric Languages Wiki https://esolangs.org/wiki/Brainfuck (besucht am 28.05.2025)

[brainfuck-wiki]

Brainfuck https://de.wikipedia.org/wiki/Brainfuck (besucht am 28.05.2025)

[prolog-doc]

SWI-Prolog Dokumentation https://www.swi-prolog.org/pldoc/doc_for?object=manual (besucht am 28.05.2025)

[whitespace]

Whitespace Language https://esolangs.org/wiki/Whitespace (besucht am 28.05.2025)

[shakespeare-esolang]

Shakespeare Language – https://esolangs.org/wiki/Shakespeare (besucht am 01.06.2025)

[chef-esolang]

Chef Language – https://esolangs.org/wiki/Chef (besucht am 01.06.2025)

[malbolge-esolang]

Malbolge Language – https://esolangs.org/wiki/Malbolge (besucht am 01.06.2025)