Hinweis: Dies ist die vollständige deutsche Übersetzung des Kapitels. Codebeispiele und Diagramme sind sprachunabhängig gültig.
Im Zentrum von Harbour befindet sich eine leistungsfähige virtuelle Maschine (VM), die – gemeinsam mit dem Compiler – den Sourcecode in portable, effiziente Anwendungen umwandelt. Dieses Kapitel erklärt die Hauptbestandteile dieser Architektur.
Der Harbour-Compiler (harbour.exe
) ist ein Preprozessor und Übersetzer, der:
.prg
) analysiert.c
-Dateien verpackt.exe
oder einem Binärprogramm kompilieren lässtDieses zweistufige Kompilieren über C macht Harbour extrem portabel.
graph TD;
subgraph "Schritt 1: Kompilieren mit Harbour"
A[.prg Sourcecode] --> B{Harbour Compiler};
B --> C[P-Code → C];
C --> D[C-Datei (.c)];
end
subgraph "Schritt 2: Kompilieren mit C-Compiler"
D --> E{C-Compiler (GCC, Clang...)};
F[Harbour-Libs (VM, RTL, RDDs)] --> E;
end
E --> G[Ausführbare Anwendung (.exe)];
Die VM von Harbour:
graph TD;
subgraph "Harbour-VM"
A[P-Code Executor]
B[Speicher-Manager
(GC)]
C[Stack-Verwaltung]
D[Dynamisches Typ-System]
end
E[Harbour-Programm] --> A;
A --> C;
A --> B;
A --> D;
A --> F[Datenschicht (RDD)];
Harbour-Programme werden in eine interne, kompakte Zwischensprache übersetzt: den **P-Code**.
Beispiel:
nErgebnis := (nWert1 + nWert2) * 2
→ Entspricht konzeptionell folgendem P-Code:
PUSHSYM
– Symbol (z. B. nWert1
) ladenPUSHVAR
– Wert lesenADD
, MULTIPLY
POPVAR
– Ergebnis zurückschreibenDer Compiler führt bereits zur Compile-Zeit Optimierungen durch (z. B. Konstantenberechnung).
Jeder Funktionsaufruf erzeugt einen Stack-Frame:
LOCAL
-Variablen wird reserviertRETURN
: alles wird wieder entfernt
sequenceDiagram
participant Aufrufer
participant Stack
participant Funktion
Aufrufer->>Stack: Parameter pushen
Aufrufer->>Stack: Rücksprungadresse pushen
Aufrufer->>Funktion: Lokale Variablen aktivieren
Funktion-->>Stack: Rückgabewert pushen
Funktion-->>Aufrufer: Rücksprung
Aufrufer->>Stack: Rückgabewert lesen
Aufrufer->>Stack: Stack säubern
Dank dieser Technik sind verschachtelte und rekursive Aufrufe sicher und speichereffizient.