ShakespeareForInfos

Aus KIF

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.[1]

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].


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.
% aus dem Hello-World Programm

Scene I: The insulting of Romeo.

Jeder SPL Code ist aufgeteilt in einzelne Akte (z.B. {\tt 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"oglich mit Ausspr"uchen wie {\tt 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 "ubrigens als Kommentar zu sehen und werden daher vom Compiler ignoriert.

\titel{You lying stupid fatherless big smelly half-witted coward!}

Dieser Satz ist, so merkw"urdig es auch klingt, eine Variablendeklaration und weist der angesprochenen Variable den Wert $-64$ zu. Aber dr"oseln wir den Satz doch St"uck f"ur St"uck ein wenig auf \dots

\titel{Zahlen} Jedes Substantiv ist eine Konstante mit dem Wert $1$ oder $-1$. Der Wert h"angt davon ab, ob diese Zahl \glqq{sch"on\grqq} ist oder nicht. So haben bspw. die W"orter \emph{flower} oder \emph{hero} den Wert $1$ aber \emph{coward} oder \emph{pig} den Wert $-1$. Neutrale Substantive wie \emph{tree} oder \emph{stone} z"ahlen ebenfalls $1$.

Durch jedes vorangestellte Adjektiv erh"oht sich dieser Wert nun um den Faktor zwei. Somit w"are eine {\tt lovely red rose} der Wert $2\cdot 2\cdot 1 = 4$ oder ein {\tt snotty stinking half-witted hog} gerade $2\cdot 2\cdot 2 \cdot (-1)=-8$.

\titel{Zuweisungen} Solche Konstanten k"onnen nun den einzelnen Variablen zugewiesen werden. Zuweisungen werden durch einzelne Personalpronomen wie {\tt You} oder {\tt Thou} eingeleitet, die zeigen, welcher Charakter angesprochen wird.

Wenn also Hamlet zu Romeo spricht, {\tt You are as stupid as the difference between a handsome rich brave hero and thyself!} wird Romeo der Wert $8$ minus dem aktuellen Wert von Romeo zugewiesen. --- Ganz wie man es von diesem englischen Satz erwarten w"urde. --- Das {\tt as [\dots] as} kann "ubrigens durch einen (fast) beliebigen Ausdruck ersetzt werden, der eine Gleichheit ausdr"uckt.

\titel{I/O} Die Eingabe sowie die Ausgabe funktionieren denkbar einfach. So w"urde ein angesprochener Charakter bei dem Satz {\tt Open your heart.} eine Zahl und bei {\tt Speak your mind.} ein Literal ausgeben. Das Literal orientiert sich dabei am aktuell verwendeten Rechner-Zeichensatz (z.B. im ASCII-Code tr"agt das Zeichen \emph{A} den Wert 65).

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

\titel{Am I better than you?}

Im richtigen Leben meistens eine Fangfrage, hier ein simpler Wertevergleich. Durch dieses Statement k"onnen zwei Variablen miteinander verglichen werden. Das folgende Beispiel sollte f"ur jeden Informatiker fast selbsterkl"arend sein:

\begin{lstlisting}[caption={Vergleichen}, label = Shakespeare2] Juliet:

Am I better than you?

Hamlet:

If so, let us proceed to
scene III.

\end{lstlisting}


Was hier steht, kann einfach in eine bedingte Sprunganweisung nach Szene III "ubersetzt werden, die genau dann eintritt, wenn der Wert von {\tt Juliet} gr"o"ser als der Wert von {\tt Hamlet} ist.

Analog existieren auch die Vergleiche mit {\tt Is \emph{X} as good as \emph{Y}?} und {\tt Is \emph{X} better than \emph{Y}?}. Auch diese Ergebnisse k"onnen mit {\tt If so, \dots} und {\tt If not, \dots} angefragt werden. Negative Vergleiche k"onnen logischer Weise mit \emph{bad} und \emph{worse} gemacht werden. Das Negieren gelingt durch Einf"ugen von \emph{not}.

\titel{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"achtnis, also seinen eigenen Stack besitzt. Die Push-Operation erfolgt durch ein {\tt Remember me.}:

\begin{lstlisting}[caption={Push-Operation}, label = Shakespeare3] Lady Macbeth:

Remember me.

\end{lstlisting}

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

Ein Pop wird durch das Auftauchen des Befehls {\tt recall} ausgef"uhrt:

\begin{lstlisting}[caption={Pop-Operation}, label = Shakespeare4] Lady Macbeth:

Recall your imminent death!

\end{lstlisting}


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

\titel{Use It!}

Das war nun eine kleine Einf"uhrung in SPL, aber wie jede Programmiersprache muss man sie selber erleben! Das Handbuch und den "Ubersetzer findet ihr unter \url{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"om and Jon {\AA}slund, damals an der Universit"at Stockholm) mit ein wenig Freizeit und einer recht weit gefassten Projektaufgabe doch fantastisches bewerkstelligen k"onnen.

\titel{Hello World} Um einen Geschmack zu bekommen, wie dann ein fertiges Programm aussieht, findet ihr hier den Programmcode des Hello World Programmes. Aus Platzgr"unden jedoch ein wenig gek"urzt, sodass nur das Wort {\tt Hello} ausgegeben wird. \end{zweispaltig} \autor{CoLa} \begin{figure*}[!b] \begin{center} \includegraphics[width=15cm]{comics/shakespear}\\ \end{center} \end{figure*} \pagebreak

\titel{The Infamous Hello World Program.} \begin{lstlisting}[caption={The Infamous Hello World Program.}, label = Shakespeare5] 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}