Das
Bartels User Language-Programmiersystem besteht aus dem
User Language Compiler und dem
User Language Interpreter. Der Compiler hat die Aufgabe,
User Language-Quellcode in
User Language-Maschinencode (Programme oder Libraries) zu übersetzen und nach Bedarf statische Linkprozesse durchzuführen bzw. notwendige Informationen für dynamische Linkprozesse zu generieren. Mit Hilfe des Interpreters werden
User Language-Maschinenprogramme geladen, nach Bedarf dynamisch gelinkt, und schließlich ausgeführt bzw. abgearbeitet. Da
User Language Compiler und
User Language Interpreter zeitlich unabhängig voneinander arbeiten, also in unterschiedlichen Programmen implementiert sind, müssen die nachfolgend beschriebenen Konventionen hinsichtlich des Programmzugriffs eingehalten werden.
3.1.1 Programmspeicherung
Der Compiler legt fehlerfrei übersetzte Programme und Libraries unter ihrem jeweiligen Namen in der Datei
ulcprog.vdb im Programmverzeichnis des
Bartels AutoEngineer ab. Mit dem Maschinencode wird dabei die Versionsnummer des
User Language Compilers sowie der Aufruftyp (eine Kodierung für die zum Programm kompatible Interpreterumgebung) abgelegt. Darüber hinaus werden nach Bedarf auch notwendige Informationen für dynamische (d.h. zur Laufzeit durchzuführende) Linkprozesse abgespeichert. Der Interpreter lädt beim Programmaufruf das entsprechende Programm über seinen Namen aus der Datei
ulcprog.vdb des BAE-Programmverzeichnisses. Dabei wird mit Hilfe der
User Language-Versionsnummer geprüft, ob das Programm mit einer zum Interpreter kompatiblen Compiler-Version erzeugt wurde (andernfalls bestünde die Gefahr, dass der Interpreter die Programmstruktur gar nicht versteht). Über den Aufruftyp erfolgt die Prüfung der Kompatibilität des Programms zur aktuellen Interpreterumgebung; dies ist notwendig, um sicherzustellen, dass während der Programmausführung keine Index-Variablen-Typen oder Systemfunktionen referenziert werden, die in der aktuellen Interpreterumgebung gar nicht implementiert sind. Während der Programmladephase führt der Interpreter nach Bedarf automatisch die für den Programmlauf notwendigen dynamischen Linkprozesse durch, wobei die einzubindenden Libraries ebenfalls einer Kompatibilitätsprüfung unterzogen werden.
3.1.2 Maschinenarchitektur
Die in der
User Language implementierte Maschinenarchitektur entspricht der einer Stackmaschine. Der darin definierte Befehlssatz (Instruction Set) umfasst Ladebefehle (zum Laden von Variablen- oder Konstantenwerten), ALU-Befehle (zur Aktivierung der arithmetisch-logischen Einheit der Maschine), Speicherbefehle (für Zuweisungen), Sprungbefehle (zur Realisierung von Alternativen und Repetitionen), Befehle zum Aufruf und Beendigen von Funktionen, sowie Befehle zur direkten Manipulation des Stacks.
Der Befehlssatz (Instruction Set) dieser Maschine ist in
Tabelle 3-1 aufgelistet; die in den Stackspalten eingetragenen Werte geben dabei für jede Instruktion an, wie viele Argumente auf dem Stack erforderlich sind, und wie die Stackgröße durch die Abarbeitung der Instruktion verändert wird.
Tabelle 3-1: User Language Maschinen-Befehlssatz
Instruktion | Stack- argumente | Stack- änderung | Instruktionsbezeichnung |
nop | 0 | 0 | No operation |
add | 2 | -1 | Add |
addstr | 2 | -1 | Add string |
and | 2 | -1 | And |
bnot | 1 | 0 | Binary not |
cmpeq | 2 | -1 | Compare equal |
cmpge | 2 | -1 | Compare greater equal |
cmpgt | 2 | -1 | Compare greater |
cmple | 2 | -1 | Compare less equal |
cmplt | 2 | -1 | Compare less |
cmpne | 2 | -1 | Compare not equal |
decr | 1 | 0 | Decrement |
div | 2 | -1 | Divide |
divr | 2 | -1 | Divide rest |
incr | 1 | 0 | Increment |
mul | 2 | -1 | Multiply |
neg | 1 | 0 | Negate |
not | 1 | 0 | Not |
or | 2 | -1 | Or |
shl | 2 | -1 | Shift left |
shr | 2 | -1 | Shift right |
sub | 2 | -1 | Subtract |
xor | 2 | -1 | Exclusive or |
cast t | 1 | 0 | Cast value |
castoiv i | 3 | -2 | Cast of index variable |
getary | 2 | -1 | Get array element |
getidx i | 1 | 1 | Get index |
getidxof i | 3 | -1 | Get index of |
loadas s | 1 | 0 | Load stack array element |
loadav v | 1 | 0 | Load variable array element |
loadchr c | 0 | 1 | Load character |
loaddbl d | 0 | 1 | Load double |
loadint i | 0 | 1 | Load integer |
loadiv v | 2 | -1 | Load index variable |
loadoiv v | 4 | -3 | Load of index variable |
loads s | 0 | 1 | Load stack |
loadsd s | 0 | 1 | Load stack destructive |
loadstr s | 0 | 1 | Load string |
loaduref f | 0 | 1 | Load user function reference |
loadv v | 0 | 1 | Load variable |
loadvd v | 0 | 1 | Load variable destructive |
storeas s | 2 | -2 | Store stack array element |
storeav v | 2 | -2 | Store variable array element |
stores s | 1 | -1 | Store stack |
storev v | 1 | -1 | Store variable |
pop s | 0 | 0 | Pop stack |
popt | 1 | -1 | Pop top of stack |
push s | 0 | 0 | Push stack |
swap s | 0 | 0 | Swap stack |
xchg s | 0 | 0 | Exchange stack |
xchgt | 2 | 0 | Exchange top of stack |
jump p | 0 | 0 | Jump always |
jumpeq p | 2 | -1 | Jump if stack tops equal |
jumpnz p | 1 | -1 | Jump if stack nonzero |
jumpz p | 1 | -1 | Jump if stack zero |
calls f | 0 | 1 | Call system function |
callu f | 0 | 1 | Call user function |
hlt | 0 | 0 | Halt program |
ret | 1 | -1 | Return (pop optional stack) |
stop | 0 | 0 | Stop function |
Konventionen © 1985-2024 Oliver Bartels F+E • Aktualisiert: 26. January 2007, 17:23 [UTC]
|