04 Wie ist der Aufbau eines Whitespace-Programms?

Whitespace ist eine befehlsorientierte stackbasierte Programmiersprache, die den Programmierern einen Stack und Heap zur Verfügung stellt.

Alle Operationen arbeiten intern auf Ganzzahlen beliebiger Bit-Länge. Es besteht allerdings die Möglichkeit, ein Zeichen auszugeben, das durch seinen ASCII-Code-Wert identifiziert wird.

Die Befehle und Steueranweisungen bestehen aus definierten Folgen von Leerzeichen (l), Tabulatorzeichen (t) und Zeilenumbrüchen (u).

Es gibt kein Syntaxelement zur Kennzeichnung von Kommentaren. Stattdessen können Kommentare, die selbst keine Whitespaces enthalten dürfen, an beliebigen Stellen im Quellcode eingegeben werden. Der Interpreter ignoriert alle Zeichen, die für ihn keine Bedeutung haben.

Befehle

Befehle setzen sich aus Sequenzen von Leerzeichen – Space – s, Tabulatoren – Tab – t und Zeilenumbrüchen – Linefeed – l zusammen. Zum Beispiel führt t-s-s-seine arithmetische Addition der beiden obersten Elemente auf dem Stack durch. Daten werden binär mit Leerzeichen (0) und Tabulatoren (1), gefolgt von einem Zeilenvorschub, dargestellt; somit ist s-s-s-t-s-t-t-l die Binärzahl 0001011, was dezimal 11 ist. Alle anderen Zeichen werden ignoriert und können somit für Kommentare verwendet werden.

Befehle werden als Folge eines Instruction Modification Parameter (IMP) geschrieben, gefolgt von der Operation und einem Parameter, falls erforderlich.

IMPBedeutung
sStack-Zugriff
t sRechenoperationen
t tHeap-Speicher-Zugriff
lSchleifen, Sprünge, Bedingungen
t lEin- /Ausgabe von Werten

Der Befehl besteht aus somit dem Zeichen für den Bereich sowie dem jeweiligen Befehl inkl. Parameter.

Stack-Zugriff

IMPBefehlParameterBedeutung
ssZahlLegt die Zahl auf den Stack
sl sVerdoppelt das oberste Element auf dem Stack
st sZahlKopiert das n-te Element des Stapels auf das oberste Element des Stapels
sl tVertauscht die beiden obersten Elemente des Stapels
sl lEntfernt das oberste Element vom Stapel
st lZahlVerschiebt n Elemente des Stapels und behält das oberste Element

Rechenoperationen

IMPBefehlParameterBedeutung
t ss sAddition
t ss tSubtraktion
t ss lMultiplikation
t st sGanzzahl-Division
t st tModulo

Heap-Speicher-Zugriff

IMPBefehlParameterBedeutung
t tsSchreiben
t ttLesen

Schleifen, Sprünge, Bedingungen

IMPBefehlParameterBedeutung
ll lMarkeSetzt eine Marke
ls tMarkeRuft ein Unterprogramm auf
ls lMarkeSpringt zu einer Marke
lt sMarkeSpringt zu einer Marke wenn der oberste Wert des Stapels 0 ist
lt t]MarkeSpringt zu einer Marke wenn der oberste Wert des Stapels negativ ist
lt lBeendet ein Unterprogramm
ll lProgrammende

Ein- /Ausgabe von Werten

IMPBefehlParameterBedeutung
t ls sGibt den obersten Wert des Stapels als Zeichen aus
t ls tGibt den obersten Wert des Stapels als Zahl aus
t lt sLiest ein Zeichen und speichert es an der Stelle, die der oberste Wert des Stapels angibt
t l]t tLiest eine Zahl und speichert sie an der Stelle, die der oberste Wert des Stapels angibt

Daten

Während die Befehle ein dreiwertiges Stellensystem verwenden, werden die Daten im dualen System abgebildet: An der ersten Stelle von links steht ein t für eine negative Zahl; ein l für eine positive. Im weiteren Verlauf steht t für 1 und l für 0. Die Spezifikation besagt, dass Zahlen eine beliebige Bitlänge haben können, allerdings können Compiler und Interpreter hier eine sinnvolle Obergrenze festlegen. Abgeschlossen wird ein Datum durch einen Zeilenumbruch.