Dies ist die alte 4D Dokumentations-Website. Die neue und aktualisierte Dokumentation finden Sie unter developer.4d.com |
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
4D v20 R7
Compiler Direktiven
|
Boolean |
Datum |
Lange Ganzzahl |
Diagramm |
Zeit |
Bild |
Numerisch (oder Zahl) |
Zeiger |
Text |
BLOB |
Objekt |
Collection |
Variant |
Es gibt verschiedene Typen von Arrays:
Array Boolean |
Array Datum |
Array Ganzzahl |
Array Lange Ganzzahl |
Array Bild |
Array Zahl |
Array Zeit |
Array Objekt |
Array Zeiger |
Array BLOB |
Array Text |
Hinweise:
- Der Typ Objekt ist seit 4D v14 verfügbar.
- Der Typ Collection ist seit 4D v16 R4 verfügbar.
- Der Typ Variant ist ab 4D v18 verfügbar.
- Der frühere Typ Alpha (fester String) wird für Variablen nicht mehr verwendet. In vorhandenem Code wird er automatisch umgeleitet zum Typ Text. Die früheren Typen Ganzzahl und Diagramm werden für Variablen nicht mehr verwendet. In vorhandenem Code werden sie automatisch umgeleitet zu den Typen Lange Ganzzahl.
Im interpretierten Modus kann sich der Datentyp einer Variablen ändern. Das ist möglich, da der Code interpretiert und nicht kompiliert wird. 4D interpretiert jede Anweisung separat und versteht ihren Kontext.
Im kompiliertem Modus ist die Situation anders. Während die Interpretation Zeile für Zeile abläuft, betrachtet der Kompilierungsprozess die Datenbank in ihrer Gesamtheit.
Der Compiler arbeitet folgendermaßen:
Trifft der Compiler auf denselben Variablennamen für zwei unterschiedliche Datentypen, kann er keine Entscheidung treffen. Er muss nämlich, um ein Objekt zu typisieren und eine Speicheradresse zu vergeben, die exakte Kennung dieses Objekts wissen, d.h. Name und Datentyp. Der Compiler erstellt für jede kompilierte Datenbank eine Übersicht, die für jede Variable Name (oder Identifier) und Platzierung (oder Speicheradresse) sowie den gemäß dem Datentyp belegten Platz angibt. Diese Übersicht heißt Symboldatei. In den Einstellungen der Datenbank können Sie festlegen, ob diese Übersicht während dem Kompilieren in Form einer Textdatei angelegt werden soll.
Diese Übersicht wird auch für die automatische Erstellung von Compiler-Methoden verwendet.
Soll der Compiler die Typisierung Ihrer Variablen prüfen oder sie selbst typisieren, ist die Platzierung der Direktiven einfach. Sie können je nach Ihrer Arbeitsweise zwischen zwei Möglichkeiten wählen:
Werden Variablen über eine Compiler Direktive typisiert, erhalten sie einen Standardwert, den sie während der Sitzung beibehalten, solange sie nicht zugewiesen sind.
Der Standardwert richtet sich nach Variablentyp und -kategorie, Ausführungskontext (interpretiert oder kompiliert), und im kompilierten Modus nach den definierten Optionen auf der DOM Append XML child node der Datenbank-Eigenschaften:
Nachfolgende Tabelle zeigt diese Standardwerte:
Typ | Interprozess | Prozess | Lokal interpretiert | Lokal kompiliert "auf Null" | Lokal kompiliert "zufällig" | Lokal kompiliert "nicht" |
Boolean | False | False | False | False | True | True (variiert) |
Datum | 00-00-00 | 00-00-00 | 00-00-00 | 00-00-00 | 00-00-00 | 00-00-00 |
Lange Ganzzahl | 0 | 0 | 0 | 0 | 1919382119 | 909540880 (variiert) |
Diagramm | 0 | 0 | 0 | 0 | 1919382119 | 775946656 (variiert) |
Zeit | 00:00:00 | 00:00:00 | 00:00:00 | 00:00:00 | 533161:41:59 | 249345:34:24 (variiert) |
Bild | Bildgröße=0 | Bildgröße=0 | Bildgröße=0 | Bildgröße=0 | Bildgröße=0 | Bildgröße=0 |
Zahl | 0 | 0 | 0 | 0 | 1.250753659382e+243 | 1.972748538022e-217 (variiert) |
Zeiger | Nil=true | Nil=true | Nil=true | Nil=true | Nil=true | Nil=true |
Text | "" | "" | "" | "" | "" | "" |
Blob | Blobgröße=0 | Blobgröße=0 | Blobgröße=0 | Blobgröße=0 | Blobgröße=0 | Blobgröße=0 |
Objekt | null | null | null | null | null | null |
Collection | null | null | null | null | null | null |
Variant | Undefiniert | Undefiniert | Undefiniert | Undefiniert | Undefiniert | Undefiniert |
Compiler Direktiven sind in folgenden Fällen sinnvoll:
Außerdem sorgen Compiler Direktiven für eine Verringerung der Kompilierungszeit.
Manchmal kann der Compiler den Datentyp einer Variablen nicht bestimmen. Ist dies der Fall, generiert er eine entsprechende Fehlermeldung.
Es gibt drei Hauptgründe, die den Compiler den Datentyp nicht bestimmen lassen: Mehrfache Datentypen, Zweideutigkeit aufgrund einer gefolgerten Ableitung und keine Möglichkeit zur Bestimmung des Datentyps.
Mehrfache Datentypen
Hat eine Variable in den einzelnen Anweisungen unterschiedliche Datentypen, generiert der Compiler einen Fehler, der leicht zu beheben ist. Der Compiler wählt die zuerst gefundene Variable und weist deren Datentyp wilkürlich dem nächsten Auftreten der gleichnamigen Variablen mit einem anderen Datentyp zu. Hier ein einfaches Beispiel:
In Methode A
Variable:=True
In Methode B
Variable:="Der Mond ist rund"
Zweideutigkeit aufgrund einer gefolgerten Ableitung
In manchen Fällen kann der Compiler anhand des Ablaufs ableiten, dass der Typ des Objekts nicht geeignet ist. In diesem Fall müssen Sie die Variable explizit mit einer Compiler Direktiven typisieren. Es folgt ein Beispiel, das mit Standardwerten für ein aktives Objekt arbeitet:
Sie können in einem Formular für folgende Objekte Standardwerte zuweisen: Combo Boxen, PopUp Menüs, Registerkarten, DropDown Listen, Menü/DropDown Listen und rollbare Bereiche unter Verwendung der Schaltfläche Bearbeiten für die Liste Werte (in der Eigenschaftenliste unter dem Thema Eingabekontrollen). Weitere Informationen dazu finden Sie im Abschnitt Standardwerte des Handbuchs 4D Designmodus. Die Standardwerte werden automatisch in ein Array geladen, das denselben Namen wie das Objekt hat.
Wird das Objekt nicht in einer Methode verwendet, kann der Compiler den Typ eindeutig als Array vom Typ Text ableiten.
Muss jedoch eine Initialisierung der Anzeige durchgeführt werden, könnte die Sequenz folgendermaßen lauten:
Case of
:(FORM Event=On Load)
MyPopUp:=2
...
End case
In diesem Fall tritt die Zweideutigkeit ein––beim Analysieren der Methoden leitet der Compiler für das Objekt MyPopUp als Datentyp Zahl ab. In diesem Fall ist es notwendig, das Array in der Formular- oder einer Compiler-Methode explizit zu deklarieren:
Case of
:(FORM Event=On Load)
ARRAY TEXT(MyPopUp;2)
MyPopUp:=2
...
End case
Var1:=5.2(1)
Zeiger:=->Var1(2)
Var2:=Zeiger->(3)
Obwohl (2) den Variablentyp definiert, auf den der Zeiger zeigt, ist der Typ von Var2 nicht festgelegt. Der Compiler erkennt während der Kompilation zwar einen Zeiger, hat jedoch keine Möglichkeit, zu erkennen, auf welchen Variablentyp er zeigt. Deshalb kann er den Datentyp von Var2 nicht ableiten. Hier ist eine Compiler Direktive erforderlich, zum Beispiel C_REAL(Var2).
Befehle mit mehrfacher Syntax
Verwenden Sie eine Variable, der die Funktion Year of zugewiesen wurde, kann die Variable naturgemäß nur vom Typ Datum sein. Die Dinge liegen jedoch nicht immer so einfach. Nehmen wir folgendes Beispiel:
Der Befehl GET FIELD PROPERTIES lässt zwei Syntax-Arten zu:
GET FIELD PROPERTIES(TabelleNum;FeldNum;Typ;Länge;Indiziert)
GET FIELD PROPERTIES(FeldPtr;Typ;Länge;Indiziert)
Bei einem Befehl mit mehrfacher Syntax kann der Compiler nicht erraten, welche Syntax und Parameter Sie gewählt haben. Hier müssen Sie Compiler Direktiven einsetzen, um die im Befehl übergebenen Variablen zu typisieren, wenn diese nicht bereits an anderer Stelle in der Datenbank aufgrund ihrer Verwendung typisiert wurden.
Befehle mit optionalen Parametern mit unterschiedlichen Datentypen
Bei einem Befehl mit mehreren optionalen Parametern mit unterschiedlichen Datentypen kann der Compiler nicht bestimmen, welcher optionale Parameter verwendet wurde. Nehmen wir folgendes Beispiel:
Der Befehl GET LIST ITEM lässt zwei optionale Parameter zu; den ersten als Lange Ganzzahl, den zweiten als Boolean.
Der Befehl kann verwendet werden in Form von:
GET LIST ITEM(Liste;EintragPos;EintragRef;EintragText;Unterliste;Erweitert)
oder in Form von
GET LIST ITEM(Liste;EintragPos;EintragRef;EintragText;Erweitert)
Hier müssen Sie Compiler Direktiven einsetzen, um die im Befehl übergebenen optionalen Variablen zu typisieren, wenn diese nicht bereits an anderer Stelle in der Datenbank aufgrund ihrer Verwendung typisiert wurden.
Über URL aufgerufene Methoden
Schreiben Sie 4D Methoden, die über eine URL aufgerufen werden müssen und verwenden Sie nicht $1 in der Methode, müssen Sie die Textvariable $1 explizit mit folgender Sequenz deklarieren:
C_TEXT($1)
In der Tat kann der Compiler nicht feststellen, ob die 4D Methode über eine URL aufgerufen wird.
Sind alle in der Datenbank vorkommenden Variablen explizit deklariert, muss der Compiler die Typisierung nicht überprüfen. In diesem Fall können Sie in den Einstellungen der Datenbank definieren, dass der Compiler nur die Übersetzung der Methode vornimmt. Das spart mindestens 50% an Zeit für die Kompilierung.
Über Compiler Direktiven können Sie Ihre Methoden beschleunigen. Weitere Informationen dazu finden Sie im Abschnitt Tipps zur Optimierung. Nehmen wir an, Sie müssen einen Zähler über eine lokale Variable erhöhen. Deklarieren Sie die Variable nicht, geht der Compiler vom Typ Zahl aus. Deklarieren Sie die Variable als Lange Ganzzahl, arbeitet die kompilierte Datenbank effizienter. Auf einem Rechner beansprucht der Typ Zahl 8 Bytes, deklarieren Sie den Zähler als Lange Ganzzahl, benötigt er nur 4 Bytes. Das Hochzählen eines 8-Byte Zählers dauert also länger als das eines 4-Byte Zählers.
Compiler Direktiven lassen sich auf zwei Arten verwalten, je nachdem ob der Compiler Ihre Variablen typisieren soll oder nicht.
Der Compiler muss die Kriterien zum Erkennen von Variablen beachten.
Es gibt zwei Möglichkeiten:
1) Wurden die Variablen nicht typisiert, kann der Compiler das automatisch erledigen. Er bestimmt nach Möglichkeit, d.h. solange keine Zweideutigkeit vorliegt, den Typ der Variablen, nach der Art ihrer Verwendung. Schreiben Sie z.B.
V1:=True
bestimmt der Compiler für die Variable V1 als Datentyp Boolean.
Schreiben Sie:
V2:="Dies ist ein einfacher Satz"
bestimmt der Compiler für die Variable V2 als Datentyp Text.
Der Compiler kann den Datentyp einer Variablen auch in nicht so klaren Situationen bestimmen:
V3:=V1 `V3 ist vom selben Typ wie V1
V4:=2*V2 `V4 ist vom selben Typ wie V2
Der Compiler bestimmt den Datentyp Ihrer Variablen auch über Aufrufe von 4D Befehlen und über Ihre Methoden. Übergeben Sie z.B. in einer Methode einen Parameter vom Typ Boolean und einen vom Typ Datum, weist der Compiler in der aufgerufenen Methode den lokalen Variablen $1 und $2 die Typen Boolean und Datum zu.
Bestimmt der Compiler den Datentyp durch Schlussfolgerung, weist er nie die eingrenzenden Typen Ganzzahl, Lange Ganzzahl oder Text zu, sondern standardmäßig immer den größtmöglichen Typ. Schreiben Sie z.B.:
Nummer:=4
weist der Compiler als Datentyp Zahl zu, obwohl 4 eine Ganzzahl ist. Dadurch kann der Wert in einem anderen Zusammenhang auch den Wert 4,5 haben.
Ist es sinnvoll, eine Variable als Ganzzahl, Lange Ganzzahl oder Text zu typisieren, können Sie eine Compiler Directive verwenden. Der Vorteil dabei ist, dass diese Datentypen weniger Speicher belegen und Operationen damit rascher ablaufen.
Haben Sie Ihre Variablen typisiert und sind Sie sicher, dass Ihre Typisierung kohärent und vollständig ist, können Sie in den Einstellungen zum Kompilieren explizit festlegen, dass der Compiler diese Arbeit nicht mehr ausführen muss. Sollte Ihre Typisierung nicht hundertprozentig richtig sein, meldet der Compiler beim Kompilieren Fehler und nennt die erforderlichen Änderungen.
2) Über Befehle der Compiler Direktiven können Sie explizit die in Ihrer Datenbank verwendeten Variablen deklarieren.
Sie werden folgendermaßen verwendet:
C_BOOLEAN(Var)
Solche Direktiven sagen dem Compiler, dass er eine Variable Var mit dem Typ Boolean anlegen soll. Eine Anwendung mit Compiler Direktiven erleichtert die Arbeit des Compilers und vermeidet Vermutungen. Eine Compiler Direktive hat Vorrang vor Ableitungen, die auf Anweisungen oder der Verwendungsart beruhen. Variablen, die mit der Compiler Direktive _o_C_INTEGER definiert wurden, sind in der Tat dasselbe wie Variablen mit der Compiler Direktive _O_C_LONGINT. Das sind in beiden Fällen Lange Ganzzahlen zwischen –2147483648 und +2147483647.
Soll der Compiler Ihre Typisierung nicht prüfen, müssen Sie ihm einen Code vorgeben, um die Compiler Direktiven zu identifizieren.
Die Konvention ist folgende:
Compiler Direktiven für Prozess- und Interprozessvariablen und die Parameter sollten in einer oder mehreren Methoden gesetzt werden. Ihr Name muss mit dem Schlüsselwort Compiler beginnen.
Sie können mit dem Compiler standardmäßig fünf Arten von Compilermethoden generieren. Das sind die Direktiven für Variablen, Arrays und Methodenparameter. Weitere Informationen dazu finden Sie im Abschnitt des Handbuchs 4D Designmodus.
Hinweis: Die Syntax zum Deklarieren dieser Parameter lautet:
Direktive (MethodenName;Parameter). Sie lässt sich nicht im interpretierten Modus ausführen.
Besondere Parameter
C_LONGINT($0)
If(FORM Event=On Drag Over)
$0:=0
...
If($DataType=Is picture)
$0:=-1
End if
...
End if
Compiler Direktiven entfernen jede Zweideutigkeit bei Datentypen. Auch wenn eine gewisse Striktheit notwendig ist, muss das nicht heißen, dass der Compiler überhaupt keine Inkonsistenz toleriert.
Weisen Sie zum Beispiel einer Variablen, die als Ganzzahl deklariert wurde, einen Wert vom Typ Zahl zu, sieht der Compiler keinen Typkonflikt und weist die Werte gemäß Ihren Direktiven zu. Wenn Sie also schreiben:
C_LONGINT(vInteger)
vInteger:=2.6
betrachtet der Compiler das nicht als Konflikt des Datentyps, der eine Kompilierung verhindert; vielmehr rundet er einfach auf den nächstgelegenen Wert auf (3 anstatt 2.6).
Einzelheiten zur Syntax
Fehlermeldungen
Richtlinien zur Typisierung
Tipps zur Optimierung
Produkt: 4D
Thema: Compiler
4D Programmiersprache ( 4D v20 R7)