JASm Coding – Sprachkonstrukte

Im vorangegangenen Beitrag wurden die esoterische Programmiersprache JASm und die zugehörige Maschine vorgestellt. Den Kern der Sprache machen lediglich zwei Befehle aus: SUB und JA. Alle weiteren Elemente sind (wie die beiden Befehle selber eigentlich auch) nur Zahlen.

Um die Programmierung etwas zu erleichtern, werden nun noch einige Sprachkonstrukte eingeführt, die den Kern von JASm nicht berühren und auch keine Anpassung oder gar Erweiterung der Maschine bedürfen, wohl aber ein wenig Komfort für einen Programmierer bieten.

JASm Coding

Die Programmierung basierend rein auf den beiden Befehlen in JASm Core (SUB und JA) ist müßig, daher existieren weitere Sprachelemente, die die Programmierung einfacher (und vor allem lesbarer) machen. Diese Elemente werden durch einen JASm Interpreter entsprechend in JASm Core Sprachelemente ersetzt.

Adressen und Variablen

Eine Speicherzelle kann für den Interpreter benannt werden. Hierzu ist zu Beginn der entsprechenden Zelle ein alphanumerischer Name gefolgt von einem Doppelpunkt anzugeben.

Start:          SUB 47 11                # Speicherzelle mit SUB wird “Start” genannt
data:           4712                     # Speicherzelle mit 4712 wird “data” genannt
                JA  @data target:100     # Zweiter Parameter wird “target” genannt
a:b:c:          12                       # Speicherzelle wird a, b und c genannt

Es ist zu beachten, dass die Adressbezeichnung nur für den ersten nachfolgenden Speicherblock gilt. Im obigen Beispiel befinden sich in der mit “Start” bezeichneten Zelle der SUB Befehl (Zellwert 0), nicht die Parameter 47 und 11. Diese sind in den beiden darauffolgenden Speicherzellen, also Start + 1 und Start + 2 hinterlegt.

Da sich Datenzellen auch in den Anweisungen „verbergen“ können, kann jedes Datum auch mit einer entsprechenden Markierung versehen werden. Im Beispiel oben trägt der zweite Parameter des Sprungbefehls die Adressmarke „target“.

Auch eine Mehrfachbezeichnung einer einzelnen Zelle ist möglich (siehe oben: a:b:c:), wobei zu beachten ist, dass es sich – auch wenn die Bezeichner unterschiedlich sind – immer um die gleiche Speicherzelle handelt. Dies darf also nicht mit einer Variablenzuweisung im klassischen Sinne ($a=$b=$c=12) verwechselt werden.

Im Quellcode können diese Adressen mit @name (also im obigen Beispiel @Start, @data, @target etc.) referenziert werden.

Die Adressbezeichner werden durch den Compiler, bzw. Interpreter mit den korrekten (numerischen) Adressen ersetzt und stehen damit zur Laufzeit nicht weiter zur Verfügung. Adressbezeichner bestehen aus alphanumerischen Bezeichnern, wobei Groß-/Kleinschreibung unterschieden wird. @Start ist also zu unterscheiden von @start. Auch eine Adressbezeichnung @11 (vorher definiert mit 11:) ist zulässig, wenngleich nicht empfohlen, da dies eher zu Missverständlichem Code führen kann.

Der JASm-Compiler bietet allerdings die Möglichkeit an, den Code mit den Speicheradressen zu versehen. Hierbei wird zu Beginn einer jeden Codezeile die erste Speicheradresse als Marker hinterlegt. Dies ist im Rahmen des Debuggings sehr hilfreich.

Das folgende Beispiel zeigt erweiterte Verwendungsmöglichkeiten in einem lauffähigen Programm.

                @Start          # Initialisierung des Programmzeigers
step:           -3              # Schrittweite des Programmzeigers
a:              0               # “Variable” a
b:              -1              # “Variable” b
Start:
                SUB @a @b       # $a = $a - $b
                SUB 0 0         # Programm beenden

In diesem Programm werden drei Marken definiert (a, b und Start). Nach Austausch der Textmarken durch den Interpreter lautet der Code wie folgt:

Adresse(n)InhaltErläuterung
04Initialisierung des Programmzeigers
1-3Schrittweite des Programmzeigers
20“Variable” $a
3-1“Variable” $b
4-6SUB 2 3$a = $a – $b
7-9SUB 0 0Programm beenden

Durch Verwendung der erwähnten Option zur Kennzeichnung der einzelnen Speicherstellen wird aus dem Quelltext folgendes:

0:              @Start          # Initialisierung des Programmzeigers
1:step:         -3              # Schrittweite des Programmzeigers
2:a:            0               # “Variable” a
3:b:            -1              # “Variable” b
4:Start:
4:              SUB @a @b       # $a = $a - $b
7:              SUB 0 0         # Programm beenden

Dass hierbei die Speicherzelle 4 zweimal auftaucht, ist kein Fehler, sondern lediglich der Strukturierung des Programmcodes geschuldet. Die Zeile Start: beinhaltet keinen Code und belegt damit keine Speicherzelle, referenziert also auf die nächste Adresse. Dies ist die Adresse 4 mit dem in der nachfolgenden Zeile gegebenen Code SUB @a @b.

Die Variablen werden in diesem Beispiel vor dem eigentlichen Programmcode angelegt. Daher muss der Programmzeiger im ersten Schritt auf den Anfang des Programms gesetzt werden. Dieses befindet sich an der Marke “Start”, bzw. in der Speicherzelle 3. (Alternativ hätten sich die Speicherbereich für die Variablen beispielsweise auch hinter dem Programmende befinden können.)

Die Marken a und b kennzeichnen Speicherzellen, in denen die Werte der Berechnung abgelegt sind. Wie zu erkennen ist, ist auch eine Vorausreferenzierung, also der Zugriff auf Marken, die noch nicht definiert wurden (z. B. @Start), möglich.

Compiler und Interpreter werden allerdings Fehler melden, wenn Marken genutzt, allerdings bis zum Ende des Codes nicht definiert wurden. Marken, die zwar definiert, aber nicht referenziert werden, haben keinen Einfluss auf das Verhalten.

Kommentare (REM, RE, R, #, // oder ;)

Um im JASm Programmcode Kommentare unterbringen zu können (was mehr als dringend empfohlen ist), kann REM (oder kürzer R, RE, #, // oder ;) verwendet werden. Nachfolgende Zeichen bis zum Zeilenende werden vollständig ignoriert.

Das Doppelkreuz # oder die doppelten Schrägstriche // können auch innerhalb einer Befehlszeile verwendet werden und veranlassen den JASm Interpreter alle weiteren Zeichen bis zum Zeilenende zu ignorieren.

Kommentare belegen in der JASm Maschine keinen Speicherplatz.

Die folgenden Codezeilen verdeutlichen die Verwendung von Kommentaren.

REM Diese Zeile wird komplett ignoriert
RE kennzeichnet ebenfalls eine Kommentarzeile
R Auch diese Zeile wird komplett ignoriert
                                # Dies ist eine alternative Form des Kommentars
                                // Dies ist ebenfalls eine Kommentarzeile
; Auch ein Semikolon zu Beginn leitet einen Kommentar ein

                SUB 47 11       # Dies ist ein Kommentar zur Subtraktion
                JA  28 100      // Alternative Kommentarform

Daten (DATA, DAT oder D)

DATA (oder kürzer “D”) ist eine optionale Kennzeichnung zur besseren Lesbarkeit des Programmcodes. Der JASm Interpreter wird die Zeichenkette schlichtweg ignorieren, allerdings die darauf folgende beliebige Anzahl an Parametern, bzw. Werten sequentiell in den Speicher übertragen.

Die folgenden Codezeilen sind somit äquivalent.

4711           # Zellwert 4711
4712           # Zellwert 4712
4711 4712      # Speicherzellen mit 4711 und 4712 füllen
D 4711 4712    # Speicherzellen mit 4711 und 4712 füllen
DAT 4711 4712  # Speicherzellen mit 4711 und 4712 füllen
DATA 4711 4712 # Speicherzellen mit 4711 und 4712 füllen

Zeichenkonvertierung (Strings)

Zur Vereinfachung kann vom Interpreter Text durch Verwendung von Anführungszeichen in seine ASCII Werte zerlegt werden. Der Textblock ist dabei in doppelten Anführungszeichen zu setzen. Der entsprechende ASCII Wert jedes einzelnen Zeichens wird in aufeinanderfolgende Zellen gespeichert.

Die Programmzeile

DATA “Hallo\ Welt!” # ASCII Werte von “Hallo Welt!”

hinterlegt die ASCII Werte des Textes in 11 aufeinanderfolgende Speicherzellen. Damit ist der Code äquivalent zu

DATA 72 97 108 108 111 32 87 101 108 116 33 # ASCII Werte des Texts “Hallo Welt!”

Zu beachten ist, dass insbesondere zum Text gehörende Anführungszeichen, Leerzeichen, Rauten (‘#’) sowie nicht-druckbare Zeichen durch ein “\” maskiert werden müssen. Es wird hierzu die aus der Programmiersprache C bekannte Notation verwendet.

ASCII Wertmaskiertes ZeichenBedeutung
0\0null
7\aAlarm (Bell)
8\bRücktaste (Backspace)
9\thorizontaler Tabulator
10\nZeilenwechsel (New Line)
11\vvertical Tabulator
12\fSeitenvorschub (Form Feed)
13\rZeilenanfang (Carriage Return)
32\ Leerzeichen
34\“Anführungszeichen
35\#Doppelkreuz (Hash)
92\\Backslash

Daraus resultierend muss der Text 

Hamlet: “Sein oder Nichtsein, das ist hier die Frage”

im JASm Quellcode wie folgt aussehen:

“Hamlet:\ \“Sein\ oder\ Nichtsein,\ das\ ist\ hier\ die\ Frage\””

Makros (INCLUDE, INC oder I)

Um Codeblöcke wiederverwenden zu können, ist ein INCLUDE Anweisung vorgesehen. Es wird hierbei ein Parameter erwartet, der den Namen des einzubindenden Codes, bzw. dessen Dateinamen kennzeichnet.

INC ADD

könnte so den Codeblock zur Addition von zwei Werten einbinden.

Zu beachten ist, dass der Code im Quelltext an genau der Stelle eingefügt wird, an der die INCLUDE Anweisung steht. Ferner wird keine Rücksicht darauf genommen, ob der Code bereits an einer anderen Stelle eingebunden wurde. Dies kann bei unsachgemäßer Anwendung zu Doppeldeklarationen von Speicherzellen führen.

Wenn hingegen das Makro EXIT mit „SUB 0 0“ definiert ist, kann dies ohne Bedenken an beliebigen Stellen eingefügt werden.

Beitrag vorlesen lassen

Kommentar hinterlassen

Nutze dieses Kommentarfeld um deine Meinung oder Ergänzung zu diesem Beitrag kundzutun. Verhalte dich bitte respektvoll und höflich! Kommentare werden vor der Veröffentlichung in der Regel moderiert und bei Verstößen gegen geltendes Recht, die guten Sitten, fehlendem Bezug oder missbräuchlicher Verwendung nicht freigegeben oder gelöscht.
Über die Angabe deines Namens, deiner E-Mail Adresse und deiner Webseite freuen wir uns, doch diese Felder sind optional. Deine E-Mail Adresse wird dabei zu keinem Zeitpunkt veröffentlicht.

Um mit dem Betreiber dieser Seite nicht-öffentlich in Kontakt zu treten, nutze die Möglichkeiten im Impressum.