|
|
Eine grobe Skizze wie ein Compiler Prinzipiell funktioniert:
| QuellText | Enthält den Code in einer Sprache oder Hochsprache als Text. |
| | |
| Frontend | Diese Compilerteile gehören zur Code-Analyse. Es können an verschiedenen stellen Codeoptimierungen durchgeführt werden um den Ausführbaren Code zu beschleunigen zB kann X ^ 2 durch X * X ersetzt werden da Multiplikationen viel schneller ausgeführt werden als Potenzen. |
| Scanner, Lexer | Schneidet den Code in Worte (Tokens) auf, und führt bereits eine einfache Syntaxprüfung durch. |
| Parser, Syntaxanalyse | Analysiert die Tokens und Ermittelt die Bedeutung jedes Wortes.
Dabei wird eine gründliche Syntaxprüfung durchgeführt, und es werden Codebäume erzeugt und eine Namensliste (Symboltable) erstellt welche Namen Typen und Namensräume (Namespace) enthält. |
| Zwischencode Generator | Erstellt aus dem Codebaum ein vorcompilierten Code vorzugsweise als eine Liste welcher bereits die gesamte Codestruktur enthält. Dieser Code ist interpretierbar ist aber noch nicht auf eine bestimmte Maschine compiliert. Ein Interpreter könnte den gleichen Zwischencode für verschiedene Hardware ausführen, da die Maschinencodes im Interpreter enthalten sind und nicht im Zwischencode. |
| | |
| Backend | Diese Compilerteile gehören zur Code-Generierung. Auch hier lassen sich Optimierungen durchführen durch Berücksichtigung der Lade- und Laufzeiten von Prozessorbefehlen. |
| Maschinencode Generator | Es wird ein Maschinencode erzeugt der von der Hardware ausgeführt werden kann. Vorzugsweise ist das ein Assembler Code (ASM) der die Prozessorbefehle als Text darstellt (Mnemonic). |
| ASM Compiler | Compiliert den ASM Code in ein Maschinenverständliches Binärformat um zB. OBJ Dateien. Für jedes Modul wird eine eigene OBJ Datei erzeugt. |
| Linker | Der Linker verbindet die OBJ Dateien dann zu einem Ausführbaren Binärformat welches vom Betriebssystem ausgeführt werden kann zB. EXE/DLL. |
|