Wenn das EbsScript während der Ausführungszeit ausgewertet werden würde, wäre die Ausführung relativ langsam. Deshalb wird ein Compiler verwendet, der das PASCAL-Script in Maschinencode der ”Virtuellen Maschine” (eine Software Emulation einer echten Maschine) transformiert, der dann das Script ausführt. Der Compiler wird automatisch jedes Mal vor der Ausführung im EbsScript Editor oder EbsScript Executor aufgerufen, wenn sich eine Änderung ergeben hat.
Durch den EbsScript-Compiler wird insbesondere auch die Anzeige von Textfeldern, in denen EbsScripts hinterlegt sind, stark beschleunigt, da sie nicht bei jeder Bildauffrischung erneut übersetzt werden müssen.
Zusätzlich kann man den Compiler manuell mit dem Befehlmenü ”ErstellenàSyntaktische Analyse” starten. Dadurch kann man die Richtigkeit der Syntax prüfen, bevor man das Script ausführt.
Der EbsScript Compiler ist ein spezieller, den Anforderungen für den Gebrauch innerhalb Ebsilon angepasster PASCAL-Compiler. Deshalb gibt es dort mehrere Erweiterungen zur Sprache und mehrere spezielle Funktionen, während andere wenig genutzte Konstruktionen nur eingeschränkt verfügbar sein können.
Die Eingabe für den EbsScript Compiler ist solch ein Script:
var
CoolantTemp : integer;
InletTemp : real;
OutletTemp : real;
deltaTemp : real;
counter : integer;
begin
counter := 0;
setParentProfileByName ("Variation_C");
for CoolantTemp := 60 to 85 step 5 do
begin
newSubProfile;
HeatConsumer_PrimaryCircuit.T2SET := CoolantTemp;
simulate;
InletTemp := last.CoolantInlet_Secondary.T;
OutletTemp := last.CoolantOutlet_Secondary.T;
deltaTemp := OutletTemp - InletTemp;
counter := counter + 1;
print ("Variation ", counter," :\n",
"The resulting power output ",
"with coolant inlet temperature of ",
last.CoolantInlet_Secondary.T, " \°C is: ",
last.GeneratorOutlet.Q, " kW. \n",
"Rise of coolant temperature is: ",
deltaTemp, " \°C.\n"
);
if CoolantTemp = 85.0 then
begin
print ("This is the end\n");
end;
end;
end.
Sollte ein Fehler in der Kompilierungszeit auftreten, erscheint eine Fehlermeldung wie hier unten zu sehen, und das Script wird nicht ausgeführt.
Diese Fehlermeldung besagt, dass in Zeile 19 eine ")" fehlt.
EbsScript Optionen
Alle Optionen wurden unter dem Menüpunkt "Extras" zusammengefasst.
Auf dem Blatt "Editor" können Einstellungen für die Ausgabe des EbsScriptes vorgenommen werden:
Compiler Optionen können mit dem Menü ”ExtrasàOptionen…” auf dem Blatt "Syntax" (innerhalb) eingestellt werden.
Mit aktivieren der Checkbox "Programmblock muss mit 'end.' abschließen" erwartet der EbsScript Compiler ein "end." am Ende eines Programmblock. Ist dies nicht der Falls generiert er eine Fehlermeldung (PASCAL Standard). Standardmäßig akzeptiert der EbsScript Compiler ”end;” ebenso.
Die Option "Reelle Zahl als Ergebnis von Integer-Divisionen" regelt, ob eine Division zweier Integerzahlen eine Reelle Zahl zurückgibt oder ein Integer.
Standardmäßig ist in PASCAL das Ergebnis einer Division zweier Integerzahlen eine Integerzahl. Da dies – insbesondere bei Verwendung in Vorgabefeldern – leicht zu unerwarteten Ergebnissen führt, besteht die Möglichkeit einzustellen, dass das Ergebnis einer Division zweier Integerzahlen eine reelle Zahl sein soll.
Diese Einstellung kann auch in den Allgemeinen Einstellungen\Fortgeschritten\EbsScript\ vorgenommen werden. Dort besteht auch die Möglichkeit, Warnungen im Falle einer Integerdivision zu aktivieren und zu deaktivieren. Standardmäßig sind die Warnungen aktiviert.
Compiler-Direktiven
Die Einstellungen des EbsScript-Compilers, die unter „Extras“ à „Optionen“ ausgewählt werden, können auch zur Laufzeit abgefragt oder geändert werden. Zu diesem Zweck gibt es die folgenden Compiler-Direktiven:
{$SBE(+)} / {$SBE(-)}: Programmblock muss mit "end." abschließen
{$SDR(+)} / {$SDR(-)}: Reelle Zahl als Ergebnis einer Integerdivision
{$SFR(+)} / {$SFR(-)}: Implizite Variable "result" in Funktionen
Wenn diese Direktive gesetzt ist, kann das Schlüsselwort „result“ als Synonym für den Funktionswert verwendet werden, insbesondere auch auf der rechten Seite einer Zuweisung.
Bei diesen Direktiven wird die jeweilige Option durch das Argument (+) aktiviert und durch (-) deaktiviert. Durch (show) kann man den aktuellen Status abfragen (die Ausgabe erscheint dann im Konsolenfenster). Durch (push) bzw. (pop) wird der aktuelle Zustand abgelegt bzw. wiederhergestellt. Mit leerem (push) kann man den aktuellen Zustand kopieren.
Für die Umstellung des Kontextes (um zum Beispiel beim Kompilieren in einen Makro-Kontext zu springen) gibt es die folgende Direktive:
{$CTC(„Text“)}: setzt den Compiler-Kontext auf text.
Kontextfreies Kompilieren:
Mit dem Pragma
Hinweis:
Reelle Zahlen als Ergebnis von Integer-Divisionen
Standardmäßig ist in PASCAL das Ergebnis einer Division zweier Integerzahlen eine Integerzahl. Da dies – insbesondere bei Verwendung in Vorgabefeldern – leicht zu unerwarteten Ergebnissen führt, besteht die Möglichkeit, im EbsScript-Editor unter „Extras“à „Optionen“, „Syntax“ einzustellen, dass das Ergebnis einer Division zweier Integerzahlen eine reelle Zahl sein soll.
Diese Einstellung kann auch in den allgemeinen Einstellungen unter „Fortgeschritten“ à„EbsScript“ vorgenommen werden. Dort besteht auch die Möglichkeit, Warnungen im Falle einer Integerdivision zu aktivieren und zu deaktivieren. Standardmäßig sind die Warnungen aktiviert.
Mit dem Blatt "Laufzeit" kann man einstellen, ob zur Laufzeit ein "Abbrechen"-Fenster angezeigt werden soll, um die Ausführung abbrechen zu können (wobei ein Abbrechen mit der Taste ESC immer möglich ist, auch wenn das "Abbrechen"-Fenster nicht angezeigt wird) und ob bei Beendigung des EbsScripts das Profil beibehalten werden soll, das im EbsScript eingestellt wurde (wenn es überhaupt verändert wurde), oder ob wieder das vor dem Aufruf aktive Profil aktiviert werden soll.
Parsen von Digraphen
Bei Digraphen handelt es sich um jeweils zwei Zeichen, die als ein zusammenhängendes Token verarbeitet werden.
Beispiele hierfür sind „:=“ (Zuweisung) und „<=“ (kleiner gleich).
In früheren Ebsilon-Versionen wurden zwei zueinander passende Zeichen auch dann als Digraph geparst, wenn sie durch sog. Whitespaces (Leerzeichen, Tabulatoren, Zeilenumbrüche) oder sogar Kommentare getrennt waren.
In Standard Pascal und auch Delphi ist dies nicht erlaubt, daher ist es das Ziel, in einer künftigen Ebsilon-Version Digraphen nur noch dann zu erkennen, wenn diese direkt hintereinanderstehen.
Um die Umstellung zu erleichtern, dürfen ab Release 16 Digraphen höchstens noch durch Whitespace voneinander getrennt sein (keine Kommentare mehr dazwischen erlaubt). Zudem MUSS der Digraph „::“ zusammenhängend geschrieben werden. Dies ist notwendig, um die Zeichenfolgen „::˽:“ und „:˽::“ unterscheiden zu können.
Des Weiteren gibt es im EbsScript-Editor unter „Extras->Optionen…->Syntax“ über die Einstellung „Relaxiertes Parsen von Digraphen“ die Möglichkeit, das Verhalten des Parsers zu ändern: Ist „Relaxiertes Parsen von Digraphen“ angeschaltet, dann darf Whitespace zwischen den Zeichen vorkommen, andernfalls nicht. Das Verhalten kann auch über das Pragma ${RDP(+)} bzw. ${RDP(-)} im Quellcode geändert werden.
Vordefinierte Kompilierzeit-Macros
Mit Release 16 werden Kompilierzeit-Macros eingeführt. Diese werden während des Kompilierens durch die jeweiligen Konstanten ersetzt, d.h. alle Werte werden zum Zeitpunkt der Kompilation bestimmt und ändern sich danach nicht mehr. Der Zugriffssyntax lautet:
$(Macroname)
Folgende vordefinierten Macros stehen zur Verfügung:
Macro |
Typ |
Beschreibung |
$(file) |
string |
Name der kompilierten Datei |
$(line) |
integer |
Aktuelle Zeilennummer |
$(date) |
string |
Aktuelles Datum (Zur Kompilation!) |
$(time) |
string |
Aktuelle Zeit (Zur Kompilation!) |
$(program) |
boolean |
Ist kompilierter Code ein Hauptprogram? |
$(unit) |
boolean |
Ist kompilierter Code eine Unit? |
$(subroutinename) |
string |
Name der kompilierten Funktion/Prozedur |
$(subroutinefullname) |
string |
Name der kompilierten Funktion/Prozedur mit Typbeschreibung („ function"/"procedure", Name, Argumentliste und Rückgabetyp) |
$(version) |
string |
Ebsilon-Version (z.B. 16.1.0.30567) |
$(versionmajor) |
integer |
Ebsilon-Release-Nummer (z.B. 16) |
$(versionpatch) |
integer |
Ebsilon-Patch-Nummer (z.B. 1) |
$(versionhotfix) |
integer |
Ebsilon-Hotfix-Nummer (z.B. 0) |
$(versionrevision) |
integer |
Ebsilon-Revisions-Nummer (z.B. 30567) |
$(counter) |
integer |
Zähler: startet bei 0 und erhöht sich bei jedem Aufruf um 1. |