Zum Inhalt springen

„Shakespeare Programming Language“ – Versionsunterschied

aus Wikipedia, der freien Enzyklopädie
[gesichtete Version][gesichtete Version]
Inhalt gelöscht Inhalt hinzugefügt
Grundlegende Neubearbeitung und Verbesserung der Beschreibung der Syntax dieser Programmiersprache mit fachlichen Begriffen und hinreichender Qualität und Fülle basierend auf der Originalbeschreibung auf der Website der Entwickler!
K typo
 
(19 dazwischenliegende Versionen von 17 Benutzern werden nicht angezeigt)
Zeile 1: Zeile 1:
Die '''Shakespeare Programming Language''' ('''SPL''') ist eine von Kalle Hasselström und Jon Åslund im Jahre 2001 entwickelte imperative [[Esoterische Programmiersprache|esoterische Programmiersprache]] (Computersprache), welche in [[C (Programmiersprache)|C]] realisiert wurde und zu den am schwersten erlernbaren Programmiersprachen gehört. Ähnlich wie bei der Programmiersprache [[Chef (Programmiersprache)|Chef]] sieht ein SPL-Programm wie etwas ganz anderes aus: Ein SPL-Programm sieht auf den ersten Blick aus, als wäre es ein [[Drama]] von [[William Shakespeare]] und folgt dessen typischem Aufbau.
Die '''Shakespeare Programming Language''' ('''SPL''') ist eine von Karl Hasselström und Jon Åslund im Jahre 2001 entwickelte imperative [[esoterische Programmiersprache]] (Computersprache), welche in [[C (Programmiersprache)|C]] realisiert wurde und zu den am schwersten erlernbaren Programmiersprachen gehört. Ähnlich wie bei der Programmiersprache [[Chef (Programmiersprache)|Chef]] sieht ein SPL-Programm wie etwas ganz anderes aus: Ein SPL-Programm sieht auf den ersten Blick aus, als wäre es ein [[Drama]] von [[William Shakespeare]] und folgt dessen typischem Aufbau. Jedoch heißt dies keineswegs, dass Shakespeares Originalwerke als SPL aufgefasst werden können und kompilierbar wären.


SPL demonstriert deutlich, dass ein funktionsfähiges Programmiersprachenkonzept nicht konventionellen Vorstellungen folgen muss. Struktur sowie Schlüsselwörter müssen prinzipiell nur einem festen Schema entsprechen, um eine eindeutige Interpretation zu erlauben, unabhängig davon, wie lesbar oder logisch der Programmtext einem Menschen erscheint. Umgekehrt sind SPL-Programme auch für Menschen, die nicht programmieren können, sehr einfach zu lesen, und zwar als Drama. Die Bedeutung für den (nichteingeweihten) Menschen und für den Computer gehen hier komplett auseinander, zwei Bedeutungen überlagern sich. Daher wird SPL gerne in der Lehre als Beispiel für Sprachdesign verwendet. <ref>[[University of Notre Dame]]: Kurs ''[http://controls.ame.nd.edu/ame437/S2003/hw3/ AME 437: Control Systems Engineering Homework 3]'' (englisch) ''"For any two of the four differential equations you solved last week in 2.9.5, also verify your answer by plotting your solution and a solution obtained by numerically solving the equation using a fourth order Runge Kutta routine written in C, C++, FORTRAN or the Shakespeare Programming Language."''</ref><ref>[[West Virginia University]]: Kurs ''{{webarchiv|url=http://clc.wvu.edu:8080/clc/Members/sbaldwin/courses/old/engl306f04|text=English 306: Topics in Humanities Computing|wayback=20080513141130}}'' (englisch) ''"Sept 16 Meadows, Pause and Effect, Chap 2<br />McCloud, "Time Frames" NMR<br>Recommended: Shakespeare Programming Language, Scott McLoud, Cloudmakers, Liquid Stage, Jimmy Corrigan, Crutch, Devil's Tramping Ground, Memex Engine, Ambient Machines, demain/When I am King"''</ref>
SPL demonstriert deutlich, dass ein funktionsfähiges Programmiersprachenkonzept nicht konventionellen Vorstellungen folgen muss. Struktur sowie Schlüsselwörter müssen prinzipiell nur einem festen Schema entsprechen, um eine eindeutige Interpretation zu erlauben, unabhängig davon, wie lesbar oder logisch der Programmtext einem Menschen erscheint. Umgekehrt sind SPL-Programme auch für Menschen, die nicht programmieren können, sehr einfach zu lesen, und zwar als Drama. Die Bedeutung für den (nichteingeweihten) Menschen und für den Computer gehen hier komplett auseinander; zwei Bedeutungen überlagern sich. Daher wird SPL gerne in der Lehre als Beispiel für Sprachdesign verwendet.<ref>[[University of Notre Dame]]: Kurs ''[http://controls.ame.nd.edu/ame437/S2003/hw3/ AME 437: Control Systems Engineering Homework 3]'' (englisch) “For any two of the four differential equations you solved last week in 2.9.5, also verify your answer by plotting your solution and a solution obtained by numerically solving the equation using a fourth order Runge Kutta routine written in C, C++, FORTRAN or the Shakespeare Programming Language.</ref><ref>[[West Virginia University]]: Kurs ''{{webarchiv|url=http://clc.wvu.edu:8080/clc/Members/sbaldwin/courses/old/engl306f04|text=English 306: Topics in Humanities Computing|wayback=20080513141130}}'' (englisch) “Sept 16 Meadows, Pause and Effect, Chap 2<br />McCloud, „Time Frames“ NMR<br />Recommended: Shakespeare Programming Language, Scott McLoud, Cloudmakers, Liquid Stage, Jimmy Corrigan, Crutch, Devil’s Tramping Ground, Memex Engine, Ambient Machines, demain/When I am King.”</ref>


Auf welche Weise sich die beiden Bedeutungen überlagern, welche Elemente aus den Dramen Shakespeares welchen Elementen einer Programmiersprache entsprechen, wird im Folgenden dargestellt.
Auf welche Weise sich die beiden Bedeutungen überlagern, welche Elemente aus den Dramen Shakespeares welchen Elementen einer Programmiersprache entsprechen, wird im Folgenden dargestellt.
Zeile 7: Zeile 7:
== Basiswissen ==
== Basiswissen ==


Shakespeare Programming Language ist so besonders, da sie nicht wie sämtliche andere Programmiersprachen aus arithmetischen und festgelegten Zeichen basiert, sondern dem Entwickler bei seinem Programm sehr viel Freiheit lässt. Oft hat der Entwickler die Möglichkeit, das Programm an vielen Stellen in hunderte andere Varianten umzuschreiben, die zum selben Ergebnis führen.
Die Shakespeare Programming Language ist im Hinblick auf die Syntax besonders, da sie nicht wie sämtliche andere Programmiersprachen aus arithmetischen und festgelegten Zeichen basiert, sondern dem Entwickler bei seinem Programm sehr viel Freiheit lässt. Oft hat der Entwickler die Möglichkeit, die gleiche Programmfunktionalität durch das Austauschen von realsprachlichen Elementen wie z.&nbsp;B. Nomen oder Adjektiven zu erreichen.


Darüber hinaus ist die Programmiersprache an [[Shakespeare]] orientiert (man kann sozusagen in Dramenform programmieren), was sie zugleich einzigartig, aber auch gewöhnungsbedürftig macht.
Darüber hinaus ist die Programmiersprache an [[William Shakespeare]] orientiert (man kann sozusagen in [[Drama|Dramenform]] programmieren), was sie zugleich einzigartig, aber auch gewöhnungsbedürftig macht.


Die folgenden Beispiele sind aus dem ersten Programm in SPL – dem (in der Informatik so oft programmierten) [[Hallo-Welt-Programm]].
Die folgenden Beispiele sind aus dem ersten Programm in SPL&nbsp;– dem [[Hallo-Welt-Programm]]. Es lassen sich jedoch auch komplexere Programme wie z.&nbsp;B. ein Programm zur [[Primzahl]]ermittlung programmieren, wie der Entwickler in seiner Dokumentation anhand einiger Beispiele demonstriert.


== Funktionsweise ==
== Funktionsweise ==
=== Der Titel ===
=== Der Titel ===
Die erste Zeile eines jeden „Dramenstücks“ in SPL ist der Titel. Dieser kann frei gewählt werden und verleiht dem Stück etwas mehr Ordnung und Übersicht. Da er frei gewählt werden kann, erkennt der [[Compiler]] ihn bloß als Kommentar und beeinflusst daher nicht die Programmfunktionalität. Demzufolge ist der Titel optional, die Entwickler geben jedoch zu bedenken, dass ein Programm ohne Titel so schlecht programmiert wie ein Drama ohne Titel schlecht geschrieben sei.

Die erste Zeile eines jeden "Dramenstücks" in SPL ist der Titel. Dieser kann frei gewählt werden und verleiht dem Stück etwas mehr Ordnung und Übersicht. Da er frei gewählt werden kann, erkennt der [[Compiler]] ihn bloß als Kommentar und lässt ihn beim Kompilieren aus. Demzufolge ist der Titel optional, die Entwickler geben jedoch zu bedenken, dass ein Programm ohne Titel so schlecht programmiert wie ein Drama ohne Titel schlecht geschrieben sei.


Beispiel:
Beispiel:
Zeile 22: Zeile 21:


=== Die Charaktere (Dramatis Personæ) ===
=== Die Charaktere (Dramatis Personæ) ===
Wie in jedem Shakespeare-Drama auch, müssen am Anfang zunächst die Personen festgelegt werden. Diese sind die ersten Codezeilen, die vom Compiler als [[Deklaration (Programmierung)|Deklarationsanweisungen]] erkannt werden und erkannt werden müssen, damit die formalen Aspekte einer Programmiersprache gewährleistet werden können.

Wie in jedem Shakespeare-Drama auch, müssen am Anfang zunächst die Personen festgelegt werden. Diese sind die ersten, die vom Compiler erkannt werden und erkannt werden müssen, damit die Kompilierung zustande kommt.
Aufgelistet werden alle Charaktere des Stücks, welchen stets eine kurze Beschreibung folgt.
Aufgelistet werden alle Charaktere des Stücks, welchen stets eine kurze Beschreibung folgt.


Zeile 32: Zeile 30:
Hamlet, the flatterer of Andersen Insulting A/S.
Hamlet, the flatterer of Andersen Insulting A/S.


Die Charaktere sind vergleichbar mit ([[Signed int|signed Integer-]])[[Variable (Programmierung)|Variablen]]. Die folgende Beschreibung des Charakters ist verpflichtend, wird jedoch vom Parser ignoriert (Quelle: Offizielle Dokumentation). Verwendet werden können nur Charaktere, welche auch in Shakespeare-Dramen eine Rolle spielen, also zumeist Romeo, Juliet, Hamlet, Othello, Macbeth, King Lear usw.
Die Charaktere sind vergleichbar mit [[Signed int|signed Integer]]-[[Variable (Programmierung)|Variablen]] bzw. [[Char (Datentyp)|Chars]], die mittels betriebssystemspezifischen [[Zeichensatztabelle]]n eindeutig numerischen Werten zugeordnet werden können. Die folgende Beschreibung des Charakters ist verpflichtend, wird jedoch vom [[Parser]] ignoriert. Verwendet werden können nur Charaktere, welche auch in Shakespeare-Dramen eine Rolle spielen, also zumeist [[Romeo und Julia|Romeo]], Juliet, [[Hamlet]], [[Othello]], [[Macbeth (Shakespeare)|Macbeth]], [[King Lear]] usw. Gültige Charaktere werden anhand einer beigelegten Wörterliste erkannt, welche aktuell 152 Charaktere umfasst.


=== Akte und Szenen ===
=== Akte und Szenen ===
Nach der Deklaration der Variablen respektive Charaktere folgen der Abfolge eines Dramas entsprechend „Act&nbsp;I“ und „Scene&nbsp;I“, welche jeweils mit Titeln versehen sind. Wie bereits beim Programmtitel werden diese vom Compiler lediglich als Kommentar betrachtet; „Act“ und „Scene“ werden jedoch nach dem Kompilieren in C als [[Sprungmarke]] betrachtet, zu denen mittels „GOTO“-/Sprunganweisungen gesprungen werden kann.


Analog zum Titel sind Akte und Szenen zur erfolgreichen Kompilierung nicht zwingend erforderlich. Sie sind jedoch nicht optional im Interesse des Programmierers, da sowohl jeder Programmierer in SPL als auch jeder Dramenautor dazu verpflichtet sein sollte, sein Programm/Werk in Akte und Szenen zu strukturieren, damit die Lesbarkeit und Übersichtlichkeit gewährleistet werden kann.
Nach der "Deklaration" und "Initialisierung" der Variablen folgen der Abfolge eines Dramas entsprechend "Act I" und "Scene I", welche jeweils mit Titel versehen sind. Wie bereits beim Titel werden diese vom Compiler nicht gewertet; "Act" und "Scene" sind somit Schlüsselwörter für Kommentare.<br />
Ebenfalls mit dem Titel vergleichbar sind Akte und Szenen zur erfolgreichen Kompilierung nicht zwingend. Sie sind jedoch nicht optional im Sinne des Programmierers, da jeder Programmierer in SPL quasi dazu verpflichtet ist, sein Programm in Akte und Szenen einzuteilen vergleichbar mit Programmierkonventionen (Einrücken) in gewöhnlichen Sprachen.


Beispiel:
Beispiel:


Act I: Hamlet's insults and flattery.
Act&nbsp;I: Hamlet’s insults and flattery.
Scene I: The insulting of Romeo.
Scene&nbsp;I: The insulting of Romeo.


=== Enter, Exit und Exeunt ===
=== Enter, Exit und Exeunt ===
Jede Szene in jedem Akt wird eingeschlossen von Schlüsselwörtern, welche die Szene eröffnen bzw. schließen. Diese heißen wie in einem Drama, welches in [[Frühneuenglisch]] geschrieben wurde, zu Beginn [Enter], [Exit] und [Exeunt].

Um einen Charakter sprechen zu lassen und dadurch dafür zu sorgen, dass das Programm etwas ausführt, müssen die Charaktere der Logik zufolge auf der Bühne stehen. Charaktere, welche andere bereits auf der Bühne stehende Charaktere mit „you“, „thou“ oder einem jeden anderen Pronomen der zweiten Person ansprechen, müssen ebenfalls auf der Bühne platziert sein. Auf die Bühne kommen Charaktere durch die Festlegung ihrer im [Enter]-Befehl als eine Art Parameter.
Jede Szene in jedem Akt wird eingeschlossen von Schlüsselwörtern, welche die Szene eröffnen bzw. schließen. Diese heißen wie im richtigen Drama zu Beginn [Enter], [Exit] und [Exeunt].
Um einen Charakter sprechen zu lassen und dafür zu sorgen, dass das Programm etwas ausführt, müssen die Charaktere der Logik zufolge auf der Bühne stehen. Charaktere, welche bereits auf der Bühne stehende Charaktere mit "you", "thou" oder einem jeden anderen Pronomen der zweiten Person ansprechen, müssen ebenfalls auf der Bühne platziert sein. Auf die Bühne kommen Charaktere durch die Festlegung ihrer im [Enter]-Befehl als eine Art "Parameter".


Beispiel:
Beispiel:
Zeile 53: Zeile 50:
[Enter Hamlet and Romeo]
[Enter Hamlet and Romeo]


Entsprechend treten sie auch wieder ab. Dies geschieht entweder mit dem [Exit]- oder dem [Exeunt]-Befehl. Tritt eine Figur ab, muss diese hinter dem [Exit] erwähnt werden, z.&nbsp;B. [Exit Romeo]. Treten zwei oder mehr Charaktere gleichzeitig ab, muss der Exeunt-Befehl verwendet werden.<br />
Entsprechend treten Charaktere auch wieder von der Bühne ab. Dies geschieht entweder mit dem [Exit]- oder dem [Exeunt]-Befehl. Tritt eine Figur ab, muss diese hinter dem [Exit] erwähnt werden, z.&nbsp;B. [Exit Romeo]. Treten jedoch zwei oder mehr Charaktere gleichzeitig ab, muss der „Exeunt“-Befehl verwendet werden.
Sonderfall: Am Ende der Szene treten häufig alle dargestellten Personen ab. In diesem Falle genügt ein einziges [Exeunt] ohne sämtliche Parameter, um dem Compiler dies mitzuteilen.<br />
Eine Sondersituation stellt das Ende einer Szene dar: In diesem Fall treten häufig alle dargestellten Personen ab. Dafür genügt ein einziges [Exeunt] ohne sämtliche Parameter, um dem Compiler dies mitzuteilen.

Gibt man einem Charakter, der bereits auf der Bühne ist, einen Enter-Befehl oder einem abwesenden Charakter ein Exit, so wird der Compiler einen Laufzeitfehler melden.
Gibt man einem Charakter, der bereits auf der Bühne ist, einen „Enter“-Befehl oder einem abwesenden Charakter ein „Exit“, so meldet der Compiler einen Laufzeitfehler.


Beispiel:
Beispiel:
Zeile 63: Zeile 61:


=== Dialog/Anweisungen ===
=== Dialog/Anweisungen ===
Wie im wirklichen Drama ist auch in SPL der Dialog zumeist Grundlage von jeglichen Anweisungen. Hierbei sind einfache [[Anweisung (Programmierung)|Anweisungen]] wie [[Zuweisung]]en von arithmetischen und aussagenlogischen [[Ausdruck (Programmierung)|Ausdrücken]] und Prozeduranweisungen ([[Eingabe und Ausgabe]]), aber auch strukturierte [[Kontrollstruktur|Kontrollanweisungen]] ([[Sprunganweisung]]en oder [[Bedingte Anweisung und Verzweigung|bedingte Anweisungen]]) zulässig. Ein Dialogteil eines einzelnen Charakters besteht aus einem Charakternamen, einem Doppelpunkt sowie einem oder mehreren Sätzen, die die konkreten Anweisungen darstellen.

Wie im wirklichen Drama ist auch in SPL der Dialog zumeist Grundlage von jeglichen Anweisungen. Hierbei sind einfache [[Anweisung (Programmierung)|Anweisungen]] wie [[Zuweisung|Zuweisungen]] von arithmetischen und aussagenlogischen [[Ausdruck (Programmierung)|Ausdrücken]] und Prozeduranweisungen ([[Eingabe und Ausgabe]]), aber auch strukturierte [[Kontrollstruktur|Kontrollanweisungen]] ([[Sprunganweisung|Sprunganweisungen]] oder [[Bedingte Anweisung und Verzweigung|bedingte Anweisungen]]) zulässig. Ein Dialogteil eines einzelnen Charakters besteht aus einem Charakternamen, einem Doppelpunkt sowie einem oder mehreren Sätzen, die die konkrete Anweisung darstellen.


Beispiel:
Beispiel:
Zeile 73: Zeile 70:


==== Literale ====
==== Literale ====
[[Literal]]e oder Konstanten sind in SPL durch eine Wortliste definiert, von denen es insgesamt drei Stück gibt: negatives Nomen, neutrales Nomen und positives Nomen. Jedes englische Wort aus der gleichen Wortlistenfamilie lässt sich synonym verwenden. Somit entsprechen die Literale vordefinierten literarischen Konstanten, denen nach folgenden Kriterien numerische Werte zuzuordnen sind:

[[Literal|Literale]] oder Konstanten sind in SPL durch eine Wortliste definiert und jedes englische Wort aus der gleichen Wortlistenfamilie (Es gibt drei Wöterlisten: negatives Nomen, neutrales Nomen und positives Nomen) lässt sich synonym verwenden: So entsprechen auch hier die Literale vordefinierten literatischen Konstanten, die folgenden Kritierien zuzuorden sind:


* Jedes Nomen ist grundsätzlich eine Konstante mit dem Wert 1 oder −1.
* Jedes Nomen ist grundsätzlich eine Konstante mit dem Wert 1 oder −1.
* Der genaue Wert hängt davon ab, ob das Nomen negativ oder positiv konnotiert ist oder man keine Aussage über seine transferierende Gefühlsstimmung machen kann:
** „flower“ ist z.&nbsp;B. eine Konstante mit dem Wert 1.
** „pig“ oder „negation“ hätte entsprechend −1.
** „tree“ ist z.&nbsp;B. neutral, da es keine bestimmte Gefühlsstimmung transferiert und hat dementsprechend den Wert 1.


Adjektive genießen in SPL ebenfalls eine besondere Berücksichtigung. Auch sie sind über Wortlisten in die drei Kategorien negativ, neutral und positiv eingeteilt:
* Der genaue Wert hängt davon ab, ob das Nomen negativ oder positiv konnotiert ist oder man keine Aussage über sein transferierende Gefühlsstimmung machen kann:
* Jedes Adjektiv muss von der Stimmung her mit dem Nomen korrespondieren. Eine „stinking flower“ ergibt aus shakespearischer Sicht auch wenig Sinn.
** "flower" ist z.&nbsp;B. eine Konstante mit dem Wert 1.
* Jedes vorangeschaltete Adjektiv multipliziert das Nomen mit zwei.
** "pig" oder "negation" hätte entsprechend −1.
** "tree" ist z. B. neutral, da es keine bestimmte Gefühlsstimmung transferiert und hat dementsprechend den Wert 1.

Adjektive genießen in SPL ebenfalls eine besondere Berücksichtigung. Auch sie sind über Wortlisten in die drei Kategorieren: negativ, neutral und positiv eingeteilt:
* Jedes Adjektiv muss von der Stimmung her mit dem Nomen korrespondieren. Eine "stinking flower"ergibt aus shakespearischer Sicher auch wenig Sinn.

* Jedes vorangeschaltete Adjektiv multipliziert das Nomen mit 2. Um einen Nomenwert also mit 4 zu multiplizieren, schaltet man zwei Adjektive vor das Nomen.


==== Zuweisungen ====
==== Zuweisungen ====
Die von anderen Programmiersprachen bereits bekannte [[Zuweisung|Variablenzuweisung]] und der Zugriff auf diese Variablen (in SPL dargestellt durch die Charaktere von Shakespeares Werken) wird in SPL folgendermaßen umgesetzt:
Die von anderen Programmiersprachen bereits bekannte [[Zuweisung|Variablenzuweisung]] und der Zugriff auf diese Variablen (in SPL dargestellt durch die Charaktere von Shakespeares Werken) wird in SPL folgendermaßen umgesetzt:
* Es ist für Variablenzuweisungen ausschließlich eine Nennung eines Pronomens in 2. Person (namentlich "you", "thee" und "thou") gefolgt von einem Ausdruck zulässig. Dieser Ausdruck lässt sich wie folgt in zwei Kategorien einteilen:
* Es ist für Variablenzuweisungen ausschließlich eine Nennung eines Pronomens in zweiter Person (namentlich „you“, „thee“ und „thou“) gefolgt von einem Ausdruck zulässig. Dieser Ausdruck lässt sich wie folgt in zwei Kategorien einteilen:
** Zuweisung eines Literals: In dem Fall weist das Programm dem anderen Charakter ein direktes Literal in Form eines Nomens mit optionalem Adjektiv davor zu. Der jeweils andere Charakter, der sich auf der Bühne befindet, überschreibt den bisherigen Wert in seinem [[Stapelspeicher|Stack]] mit dem Wert des Literals.<syntaxhighlight>
** Zuweisung eines Literals: In dem Fall weist das Programm dem anderen Charakter ein direktes Literal in Form eines Nomens mit optionalem Adjektiv davor zu. Der jeweils andere Charakter, der sich auf der Bühne befindet, überschreibt den bisherigen Wert in seinem [[Stapelspeicher|Stack]] mit dem Wert des Literals.<syntaxhighlight lang="text">You lying stupid fatherless big smelly half-witted coward!</syntaxhighlight>In diesem Fall wird der Stack des angesprochenen Charakters um den Wert −64 erweitert.
** Zuweisung eines Ausdruckes: In diesem Fall weist das Programm dem anderen Charakter das Ergebnis eines arithmetischen Ausdruckes (s.&nbsp;u.) zu. Dafür ist es zwingend notwendig einen Zuweisungsoperator anzugeben, der in der Form „as [any adjective] as“ zwischen der Variablen und dem Ausdruck zu platzieren ist.<syntaxhighlight lang="text">You are as stupid as the difference between a handsome rich brave hero and thyself!</syntaxhighlight>Dieses Beispiel erläutert zeitgleich noch, dass die Werte bisheriger Variablen in Berechnungen verwendet werden können. Gültig sind die [[Reflexivpronomen]] „thyself“, „yourself“ and „myself“. Wenn man annähme die andere Person hieße „Hamlet“, so entspräche obige Anweisung folgender Zuweisung: „Hamlet = 8&nbsp;–&nbsp;Hamlet“.
You lying stupid fatherless big smelly half-witted coward!
</syntaxhighlight>In diesem Fall wird der Stack des angesprochenen Charakters um den Wert -64 erweitert.
** Zuweisung eines Ausdruckes: In diesem Fall weist das Programm dem anderen Charakter das Ergebnis eines arithmetischen Ausdruckes (s.u.) zu. Dafür ist es zwingend notwendig einen Zuweisungsoperator anzugeben, der in der Form "as [any adjective] as" zwischen der Variablen und dem Ausdruck zu platzieren ist.<syntaxhighlight>
You are as stupid as the difference between a handsome rich brave hero and thyself!
</syntaxhighlight>Dieses Beispiel erläutert zeitgleich noch, dass die Werte bisheriger Variablen in Berechnungen verwendet werden können. Gültig sind die [[Reflexivpronomen]] "thyself", "yourself" and "myself". Wenn man annähme die andere Person heiße "X", so würde obige Anweisung folgender Zuweisung entsprechen: "X = 8 - X".


==== Ausdrücke ====
==== Ausdrücke ====
Durch oben beschriebene Methodik wäre SPL nur in der Lage beliebige Potenzen zur Basis 2 respektive -2 (und den Sonderfällen 1 und -1) auszudrücken. Daher wurde in SPL die Möglichkeit geschaffen arithmetische und aussagenlogische Ausdrücke zu implementieren.
Durch oben beschriebene Methodik wäre SPL nur in der Lage beliebige natürliche Potenzen zur Basis 2 respektive das zur Addition invertierte von diesem auszudrücken. Daher wurde in SPL die Möglichkeit geschaffen arithmetische und aussagenlogische Ausdrücke zu implementieren.


===== arithmetische Ausdrücke =====
===== Arithmetische Ausdrücke =====
Ein arithmetischer Ausdruck besteht aus vorher definierten englischen Wörtern, die mathematische Operationen beschreiben, so sind z. B. die vier mathematischen Standardoperationen "difference", "sum", "product" and "quotient, aber auch erweiterte Ausdrücke, wie "square" oder "cube" zulässig. Diese Operationen lassen sich beliebig mit "and" verknüpfen und erfordern entsprechende sprachliche Korrektheit. Zwischen den arithmetischen Ausdrücken müssen sich entweder Literale oder Variablen befinden:
Ein arithmetischer Ausdruck besteht aus vorher definierten englischen Wörtern, die mathematische Operationen beschreiben, so sind z.&nbsp;B. die vier mathematischen [[Grundrechenart]]en „difference“, „sum“, „product“ und „quotient“, aber auch erweiterte Ausdrücke, wie „square“ oder „cube“ zulässig. Diese Operationen lassen sich beliebig mit „and“ verknüpfen und erfordern entsprechende sprachliche Korrektheit. Zwischen den arithmetischen Ausdrücken müssen sich entweder Literale oder Variablen befinden:


Ein etwas komplizierteres Beispiel:
Ein etwas komplizierteres Beispiel:


"the difference between the square of the difference between my little pony and your big hairy hound and the cube of your sorry little codpiece"
„the difference between the square of the difference between my little pony and your big hairy hound and the cube of your sorry little codpiece“


Zunächst ersetzt man die Konstanten durch Zahlen. Der Satz verändert sich somit in:
Zunächst ersetzt man die Konstanten durch Zahlen. Der Satz verändert sich somit in:


"the difference between the square of the difference between 2 and 4 and the cube of −4"
„the difference between the square of the difference between 2 and -4 and the cube of −4“


Nun ist die Differenz zwischen 2 und 4, −2, und die dritte Potenz von −4 ist (−4)³ = −64. Da das Quadrat von −2 = 4 ist, kommt man unter dem Strich zu "the difference between 4 and −64", was genau 68 entspricht.
Nun ist die Differenz zwischen 2 und -4 6 und die dritte Potenz von −4 ist (−4)<sup>3</sup> (= −64). Da das Quadrat von 6 = 36 ist, kommt man unter dem Strich zu „the difference between 36 and −64“, was genau 100 entspricht.
So ist „the difference between the square of the difference between my little pony and your big hairy hound and the cube of your sorry little codpiece“ = 100.


===== Aussagenlogische Ausdrücke =====
So ist "the difference between the square of the difference between my little pony and your big hairy hound and the cube of your sorry little codpiece" = 68.
Vergleiche bestehen aus aussagenlogische Ausdrücke, die einen booleschen Rückgabewert haben. Seien <math>X</math> und <math>Y</math> beliebige [[Datentyp#Ordinale Datentypen|ordinale Datentypen]]:
* „is <math>X</math> as good as <math>Y</math>“ testet auf <math>X</math> = <math>Y</math>.
* „is <math>X</math> better than <math>Y</math>“ testet auf <math>X</math> > <math>Y</math>.
* „is <math>X</math> worse than <math>Y</math>“ testet auf <math>X</math> < <math>Y</math>.
Für „better“ kann auch jeglicher anderer positiver Vergleichskomperator, wie „bigger“, „fresher“, „friendlier“, „nicer“ oder „jollier“, verwendet werden.


Für „worse“ kann auch jeglicher anderer negativer Vergleichskomperator, wie „punier“ oder „smaller“ verwendet werden.
===== aussagenlogische Ausdrücke =====
Vergleiche bestehen aus aussagenlogische Ausdrücke, die einen booleschen Rückgabewert haben. Seien X und Y beliebige [[Datentyp#Ordinale Datentypen|ordinale Datentypen]]:
* "is X as good as Y" testet auf X = Y
* "is X better than Y" testet auf X > Y
* "is X worse than Y" testet auf X < Y
Für "better" kann auch jegliche anderer positiver Vergleichskomperator, wie "bigger", "fresher", "friendlier", "nicer" oder "jollier", verwendet werden.


Wenn das Testergebnis invertiert werden soll, so kann dies durch ein „not“ umgesetzt werden, wie z.&nbsp;B. „not as good as“ oder „not better than“.
Für "good" kann auch jeglicher anderer negativer Vergleichskomperator, wie "punier" oder "smaller" verwendet werden.

Wenn das Testergebnis invertiert werden soll, so kann dies durch ein "not" umgesetzt werden, wie z.B. "not as good as" oder "not better than".


==== Eingabe und Ausgabe ====
==== Eingabe und Ausgabe ====
Hierbei kann ein anderer Charakter mittels "Open your heart" oder "Speak your mind" dazu aufgefordert werden den Wert seiner Variablen entweder im ersten Fall numerisch oder im zweiten Fall als Zeichen, abhängig vom [[Zeichensatz]] des Computers, auf den Bildschirm auszugeben. So sind mehrere fortlaufende Berechnungen und das stückweise Ausgeben von Zeichenketten, wie z.B. "Hello world!" mit nur einer Variable möglich.
Hierbei kann ein anderer Charakter mittels „Open your heart“ oder „Speak your mind“ dazu aufgefordert werden den Wert seiner Variablen entweder im ersten Fall numerisch oder im zweiten Fall als Zeichen, abhängig vom [[Zeichensatz]] des Computers, auf den Bildschirm auszugeben. So sind mehrere fortlaufende Berechnungen und das stückweise Ausgeben von Zeichen für z.&nbsp;B. die Zeichenkette „Hello world! mit nur einer Variable möglich.


Entsprechend korrespondierend verhält es sich mit der Eingabe von Werten: "Listen to your heart." ermöglicht die Zuweisung eines numerischen Wert an den angesprochenen Charakter, während "Open your mind." für ein Zeichen verwendbar ist. Das Eingeben der Werte kann über jegliches unterstütztes [[Eingabegerät]] erfolgen, üblich geschieht dies über die Tastatur.
Entsprechend korrespondierend verhält es sich mit der Eingabe von Werten: „Listen to your heart. ermöglicht die Zuweisung eines numerischen Wert an den angesprochenen Charakter, während „Open your mind. für ein Zeichen verwendbar ist. Das Eingeben der Werte kann über jegliches unterstütztes [[Eingabegerät]] erfolgen, üblich geschieht dies über die Tastatur.


==== Kontrollanweisungen ====
==== Kontrollanweisungen ====

===== Sprunganweisungen =====
===== Sprunganweisungen =====
Der aus der Informatik häufig als "GOTO" bekannte Befehl ermöglicht hierbei die einfachste Iteration und fand nur in älteren Systemen eine Verwendung und wird heutzutage fast ausschließlich durch die wesentlich struktuierteren und vereinfachten [[Schleife (Programmierung)|Schleifen]] (z.B. Zählschleifen oder kopf- bzw. fußgesteuerte Schleifen) ersetzt. Dennoch gibt es in SPL die Möglichkeit eines GOTO-Befehls, da eine einfache Implementationsmöglichkeit einer Sprunganweisung als ein essentieller Faktor für die Klassifizierung als Programmiersprache angesehen wird.
Der aus der Informatik häufig als „GOTO“ bekannte Befehl ermöglicht hierbei die einfachste Iteration und fand nur in älteren Systemen eine Verwendung und wird heutzutage fast ausschließlich durch die wesentlich strukturierteren und vereinfachten [[Schleife (Programmierung)|Schleifen]] (z.&nbsp;B. Zählschleifen oder kopf- bzw. fußgesteuerte Schleifen) ersetzt. Dennoch gibt es in SPL die Möglichkeit eines GOTO-Befehls, da eine einfache Implementationsmöglichkeit einer Sprunganweisung als ein essentieller Faktor für die Klassifizierung als Programmiersprache angesehen wird.


Die Realisierung in SPL erfolgt durch die Schlüsselbegriffe "Let us", "we shall" oder "we must" gefolgt von "return to scene [Roman numeral]" oder "proceed to [Roman numeral]" und bedeutet, dass man zu der entsprechend angegebenen Szene springen soll. Hierbei gilt es zu beachten, dass nur ein Springen innerhalb eines Aktes möglich ist, jedoch nicht zwischen mehreren Akten.
Die Realisierung in SPL erfolgt durch die Schlüsselbegriffe „Let us“, „We shall“ oder „We must“ gefolgt von „Return to scene [Roman numeral] oder „Proceed to [Roman numeral] und bedeutet, dass man zu der entsprechend angegebenen Szene springen soll. Hierbei gilt es zu beachten, dass nur ein Springen innerhalb eines Aktes möglich ist, jedoch nicht zwischen mehreren Akten.


===== bedingte Anweisungen =====
===== Bedingte Anweisungen =====
Bedingte Anweisungen bestehen aus zwei Hauptfragmenten, wie im folgenden Beispiel ersichtlich:<syntaxhighlight>
Bedingte Anweisungen bestehen aus zwei Hauptfragmenten, wie im folgenden Beispiel ersichtlich:
<syntaxhighlight lang="text">
Juliet:
Juliet:


 Am I better than you?
Am I better than you?


Hamlet:
Hamlet:


 If so, let us proceed to scene III.
If so, let us proceed to scene III.
</syntaxhighlight>
</syntaxhighlight>Zuerst wird eine Frage gestellt, die ein Vergleich darstellt (aussagenlogischer Ausdruck) und entweder einen wahren oder einen falschen Rückgabewert hat (in der Informatik bezeichnet man dies als eine [[boolsche Variable]]).
Zuerst wird eine Frage gestellt, die einen Vergleich darstellt (aussagenlogischer Ausdruck) und entweder einen wahren oder einen falschen Rückgabewert hat (in der Informatik bezeichnet man dies als eine [[Boolesche Variable]]).

Danach folgt eine konditionale Aussage, beginnend mit „if so“ oder „if not“ und einem Komma. Der Satz dahinter wird nur dann ausgeführt, wenn die vorherige Aussage wahr ist (bzw. im Falle der Verwendung von „if not“ entsprechend falsch ist).

== Compiler ==
[[Datei:SPL Programming.svg|mini|hochkant=2.0|Aufbau der Schritte zum Kompilieren von SPL]]
Die Entwickler von SPL haben keinen eigenen Compiler für SPL geschrieben, jedoch einen Übersetzer von SPL zu C, dieser konvertiert also die SPL Syntax in eine gültige C Syntax mit folgenden unter [[Linux]] ausführbaren Befehlen:


<syntaxhighlight lang="sh">
Danach folgt eine konditionale Aussage, beginnend mit "if so" oder "if not" und einem Komma. Der Satz dahinter wird nur dann ausgeführt, wenn die vorherige Aussage wahr ist (bzw. im Falle der Verwendung von "if not" entsprechend falsch ist).
./spl2c < hello.spl > hello.c
gcc -c hello.c
g++ hello.o libspl.a
</syntaxhighlight>
Im ersten Schritt wird mit dem vom Entwickler bereitgestellten Programm „spl2c“ der Programmcode von SPL nach C konvertiert, anschließend wird dieser im zweiten Schritt mit dem C-Compiler [[GNU Compiler Collection|gcc]] und mithilfe der vom Entwickler bereitgestellten [[Header-Datei]] „spl.h“ kompiliert. Im letzten Schritt wird dann das kompilierte Programmmodul „hello.o“ mit einer ebenfalls vom Entwickler bereitgestellten Bibliothek „libspl.a“ [[Linker (Computerprogramm)|gelinkt]] und ein ausführbares Programm ist entstanden.


== Quellen ==
== Quellen ==
<references/>
<references />


== Weblinks ==
== Weblinks ==
* [http://www.treskal.com/kalle/spl/ SPL, the Shakespeare Programming Language] Homepage von Kalle Hasselström, dem Mitentwickler von SPL, mit Dokumentation und Quellcode (englisch)
* [http://www.treskal.com/kalle/spl/ SPL, the Shakespeare Programming Language] Homepage von Kalle Hasselström, dem Mitentwickler von SPL, mit Dokumentation und Quellcode (englisch)
* [http://shakespearelang.sourceforge.net/ The Shakespeare Programming Language] Homepage bei [[Sourceforge.net]] (englisch)
* [http://shakespearelang.sourceforge.net/ The Shakespeare Programming Language] Homepage bei [[Sourceforge.net]] (englisch)
* [http://treskal.com/s/shakespeare.pdf Sprachbeschreibung, Anleitung und Einführung] (englisch, PDF), Version von Dezember 2001, abgerufen am 3. Juni 2016.
* [http://treskal.com/s/shakespeare.pdf Sprachbeschreibung, Anleitung und Einführung] (englisch, PDF), Version von Dezember 2001, abgerufen am 3. Juni 2016.



Aktuelle Version vom 13. Februar 2024, 22:27 Uhr

Die Shakespeare Programming Language (SPL) ist eine von Karl Hasselström und Jon Åslund im Jahre 2001 entwickelte imperative esoterische Programmiersprache (Computersprache), welche in C realisiert wurde und zu den am schwersten erlernbaren Programmiersprachen gehört. Ähnlich wie bei der Programmiersprache Chef sieht ein SPL-Programm wie etwas ganz anderes aus: Ein SPL-Programm sieht auf den ersten Blick aus, als wäre es ein Drama von William Shakespeare und folgt dessen typischem Aufbau. Jedoch heißt dies keineswegs, dass Shakespeares Originalwerke als SPL aufgefasst werden können und kompilierbar wären.

SPL demonstriert deutlich, dass ein funktionsfähiges Programmiersprachenkonzept nicht konventionellen Vorstellungen folgen muss. Struktur sowie Schlüsselwörter müssen prinzipiell nur einem festen Schema entsprechen, um eine eindeutige Interpretation zu erlauben, unabhängig davon, wie lesbar oder logisch der Programmtext einem Menschen erscheint. Umgekehrt sind SPL-Programme auch für Menschen, die nicht programmieren können, sehr einfach zu lesen, und zwar als Drama. Die Bedeutung für den (nichteingeweihten) Menschen und für den Computer gehen hier komplett auseinander; zwei Bedeutungen überlagern sich. Daher wird SPL gerne in der Lehre als Beispiel für Sprachdesign verwendet.[1][2]

Auf welche Weise sich die beiden Bedeutungen überlagern, welche Elemente aus den Dramen Shakespeares welchen Elementen einer Programmiersprache entsprechen, wird im Folgenden dargestellt.

Die Shakespeare Programming Language ist im Hinblick auf die Syntax besonders, da sie nicht wie sämtliche andere Programmiersprachen aus arithmetischen und festgelegten Zeichen basiert, sondern dem Entwickler bei seinem Programm sehr viel Freiheit lässt. Oft hat der Entwickler die Möglichkeit, die gleiche Programmfunktionalität durch das Austauschen von realsprachlichen Elementen wie z. B. Nomen oder Adjektiven zu erreichen.

Darüber hinaus ist die Programmiersprache an William Shakespeare orientiert (man kann sozusagen in Dramenform programmieren), was sie zugleich einzigartig, aber auch gewöhnungsbedürftig macht.

Die folgenden Beispiele sind aus dem ersten Programm in SPL – dem Hallo-Welt-Programm. Es lassen sich jedoch auch komplexere Programme wie z. B. ein Programm zur Primzahlermittlung programmieren, wie der Entwickler in seiner Dokumentation anhand einiger Beispiele demonstriert.

Die erste Zeile eines jeden „Dramenstücks“ in SPL ist der Titel. Dieser kann frei gewählt werden und verleiht dem Stück etwas mehr Ordnung und Übersicht. Da er frei gewählt werden kann, erkennt der Compiler ihn bloß als Kommentar und beeinflusst daher nicht die Programmfunktionalität. Demzufolge ist der Titel optional, die Entwickler geben jedoch zu bedenken, dass ein Programm ohne Titel so schlecht programmiert wie ein Drama ohne Titel schlecht geschrieben sei.

Beispiel:

The Infamous Hello World Program

Die Charaktere (Dramatis Personæ)

[Bearbeiten | Quelltext bearbeiten]

Wie in jedem Shakespeare-Drama auch, müssen am Anfang zunächst die Personen festgelegt werden. Diese sind die ersten Codezeilen, die vom Compiler als Deklarationsanweisungen erkannt werden und erkannt werden müssen, damit die formalen Aspekte einer Programmiersprache gewährleistet werden können. Aufgelistet werden alle Charaktere des Stücks, welchen stets eine kurze Beschreibung folgt.

Beispiel:

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.

Die Charaktere sind vergleichbar mit signed Integer-Variablen bzw. Chars, die mittels betriebssystemspezifischen Zeichensatztabellen eindeutig numerischen Werten zugeordnet werden können. Die folgende Beschreibung des Charakters ist verpflichtend, wird jedoch vom Parser ignoriert. Verwendet werden können nur Charaktere, welche auch in Shakespeare-Dramen eine Rolle spielen, also zumeist Romeo, Juliet, Hamlet, Othello, Macbeth, King Lear usw. Gültige Charaktere werden anhand einer beigelegten Wörterliste erkannt, welche aktuell 152 Charaktere umfasst.

Akte und Szenen

[Bearbeiten | Quelltext bearbeiten]

Nach der Deklaration der Variablen respektive Charaktere folgen der Abfolge eines Dramas entsprechend „Act I“ und „Scene I“, welche jeweils mit Titeln versehen sind. Wie bereits beim Programmtitel werden diese vom Compiler lediglich als Kommentar betrachtet; „Act“ und „Scene“ werden jedoch nach dem Kompilieren in C als Sprungmarke betrachtet, zu denen mittels „GOTO“-/Sprunganweisungen gesprungen werden kann.

Analog zum Titel sind Akte und Szenen zur erfolgreichen Kompilierung nicht zwingend erforderlich. Sie sind jedoch nicht optional im Interesse des Programmierers, da sowohl jeder Programmierer in SPL als auch jeder Dramenautor dazu verpflichtet sein sollte, sein Programm/Werk in Akte und Szenen zu strukturieren, damit die Lesbarkeit und Übersichtlichkeit gewährleistet werden kann.

Beispiel:

Act I: Hamlet’s insults and flattery.
Scene I: The insulting of Romeo.

Enter, Exit und Exeunt

[Bearbeiten | Quelltext bearbeiten]

Jede Szene in jedem Akt wird eingeschlossen von Schlüsselwörtern, welche die Szene eröffnen bzw. schließen. Diese heißen wie in einem Drama, welches in Frühneuenglisch geschrieben wurde, zu Beginn „[Enter]“, „[Exit]“ und „[Exeunt]“. Um einen Charakter sprechen zu lassen und dadurch dafür zu sorgen, dass das Programm etwas ausführt, müssen die Charaktere der Logik zufolge auf der Bühne stehen. Charaktere, welche andere bereits auf der Bühne stehende Charaktere mit „you“, „thou“ oder einem jeden anderen Pronomen der zweiten Person ansprechen, müssen ebenfalls auf der Bühne platziert sein. Auf die Bühne kommen Charaktere durch die Festlegung ihrer im „[Enter]“-Befehl als eine Art Parameter.

Beispiel:

[Enter Hamlet and Romeo]

Entsprechend treten Charaktere auch wieder von der Bühne ab. Dies geschieht entweder mit dem „[Exit]“- oder dem „[Exeunt]“-Befehl. Tritt eine Figur ab, muss diese hinter dem „[Exit]“ erwähnt werden, z. B. „[Exit Romeo]“. Treten jedoch zwei oder mehr Charaktere gleichzeitig ab, muss der „Exeunt“-Befehl verwendet werden. Eine Sondersituation stellt das Ende einer Szene dar: In diesem Fall treten häufig alle dargestellten Personen ab. Dafür genügt ein einziges „[Exeunt]“ ohne sämtliche Parameter, um dem Compiler dies mitzuteilen.

Gibt man einem Charakter, der bereits auf der Bühne ist, einen „Enter“-Befehl oder einem abwesenden Charakter ein „Exit“, so meldet der Compiler einen Laufzeitfehler.

Beispiel:

[Exeunt]
[Exeunt Hamlet and Romeo]

Dialog/Anweisungen

[Bearbeiten | Quelltext bearbeiten]

Wie im wirklichen Drama ist auch in SPL der Dialog zumeist Grundlage von jeglichen Anweisungen. Hierbei sind einfache Anweisungen wie Zuweisungen von arithmetischen und aussagenlogischen Ausdrücken und Prozeduranweisungen (Eingabe und Ausgabe), aber auch strukturierte Kontrollanweisungen (Sprunganweisungen oder bedingte Anweisungen) zulässig. Ein Dialogteil eines einzelnen Charakters besteht aus einem Charakternamen, einem Doppelpunkt sowie einem oder mehreren Sätzen, die die konkreten Anweisungen darstellen.

Beispiel:

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!

Literale oder Konstanten sind in SPL durch eine Wortliste definiert, von denen es insgesamt drei Stück gibt: negatives Nomen, neutrales Nomen und positives Nomen. Jedes englische Wort aus der gleichen Wortlistenfamilie lässt sich synonym verwenden. Somit entsprechen die Literale vordefinierten literarischen Konstanten, denen nach folgenden Kriterien numerische Werte zuzuordnen sind:

  • Jedes Nomen ist grundsätzlich eine Konstante mit dem Wert 1 oder −1.
  • Der genaue Wert hängt davon ab, ob das Nomen negativ oder positiv konnotiert ist oder man keine Aussage über seine transferierende Gefühlsstimmung machen kann:
    • „flower“ ist z. B. eine Konstante mit dem Wert 1.
    • „pig“ oder „negation“ hätte entsprechend −1.
    • „tree“ ist z. B. neutral, da es keine bestimmte Gefühlsstimmung transferiert und hat dementsprechend den Wert 1.

Adjektive genießen in SPL ebenfalls eine besondere Berücksichtigung. Auch sie sind über Wortlisten in die drei Kategorien negativ, neutral und positiv eingeteilt:

  • Jedes Adjektiv muss von der Stimmung her mit dem Nomen korrespondieren. Eine „stinking flower“ ergibt aus shakespearischer Sicht auch wenig Sinn.
  • Jedes vorangeschaltete Adjektiv multipliziert das Nomen mit zwei.

Die von anderen Programmiersprachen bereits bekannte Variablenzuweisung und der Zugriff auf diese Variablen (in SPL dargestellt durch die Charaktere von Shakespeares Werken) wird in SPL folgendermaßen umgesetzt:

  • Es ist für Variablenzuweisungen ausschließlich eine Nennung eines Pronomens in zweiter Person (namentlich „you“, „thee“ und „thou“) gefolgt von einem Ausdruck zulässig. Dieser Ausdruck lässt sich wie folgt in zwei Kategorien einteilen:
    • Zuweisung eines Literals: In dem Fall weist das Programm dem anderen Charakter ein direktes Literal in Form eines Nomens mit optionalem Adjektiv davor zu. Der jeweils andere Charakter, der sich auf der Bühne befindet, überschreibt den bisherigen Wert in seinem Stack mit dem Wert des Literals.
      You lying stupid fatherless big smelly half-witted coward!
      
      In diesem Fall wird der Stack des angesprochenen Charakters um den Wert −64 erweitert.
    • Zuweisung eines Ausdruckes: In diesem Fall weist das Programm dem anderen Charakter das Ergebnis eines arithmetischen Ausdruckes (s. u.) zu. Dafür ist es zwingend notwendig einen Zuweisungsoperator anzugeben, der in der Form „as [any adjective] as“ zwischen der Variablen und dem Ausdruck zu platzieren ist.
      You are as stupid as the difference between a handsome rich brave hero and thyself!
      
      Dieses Beispiel erläutert zeitgleich noch, dass die Werte bisheriger Variablen in Berechnungen verwendet werden können. Gültig sind die Reflexivpronomen „thyself“, „yourself“ and „myself“. Wenn man annähme die andere Person hieße „Hamlet“, so entspräche obige Anweisung folgender Zuweisung: „Hamlet = 8 – Hamlet“.

Durch oben beschriebene Methodik wäre SPL nur in der Lage beliebige natürliche Potenzen zur Basis 2 respektive das zur Addition invertierte von diesem auszudrücken. Daher wurde in SPL die Möglichkeit geschaffen arithmetische und aussagenlogische Ausdrücke zu implementieren.

Arithmetische Ausdrücke
[Bearbeiten | Quelltext bearbeiten]

Ein arithmetischer Ausdruck besteht aus vorher definierten englischen Wörtern, die mathematische Operationen beschreiben, so sind z. B. die vier mathematischen Grundrechenarten „difference“, „sum“, „product“ und „quotient“, aber auch erweiterte Ausdrücke, wie „square“ oder „cube“ zulässig. Diese Operationen lassen sich beliebig mit „and“ verknüpfen und erfordern entsprechende sprachliche Korrektheit. Zwischen den arithmetischen Ausdrücken müssen sich entweder Literale oder Variablen befinden:

Ein etwas komplizierteres Beispiel:

„the difference between the square of the difference between my little pony and your big hairy hound and the cube of your sorry little codpiece“

Zunächst ersetzt man die Konstanten durch Zahlen. Der Satz verändert sich somit in:

„the difference between the square of the difference between 2 and -4 and the cube of −4“

Nun ist die Differenz zwischen 2 und -4 6 und die dritte Potenz von −4 ist (−4)3 (= −64). Da das Quadrat von 6 = 36 ist, kommt man unter dem Strich zu „the difference between 36 and −64“, was genau 100 entspricht. So ist „the difference between the square of the difference between my little pony and your big hairy hound and the cube of your sorry little codpiece“ = 100.

Aussagenlogische Ausdrücke
[Bearbeiten | Quelltext bearbeiten]

Vergleiche bestehen aus aussagenlogische Ausdrücke, die einen booleschen Rückgabewert haben. Seien und beliebige ordinale Datentypen:

  • „is as good as “ testet auf = .
  • „is better than “ testet auf > .
  • „is worse than “ testet auf < .

Für „better“ kann auch jeglicher anderer positiver Vergleichskomperator, wie „bigger“, „fresher“, „friendlier“, „nicer“ oder „jollier“, verwendet werden.

Für „worse“ kann auch jeglicher anderer negativer Vergleichskomperator, wie „punier“ oder „smaller“ verwendet werden.

Wenn das Testergebnis invertiert werden soll, so kann dies durch ein „not“ umgesetzt werden, wie z. B. „not as good as“ oder „not better than“.

Eingabe und Ausgabe

[Bearbeiten | Quelltext bearbeiten]

Hierbei kann ein anderer Charakter mittels „Open your heart“ oder „Speak your mind“ dazu aufgefordert werden den Wert seiner Variablen entweder im ersten Fall numerisch oder im zweiten Fall als Zeichen, abhängig vom Zeichensatz des Computers, auf den Bildschirm auszugeben. So sind mehrere fortlaufende Berechnungen und das stückweise Ausgeben von Zeichen für z. B. die Zeichenkette „Hello world!“ mit nur einer Variable möglich.

Entsprechend korrespondierend verhält es sich mit der Eingabe von Werten: „Listen to your heart.“ ermöglicht die Zuweisung eines numerischen Wert an den angesprochenen Charakter, während „Open your mind.“ für ein Zeichen verwendbar ist. Das Eingeben der Werte kann über jegliches unterstütztes Eingabegerät erfolgen, üblich geschieht dies über die Tastatur.

Kontrollanweisungen

[Bearbeiten | Quelltext bearbeiten]
Sprunganweisungen
[Bearbeiten | Quelltext bearbeiten]

Der aus der Informatik häufig als „GOTO“ bekannte Befehl ermöglicht hierbei die einfachste Iteration und fand nur in älteren Systemen eine Verwendung und wird heutzutage fast ausschließlich durch die wesentlich strukturierteren und vereinfachten Schleifen (z. B. Zählschleifen oder kopf- bzw. fußgesteuerte Schleifen) ersetzt. Dennoch gibt es in SPL die Möglichkeit eines GOTO-Befehls, da eine einfache Implementationsmöglichkeit einer Sprunganweisung als ein essentieller Faktor für die Klassifizierung als Programmiersprache angesehen wird.

Die Realisierung in SPL erfolgt durch die Schlüsselbegriffe „Let us“, „We shall“ oder „We must“ gefolgt von „Return to scene [Roman numeral]“ oder „Proceed to [Roman numeral]“ und bedeutet, dass man zu der entsprechend angegebenen Szene springen soll. Hierbei gilt es zu beachten, dass nur ein Springen innerhalb eines Aktes möglich ist, jedoch nicht zwischen mehreren Akten.

Bedingte Anweisungen
[Bearbeiten | Quelltext bearbeiten]

Bedingte Anweisungen bestehen aus zwei Hauptfragmenten, wie im folgenden Beispiel ersichtlich:

Juliet:

 Am I better than you?

Hamlet:

 If so, let us proceed to scene III.

Zuerst wird eine Frage gestellt, die einen Vergleich darstellt (aussagenlogischer Ausdruck) und entweder einen wahren oder einen falschen Rückgabewert hat (in der Informatik bezeichnet man dies als eine Boolesche Variable).

Danach folgt eine konditionale Aussage, beginnend mit „if so“ oder „if not“ und einem Komma. Der Satz dahinter wird nur dann ausgeführt, wenn die vorherige Aussage wahr ist (bzw. im Falle der Verwendung von „if not“ entsprechend falsch ist).

Aufbau der Schritte zum Kompilieren von SPL

Die Entwickler von SPL haben keinen eigenen Compiler für SPL geschrieben, jedoch einen Übersetzer von SPL zu C, dieser konvertiert also die SPL Syntax in eine gültige C Syntax mit folgenden unter Linux ausführbaren Befehlen:

./spl2c < hello.spl > hello.c
gcc -c hello.c
g++ hello.o libspl.a

Im ersten Schritt wird mit dem vom Entwickler bereitgestellten Programm „spl2c“ der Programmcode von SPL nach C konvertiert, anschließend wird dieser im zweiten Schritt mit dem C-Compiler gcc und mithilfe der vom Entwickler bereitgestellten Header-Datei „spl.h“ kompiliert. Im letzten Schritt wird dann das kompilierte Programmmodul „hello.o“ mit einer ebenfalls vom Entwickler bereitgestellten Bibliothek „libspl.a“ gelinkt und ein ausführbares Programm ist entstanden.

  1. University of Notre Dame: Kurs AME 437: Control Systems Engineering Homework 3 (englisch) “For any two of the four differential equations you solved last week in 2.9.5, also verify your answer by plotting your solution and a solution obtained by numerically solving the equation using a fourth order Runge Kutta routine written in C, C++, FORTRAN or the Shakespeare Programming Language.”
  2. West Virginia University: Kurs English 306: Topics in Humanities Computing (Memento vom 13. Mai 2008 im Internet Archive) (englisch) “Sept 16 Meadows, Pause and Effect, Chap 2
    McCloud, „Time Frames“ NMR
    Recommended: Shakespeare Programming Language, Scott McLoud, Cloudmakers, Liquid Stage, Jimmy Corrigan, Crutch, Devil’s Tramping Ground, Memex Engine, Ambient Machines, demain/When I am King.”