ShakespeareForInfos

=Shakespeare für Informatiker=

Wolltest du schon immer Englische Literaturwissenschaften studieren? Du hast dich dann aber doch für etwas bodenständigeres entschieden? Etwa Informatik oder Mathematik? -- Dann sollte das hier genau das Richtige für dich sein: Die Shakespeare-Programmiersprache.

In Shakespeare kannst du nun endlich deinen literarischen Fähigkeiten Ausdruck verleihen. Schreib Romane oder gar Gedichte, die sogar Shakespeare alle Ehre gemacht hätten. Und ganz nebenbei erzeugst du damit lieblichen (und ausführbaren) Programmcode in feinstem Alt-Englisch. Die Entwickler beschreiben ihre Programmiersprache selber mit You could say we have combined the expressiveness of BASIC with the user-friendliness of assembly language.

In diesem Artikel werde ich versuchen, einen groben Überblick über diese Sprache zu geben und auch das ein oder andere Highlight vorzustellen. Eine vollständige Einführung würde jedoch den Rahmen sprengen - Man beachte, dass ein simples Hello World Programm bereits über 100 Zeilen umfasst. Ebenso sollte mit einem kurzen Blick auf den Seitenumfang des guten alten Oxford Dictionary klar sein, dass diese Sprache womöglich ein wenig umfangreicher ist.

Getting started
Die Shakespeare-Programmiersprache (SPL) wird als SourceForge-Projekt unter shakespearelang.sourceforge.net entwickelt. Momentan existiert noch kein Compiler für SPL, stattdessen gibt es aber einen Übersetzer, der SPL nach C-code übersetzt. Dieser kann dann mit dem gcc oder einem beliebigen anderen Compiler in ausführbaren Binärcode umgewandelt werden. Ebenso findet ihr auf der genannten Seite ein ausführliches Tutorial und einiges an Beispielprogrammen.

[Enter Hamlet and Romeo]
Einer der Kernbegriffe heutiger Programmiersprachen sind Variablen. Diese existieren auch in SPL, jedoch mit Einschränkungen. So ist es aus stilistischen Gründen nur möglich Namen für die Variablen zu wählen, die bereits für Charaktere in Shakespeare-Dramen verwendet wurden. So können z.B. Hamlet, Romeo, Juliet, The Ghost, Ophelia oder Macbeth verwendet werden, liebgewonnene Variablennamen wie i, j oder k müssen leider draußen bleiben. Sämtliche Variablen werden zu Beginn des Programms in der Charakterbeschreibung (Dramatis personae) definiert und erhalten eine sinngebende Beschreibung, welche jedoch vom Compiler ignoriert wird.

Bevor Variablen in einer Szene verwendet werden können, müssen sie zuerst auf der Bühne stehen. Durch die Bühnenanweisung [Enter Hamlet]} betritt zum Beispiel Hamlet die Bühne. Alternativ können auch mehrere Variablen auf einmal angesprochen werden, sofern sie mit and verbunden sind.

Gleiches gilt für das Verlassen der Bühne mit [Exit Hamlet] bzw. beim Verlassen von mehreren Personen gleichzeitig durch [Exeunt Hamlet and Romeo].

Dramatis personae
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.

Scene I: The insulting of Romeo.
Jeder SPL Code ist aufgeteilt in einzelne Akte (z.B. Act I: Hamlet's insults and flattery.), welche wiederum in Szenen (z.B. {\tt Scene I: The insulting of Romeo.}) aufgeteilt sind. Dadurch ist es innerhalb des Programms möglich mit Aussprüchen wie If so, we must proceed to Scene V. (analog zu GoTo Befehlen in C oder Assembler) im Programmcode zu springen.

Beschreibungen der Szene oder des Aktes, die nach dem Doppelpunkt vorgenommen werden, sind übrigens als Kommentar zu sehen und werden daher vom Compiler ignoriert.

You lying stupid fatherless big smelly half-witted coward!
Dieser Satz ist, so merkwürdig es auch klingt, eine Variablendeklaration und weist der angesprochenen Variable den Wert -64 zu. Aber dröseln wir den Satz doch Stück für Stück ein wenig auf...

Zahlen
Jedes Substantiv ist eine Konstante mit dem Wert 1 oder -1. Der Wert hängt davon ab, ob diese Zahl "schön" ist oder nicht. So haben bspw. die Wörter flower oder hero den Wert 1 aber coward oder pig den Wert -1. Neutrale Substantive wie tree oder stone zählen ebenfalls 1.

Durch jedes vorangestellte Adjektiv erhöht sich dieser Wert nun um den Faktor zwei. Somit wäre eine lovely red rose</tt> der Wert $$2\cdot 2\cdot 1 = 4$$ oder ein snotty stinking half-witted hog</tt> gerade $$2\cdot 2\cdot 2 \cdot (-1)=-8$$.

Zuweisungen
Solche Konstanten können nun den einzelnen Variablen zugewiesen werden. Zuweisungen werden durch einzelne Personalpronomen wie You</tt> oder Thou</tt> eingeleitet, die zeigen, welcher Charakter angesprochen wird.

Wenn also Hamlet zu Romeo spricht, You are as stupid as the difference between a handsome rich brave hero and thyself!</tt> wird Romeo der Wert 8</tt> minus dem aktuellen Wert von Romeo zugewiesen. - Ganz wie man es von diesem englischen Satz erwarten würde. - Das as [...] as</tt> kann übrigens durch einen (fast) beliebigen Ausdruck ersetzt werden, der eine Gleichheit ausdrückt.

I/O
Die Eingabe sowie die Ausgabe funktionieren denkbar einfach. So würde ein angesprochener Charakter bei dem Satz Open your heart.</tt> eine Zahl und bei Speak your mind.</tt> ein Literal ausgeben. Das Literal orientiert sich dabei am aktuell verwendeten Rechner-Zeichensatz (z.B. im ASCII-Code trägt das Zeichen A den Wert 65).

Die Eingabe erfolgt analog. Durch Listen to your heart.</tt> wird eine Zahl und durch Open your mind.</tt> ein Literal eingelesen und in der angesprochenen Variable gespeichert.

Am I better than you?
Im richtigen Leben meistens eine Fangfrage, hier ein simpler Wertevergleich. Durch dieses Statement können zwei Variablen miteinander verglichen werden. Das folgende Beispiel sollte f"ur jeden Informatiker fast selbsterklärend sein:

Vergleichen
Juliet: Am I better than you?

Hamlet: If so, let us proceed to scene III.

Was hier steht, kann einfach in eine bedingte Sprunganweisung nach Szene III übersetzt werden, die genau dann eintritt, wenn der Wert von Juliet</tt> größer als der Wert von Hamlet</tt> ist.

Analog existieren auch die Vergleiche mit Is X as good as Y?</tt> und Is X better than Y?</tt>. Auch diese Ergebnisse können mit If so,...</tt> und <tt>If not,...</tt> angefragt werden. Negative Vergleiche können logischer Weise mit bad und worse gemacht werden. Das Negieren gelingt durch Einfügen von not.

Remember me.
Als kleinen Leckerbissen haben die Entwickler auch eine Stack-Funktion eingebaut. Zu beachten ist hierbei, dass anders als z.B. in Assembler nicht ein gemeinsamer Stack existiert, sondern jeder Charakter sein eigenes kleines Gedächtnis, also seinen eigenen Stack besitzt. Die Push-Operation erfolgt durch ein <tt>Remember me.</tt>:

Push-Operation
Lady Macbeth: Remember me.

Hierdurch wird der Angesprochene veranlasst den Wert von Lady Macbeth auf seinen Stack zu legen.

Ein Pop wird durch das Auftauchen des Befehls <tt>recall</tt> ausgeführt:

Pop-Operation
Lady Macbeth: Recall your imminent death!

Hierbei nimmt wieder der Angesprochene den obersten Wert von seinem Stack.

Use It!
Das war nun eine kleine Einführung in SPL, aber wie jede Programmiersprache muss man sie selber erleben! Das Handbuch und den Übersetzer findet ihr unter http://shakespearelang.sourceforge.net/.

Vielleicht ist das nun der Start einer wunderbaren Karriere als Buchautor, Dramatiker oder Poet? In jedem Fall ist diese Programmiersprache aber ein wunderbares Beispiel was zwei Informatikstudenten (in diesem Fall Karl Hasselström and Jon &Aring;slund, damals an der Universität Stockholm) mit ein wenig Freizeit und einer recht weit gefassten Projektaufgabe doch fantastisches bewerkstelligen können.

Hello World
Um einen Geschmack zu bekommen, wie dann ein fertiges Programm aussieht, findet ihr hier den Programmcode des Hello World Programmes. Aus Platzgründen jedoch ein wenig gekürzt, sodass nur das Wort <tt>Hello</tt> ausgegeben wird.

The Infamous Hello World Program.
The Infamous Hello World Program.

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]

[...] \end{lstlisting}

= Veröffentlichung = * Artikel wurde geschrieben von: Andreas Cord-Landwehr * Uni: Universität Paderborn * Zeitschrift: \matik 58 - Wintersemester 2006/07 * Kontakt: phoenixx@upb.de


 * Nachdruck im Inforz vom Juni 2007. Online unter http://www.fachschaft.informatik.tu-darmstadt.de/inforz/ verfügbar.