Ein Compiler ist ein Programm, das von Menschen lesbaren Quellcode in computerausführbaren Maschinencode übersetzt. Damit dies erfolgreich durchgeführt werden kann, muss der lesbare Code den Syntaxregeln der Programmiersprache entsprechen, in der er geschrieben ist. Der Compiler ist nur ein Programm und kann Ihren Code nicht für Sie reparieren. Wenn Sie einen Fehler machen, müssen Sie die Syntax korrigieren, sonst wird sie nicht kompiliert.
Die Komplexität eines Compilers hängt von der Syntax der Sprache und der Abstraktion ab, die diese Programmiersprache bietet. Ein C-Compiler ist viel einfacher als ein Compiler für C ++ oder C #.
Beim Kompilieren liest der Compiler zuerst einen Zeichenstrom aus einer Quellcodedatei und generiert einen Strom lexikalischer Token. Zum Beispiel der C ++ Code:
int C = (A · B) +10;
könnte wie folgt analysiert werden:
Die lexikalische Ausgabe geht an den syntaktischen Analyseteil des Compilers, der anhand der Grammatikregeln entscheidet, ob die Eingabe gültig ist oder nicht. Sofern die Variablen A und B nicht zuvor deklariert wurden und sich im Gültigkeitsbereich befanden, könnte der Compiler Folgendes sagen:
Wenn sie deklariert, aber nicht initialisiert wurden. Der Compiler gibt eine Warnung aus:
Sie sollten Compiler-Warnungen niemals ignorieren. Sie können Ihren Code auf seltsame und unerwartete Weise brechen. Korrigieren Sie immer Compiler-Warnungen.
Einige Programmiersprachen sind so geschrieben, dass ein Compiler den Quellcode nur einmal lesen und den Maschinencode generieren kann. Pascal ist eine solche Sprache. Viele Compiler benötigen mindestens zwei Durchgänge. Manchmal liegt es an Forward-Deklarationen von Funktionen oder Klassen.
In C ++ kann eine Klasse deklariert, aber erst später definiert werden. Der Compiler kann nicht herausfinden, wie viel Speicher die Klasse benötigt, bis der Hauptteil der Klasse kompiliert ist. Der Quellcode muss erneut gelesen werden, bevor der richtige Maschinencode generiert wird.
Unter der Annahme, dass der Compiler die lexikalischen und syntaktischen Analysen erfolgreich abschließt, wird im letzten Schritt Maschinencode generiert. Dies ist insbesondere bei modernen CPUs ein komplizierter Vorgang.