Was ist ein
F-Script Block?
Als F-Script Block bezeichnet man einen
Code-Bereich in einem F-Script, welcher zur Laufzeit kompiliert und nicht
wie ein klassisches F-Script interpretiert wird.
F- Script Blöcke
werden durch die Zeichen { sowie } begrenzt. Hierbei ist es
wichtig, dass diese jeweils am Anfang der Zeile stehen, damit der Compiler
diese von klassischem F-Script unterscheiden
kann.
Beispiel
/Example.ScriptBlock
# ---------------------------------------------------------------------
# Normaler F-Script Kommentar
«
{
// Kommentar in Script-Block
}
»
/
 |
Wichtig
F-Script Blöcke sind immer final. Dies
bedeutet, dass der Inhalt einer Variablen nicht weiter analysiert wird,
wie dies bei klassischem F-Script der Fall ist.
|
Warum F-Script
Blöcke?
F-Script wurde vor über 30 Jahren als Sprache zu Insyde
implementiert, welche von einem Interpreter zur Laufzeit Zeile für Zeile
abgearbeitet wird.
Dies hat unter anderem den Vorteil, dass Abläufe
schnell implementiert und nachvollzogen werden können. F-Script setzt
somit keine grundlegenden Kenntnisse über Programmiersprachen
voraus…
Jedoch hat dies auch einige grundlegende
Nachteile:
Der «overhead» (Speicherbedarf / Laufzeitbedarf) einer
Script-/Interpreter-Sprache ist nicht unbeachtlich und steigt linear je
mehr Schleifen oder Typenumwandlungen gemacht werden müssen.
Zudem
muss jeder Befehl innerhalb einer F-Script Zeile explizit geparsed und
evaluiert werden. Dies führt ebenfalls zu einer langsameren Ausführung als
man von modernen Sprachen heute gewöhnt ist.
Der primäre Fokus
(damals) waren Ausgaben auf Matrix-Drucker. Deshalb wurde damals von
Flexform (flexibles Formular) gesprochen.
Früher waren Datenmengen
und auch die Scripts deutlich kleiner und die Laufzeit noch kein
wirkliches Problem.
In Zeiten, welche von Begriffen wie Big-Data und
Digitalisierung gezeichnet sind steigen natürlich auch die Anforderungen
an Datenmengen und Verarbeitungszeiten.
Ziele von
F-Script Blöcken
Durch die schrittweise Migration von Dataflex
auf .NET stehen modernere (und bessere) Möglichkeiten zur Verfügung, um
F-Script in Zukunft weiterzuentwickeln.
Die Ziele sind:
-
Performance (wie bereits erwähnt)
-
Usability (Anwendbarkeit und Lesbarkeit)
-
Type Safety
-
Error-Verhalten (viele Fehler bereits zur Kompilationszeit
erkannt)
-
Security (keine Code-Injection möglich „by design“)
 |
Notiz
Beachten Sie, dass für F-Script Blöcke im Editor VS Code
eine entsprechende Extension "Opacc BlockScript" zur Verfügung
steht.
|
Vergleich: Klassisches
F-Script vs. F-Script Blöcke
Nachfolgend ein Vergleich welcher
den Unterschied von klassischem F-Script und F-Script Blöcken
aufzeigt:
Folgender Code führt eine klassische «REPEAT/LOOP»
Schleife mit 10'000 Durchläufen aus. Innerhalb dieser Schleife
wird nichts getan.
Der F-Script Interpreter merkt sich nun
die Position von «REPEAT(1)» und springt jeweils wieder dorthin
solange die Bedingung vor «LOOP(1)» zutrifft.
|
Folgender Code führt eine for-Schleife mit 10'000
Durchläufen aus. Innerhalb dieser Schleife wird nichts
getan.
F-Script Blöcke werden «onthefly» kompiliert und
nicht im F-Script Interpreter, sondern auf Seite .NET-Framework
ausgeführt.
|
 |
 |
Laufzeit (hh:mm:ss.msec)
00:00:03.743
|
Laufzeit (hh:mm:ss.msec)
00:00:00.141
|
Unterschiede:
Klassisches F-Script vs. F-Script
Blöcke
Performance
F-Script Blöcke werden nicht
interpretiert, sondern vorab «onthefly» kompiliert. Dies führt bei der
Ausführung des F-Script Codes zu einer besseren Performance.
 |
Wichtig
Hiermit ist nicht die Ausführungszeit z.B. eines
Requests gemeint, sondern primär die Ausführung des Codes an
sich.
|
An bekannten Sprachen angelehnte
Syntax
F-Script ist eine selbsterfundene (und zudem über
30-jährige) Script-Sprache.
Der Code innerhalb eines F-Script Blocks
lehnt sich an aktuelle Sprachen, wodurch sich Personen mit Vorkenntnissen
in Sprachen wie JavaScript oder C# schnell
zurechtfinden.
Lesbarkeit
Klassisches F-Script besitzt
eine möglichst kompakte und dadurch teils schwer lesbare Syntax. Dies ist
- soweit wie möglich - für die Verarbeitung eines Interpreters
optimiert.
Bei F-Script Blöcken führt die klar definierte Syntax und
die Strukturierungsmöglichkeiten zu besserer Lesbarkeit (readability) und
Wartbarkeit (maintainability) des Codes.
Lokale Variablen (local
typed vars)
Innerhalb F-Script Blöcken stehen so genannte
local typed vars zur Verfügung, welche einen klaren Datentyp
(string, integer, number, date, boolean)
aufweisen.
Voraussetzungen
Um korrekt und effizient mit
F-Script Blöcken arbeiten zu können, wird Erfahrung in einer Sprache, wie
z.B. JavaScript oder C# vorausgesetzt. Um den kompletten Umfang und alle
Möglichkeiten ausschöpfen zu können ist intensives Selbststudium
notwendig.
Komplexität
Durch die Fülle an zusätzlichen
Möglichkeiten, und daraus resultierend möglichen Fehlern, steigt die
Komplexität von F-Script.
Aufwand
Um ein Script mittels
F-Script Blöcken zu codieren ist initial mit höherem (zeitlichem) Aufwand
zu rechnen.
Type-Casting
In klassischem F-Script Code
besitzen Variablen keine Typisierung (alles Strings) und müssen lediglich
zur Berechnung und/oder Ausgabe formatiert werden (\A, \N, \D
usw.).
In F-Script Blöcken sind Variablen typisiert, wodurch Casting
zwingend zu beachten ist.
Technische Voraussetzungen
Damit in
einem F-Script Script Blöcke enthalten sein dürfen (und diese auch korrekt
ausgeführt werden) sind folgende Voraussetzungen gegeben:
-
OpaccOXAS Version
F-Script Blöcke stehen ab
OpaccOXAS Version 16.20.07 zur Verfügung.
-
Abbruch bei Fehler (Insyde.ScriptStopOnError)
Die
Einstellung Abbruch bei Fehlern im OpaccOXAS Studio BC 98216
muss aktiviert sein.
Sollte diese Einstellung nicht aktiviert
sein, kann dies optional im Script direkt über folgenden Befehl
aktiviert werden:
# Setzt zur Laufzeit des F-Scripts den Abbruch im Fehlerfall auf true/ja.
# Die Einstellung gilt auch für allfällig aufgerufene Sub-Scripts.
«nXCNT(scriptStopOnError=1)»
Ist diese Einstellung nicht korrekt wird folgender Fehler
geworfen:
ReadNextInterpreterLine:
#17 Compiler-Blocks not supported (Ensure that 'ScriptStopOnError=1').
Knowhow
Voraussetzungen
Um F-Script Blöcke sinnvoll anwenden zu können
sind folgende Vorkenntnisse notwendig:
-
Fundierte Kenntnisse über klassisches F-Script
-
ScriptingFollowUp 001 - Services Allgemein
(Selbststudium)
-
ScriptingFollowUp 005 - F-Script Meta-Informationen
(Selbststudium)
-
Kenntnisse Programmiersprache (JavaScript, C# o.Ä.)