JASm Core – eine esoterische Programmiersprache

JASm Core

JASm kommt mit zwei Maschinenbefehlen aus, die in diesem Abschnitt näher erläutert werden. Generell werden für jeden Maschinenbefehl drei aufeinanderfolgende Speicherzellen benötigt, wobei die erste Speicherzelle den eigentlichen Befehl und die folgenden beiden Speicherzellen Speicheradressen mit den Parametern beinhalten.

Subtraktion (SUB, S oder 0)

Der Subtraktionsbefehl SUB (oder kürzer “S”, bzw. im Binärcode 0) bildet die Differenz von zwei durch ihre Speicheradressen angegebenen Werten und speichert das Ergebnis in die erste der angegebenen Speicherzellen. Das Kommando lautet somit

SUB a b

wobei a und b Speicheradressen sind. In klassischer Syntax vollführt die Maschine mit diesem Befehl die folgende Instruktion:

$a = $a - $b

Der Inhalt der ersten Speicherzelle (a)  wird um den Wert der zweiten Speicherzelle (b) reduziert.

Standardmäßig wird der textuelle SUB Befehl als 0 interpretiert. Bei der Ausführung des Programms wird allerdings jeder Wert kleiner oder gleich 0 als SUB Befehl verstanden. Dies hat den Vorteil, dass bei einem Sprung auf einen leeren Speicherbereich das Programm automatisch terminiert. Näheres hierzu folgt in der Beschreibung der JASm Maschine.

Vor der Ausführung dieses Befehls wird der Programmzeiger durch die JASm-Maschine um drei Speicherzellen erhöht, sodass das Programm in der Regel linear mit dem nächsten Befehl fortgeführt wird. Da mit diesem Befehl allerdings auch der Programmzeiger selber modifiziert werden kann, können so auch unbedingte Sprünge (SUB 0 a) und des gezielte Programmende (SUB 0 0) realisiert werden.

Bedingter Sprung (JA, J oder 1)

Der bedingte Sprung JA (für “Jump if Above zero”, bzw. kürzer “J” und im Binärcode 1) prüft, ob ein gegebener Zellinhalt größer als 0 ist. Im positiven Fall erfolgt ein Sprung in der Programmausführung an die als zweiter Parameter angegebene Adresse im Speicher. Im anderen Fall, wenn der zu prüfende Wert kleiner oder gleich 0 ist, folgt die Programmausführung mit dem sequentiell nächsten Befehl, also drei Speicherzellen voraus. 

Das Kommando lautet somit wie folgt

JA a b

wobei a und b Speicheradressen sind. In klassischer Syntax vollführt die Maschine mit diesem Befehl die folgende Instruktion:

if ($a > 0) goto b;

Es ist dabei zu beachten, dass für den Vergleich der Inhalt der Speicherzelle a ausgewertet wird, der Sprung erfolgt allerdings zur Adresse b (nicht zur in der Speicherzelle b angegebenen Adresse).

Ein Beispiel:

2      # Programmzeiger
-3     # Schrittweiter für den Programmzeiger
JA 5 2 # Sprungbefehl mit Verweis auf den Inhalt der Zelle 4 und Zielzelle 1
10     # Wert 10

Im Arbeitsspeicher sieht das Programm dann wie folgt aus

Adresse InhaltKommentar
02Programmzeiger
1-3Schrittweite für den Programmzeiger
21 (= JA)# Sprungbefehl
35# erster Parameter mit Verweis auf den Inhalt der Zelle 5
42# zweiter Parameter mit Verweis auf Zelle 2
510# Datum

Hierbei handelt es sich um eine Endlosschleife. Der Programmzeiger (Adresse 0) verweist auf Zelle 2. Dort ist der JA Operator. Sein erster Parameter in Zelle 3 beinhaltet eine 5, die auf den Inhalt der Zelle 5 verweist. Dieser Wert (10) ist größer als 0, daher wird für die Programmausführung nun gemäß zweitem Parameter (Zelle 3) die Adresse 2 angesprungen und damit der JA Vergleich erneut durchgeführt.

Wollte man das Sprungziel zur Laufzeit verändern, müsste der Inhalt der Zelle 4 (hier: 2) modifiziert werden.

Standardmäßig wird der textuelle JA Befehl als 1 interpretiert. Bei der Ausführung des Programms wird allerdings jeder Wert größer als 0 als JA Befehl verstanden.

JASm Core Syntax

Durch die absolut minimalistische Codierung kann der JASm Interpreter, bzw. Compiler sehr robust implementiert werden. 

<Whitespaces> <Mnemonic> [<Whitespace> <Value> [<Whitespace> <Value>]] <Rest>

mit

  • <Whitespace>
    ist eine Anzahl an Leerzeichen, Zeilenwechsel oder Tabulatoren größer 0
  • <Whitespaces>
    ist eine beliebige Anzahl an Leerzeichen, Zeilenwechsel oder Tabulatoren, also auch 0
  • <Mnemonic>
    ist eins aus J, JA, S oder SUB, wobei zwischen Groß- und Kleinbuchstaben nicht unterschieden wird
  • <Value>
    ist eine beliebige Anzahl an Ziffern
  • <Rest>
    ist eine beliebige Anzahl an Leerzeichen und Tabulatoren oder einem #, bzw. // gefolgt von beliebigen Zeichen (außer Zeilen- und Dateienden). Die Sequenz endet mit einem Zeilen- oder Dateiende.
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.