Druckversion vom 05.05.2024 17:06 Uhr
Startseite Qualifikationsphase Theoretische Informatik Compilerbau
Compilerbau
Ein Compiler ist ein Übersetzer zwischen formalen Sprachen. Typischerweise übersetzt er aus einer höheren Programmiersprache (Fortran, C, Pascal, Java,...) in die Maschinensprache eines Computersystems. Eine solche Übersetzung findet immer statt, wenn man Programme ändert und testet. Der Übersetzungsvorgang gliedert sich in mehrere Schritte: |
Quelltext in einer Programmiersprache ↓ Scanner Tokenliste ↓ Parser Tokenliste (ggf. korrigiert) ↓ Übersetzer Zielsprache |
Scanner
Ein Scanner liest den Quelltext ein und zerlegt ihn in eine Folge von Sinneinheiten (Zahlen, Bezeichner, Operatoren, Schüsselworte). Er reicht eine Folge von solchen Sinneinheiten (sog. Token) an den Parser weiter. |
|
Parser
Ein Parser prüft die vom Scanner gelieferte Tokenfolge auf syntaktische Korrektheit, also darauf, ob es sich um ein Konstrukt (Wort, Satz) der Ausgangssprache handelt. Der Parser liefert als Anwort: korrekt oder nicht. |
|
Übersetzer
Je nach Anwendungsfall bzw. Zielsprache wird ein Programm in einer maschinennahen Sprache, in einem Zwischencode oder etwa ein Syntaxdiagramm erzeugt. |
Compiler oder Interpreter
Ein Interpreter untersucht den Quelltext und führt ihn dabei gleich aus; Beispiele sind etwa Javascript, PHP und Prolog. Interpreter sind bei der Softwareentwicklung vorteilhaft, weil das System meistens überschaubar ist und die Änderungen am Quelltext unmittelbar getestet werden können. Bei lange laufenden Programmen – insbesonderen mit vielen Schleifen – wird die Ausführung durch die immer wieder nötige Untersuchung der nächsten Quelltextpassage verlangsamt.
Bei einem Compiler wird der Quelltext komplett in die Maschinensprache des jeweiligen Systems übersetzt (Beispiele: C, C++ und Delphi). Nach der evtl. aufwendigen Kompilierung erfolgt die Ausführung ohne weiteren Ballast in der höchstmöglichen Geschwindigkeit. Das Kompilat ist allerdings nur für die jeweils benutzte Hardwareplattform geeignet. Bei einem anderen System (Win 32Bit, Win 64 Bit, Mac, Linux) muss der Quelltext neu kompiliert werden.
Die Unterschiede werden seit einigen Jahren geringer: Interpreter wie etwa die Browser im Hinblick auf Javascript compilieren beim Programmstart mal eben den Quelltext (Just In Time Compiler); die Rechner sind heute so schnell, dass bei den im Unterricht verwendeten Systemen (BlueJ, JavaEditor, …) das Compileren eines Programms ohne spürbare Wartezeit erfolgt.
Sonderfall Java
Programme in Maschinensprache, wie sie von einem Compiler erzeugt werden, sind immer nur auf einer bestimmten Systemplattform lauffähig: Windows 32, Windows 64, Mac, Linux, Android, IOS, … Damit in Java geschriebene Programme systemunabhängig sind und etwa über das Internet verteilt werden können („Applets“), wird dort eine andere Technik verwendet. Die Zielsprache beim Übersetzen ist ein Zwischencode (Java-Bytecode; class-Dateien). Auf dem Zielrechner muss Java installiert sein, genauer eine zum verwendeten Computersystem passende JVM (Java Virtual Machine); diese interpretiert den Bytecode und führt ihn dabei aus.
In der Praxis
Die Compiler (= Übersetzer) für Programmiersprachen sind nur ein Teil der in der Praxis verwendeten Übersetzer zwischen formalen Sprachen: Oft als Treiber oder Interface bezeichnet übersetzen sie zwischen der Ausgabe eines Systems und der Eingabe, die ein anderes System benötigt, z. B. : LibreOffice "liest" Dateien, die von Microsoft Office erstellt wurden, CAD - Programme produzieren G-Code, der von einer CNC-Maschine ausgeführt wird.