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.
IMP | Bedeutung |
s | Stack-Zugriff |
t s | Rechenoperationen |
t t | Heap-Speicher-Zugriff |
l | Schleifen, Sprünge, Bedingungen |
t l | Ein- /Ausgabe von Werten |
Der Befehl besteht aus somit dem Zeichen für den Bereich sowie dem jeweiligen Befehl inkl. Parameter.
Stack-Zugriff
IMP | Befehl | Parameter | Bedeutung |
s | s | Zahl | Legt die Zahl auf den Stack |
s | l s | – | Verdoppelt das oberste Element auf dem Stack |
s | t s | Zahl | Kopiert das n-te Element des Stapels auf das oberste Element des Stapels |
s | l t | – | Vertauscht die beiden obersten Elemente des Stapels |
s | l l | – | Entfernt das oberste Element vom Stapel |
s | t l | Zahl | Verschiebt n Elemente des Stapels und behält das oberste Element |
Rechenoperationen
IMP | Befehl | Parameter | Bedeutung |
t s | s s | – | Addition |
t s | s t | – | Subtraktion |
t s | s l | – | Multiplikation |
t s | t s | – | Ganzzahl-Division |
t s | t t | – | Modulo |
Heap-Speicher-Zugriff
IMP | Befehl | Parameter | Bedeutung |
t t | s | – | Schreiben |
t t | t | – | Lesen |
Schleifen, Sprünge, Bedingungen
IMP | Befehl | Parameter | Bedeutung |
l | l l | Marke | Setzt eine Marke |
l | s t | Marke | Ruft ein Unterprogramm auf |
l | s l | Marke | Springt zu einer Marke |
l | t s | Marke | Springt zu einer Marke wenn der oberste Wert des Stapels 0 ist |
l | t t] | Marke | Springt zu einer Marke wenn der oberste Wert des Stapels negativ ist |
l | t l | Beendet ein Unterprogramm | |
l | l l | Programmende |
Ein- /Ausgabe von Werten
IMP | Befehl | Parameter | Bedeutung |
t l | s s | – | Gibt den obersten Wert des Stapels als Zeichen aus |
t l | s t | – | Gibt den obersten Wert des Stapels als Zahl aus |
t l | t s | – | Liest ein Zeichen und speichert es an der Stelle, die der oberste Wert des Stapels angibt |
t l] | t t | – | Liest 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.