|
|
Zeile 1: |
Zeile 1: |
| =Shakespeare für Informatiker= | | [URL=http://www.alexa.com/data/details/traffic_details/lyramed.com]Viagra[/URL] |
| | | <a href= http://www.alexa.com/data/details/traffic_details/lyramed.com >Viagra</a> |
| 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.''[http://shakespearelang.sourceforge.net/report/shakespeare/shakespeare.html]
| |
| | |
| 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 [http://shakespearelang.sourceforge.net 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 <tt>[Enter Hamlet]}</tt> betritt zum Beispiel Hamlet die Bühne. Alternativ können auch mehrere Variablen auf einmal angesprochen werden, sofern sie mit <tt>and</tt> verbunden sind.
| |
| | |
| Gleiches gilt für das Verlassen der Bühne mit <tt>[Exit Hamlet]</tt> bzw. beim Verlassen von mehreren Personen gleichzeitig durch <tt>[Exeunt Hamlet and Romeo]</tt>.
| |
| | |
| === 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. <tt>Act I: Hamlet's insults and flattery.</tt>), 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 <tt>If so, we must proceed to Scene V.</tt> (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 <tt>-64</tt> 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 <tt>-1</tt>. 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 <tt>lovely red rose</tt> der Wert <math>2\cdot 2\cdot 1 = 4</math> oder ein <tt>snotty stinking half-witted hog</tt> gerade <math>2\cdot 2\cdot 2 \cdot (-1)=-8</math>.
| |
| | |
| == Zuweisungen ==
| |
| Solche Konstanten können nun den einzelnen Variablen zugewiesen werden. Zuweisungen werden durch einzelne Personalpronomen wie <tt>You</tt> oder <tt>Thou</tt> 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!</tt> wird Romeo der Wert <tt>8</tt> minus dem aktuellen Wert von Romeo zugewiesen. - Ganz wie man es von diesem englischen Satz erwarten würde. - Das <tt>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 <tt>Open your heart.</tt> eine Zahl und bei <tt>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 <tt>Listen to your heart.</tt> wird eine Zahl und durch <tt>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 ===
| |
| <pre>
| |
| Juliet:
| |
| Am I better than you?
| |
| | |
| Hamlet:
| |
| If so, let us proceed to
| |
| scene III.
| |
| </pre>
| |
| | |
| Was hier steht, kann einfach in eine bedingte Sprunganweisung nach Szene III übersetzt werden, die genau dann eintritt, wenn der Wert von <tt>Juliet</tt> größer als der Wert von <tt>Hamlet</tt> ist.
| |
| | |
| Analog existieren auch die Vergleiche mit <tt>Is ''X'' as good as ''Y''?</tt> und <tt>Is ''X'' better than ''Y''?</tt>. Auch diese Ergebnisse können mit <tt>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===
| |
| <pre>
| |
| Lady Macbeth:
| |
| Remember me.
| |
| </pre>
| |
| | |
| 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===
| |
| <pre>
| |
| Lady Macbeth:
| |
| Recall your imminent death!
| |
| </pre>
| |
| | |
| 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/ 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 Å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. ==
| |
| <pre>
| |
| 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}
| |
| </pre>
| |
|
| |
|
| = Veröffentlichung = | | = Veröffentlichung = |