Bartels :: Bartels AutoEngineer :: BAE Dokumentation :: User Language Programmierhandbuch :: Programmiersystem :: Konventionen |
Bartels User Language - Programmierhandbuch3.1 Konventionen |
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.
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.
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.
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 |
Bartels :: Bartels AutoEngineer :: BAE Dokumentation :: User Language Programmierhandbuch :: Programmiersystem :: Konventionen |
Konventionen
© 1985-2024 Oliver Bartels F+E