Definition und Zweck eines Compilers

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.

Was passiert, wenn Sie Code kompilieren??

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 #.

Lexikalische Analyse

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:

  • tippe "int"
  • Variable "C"
  • gleich
  • linke Klammer
  • Variable "A"
  • mal
  • Variable "B"
  • rechte Klammer
  • Plus
  • wörtlich "10"

Syntaktische Analyse

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:

  • 'A': nicht deklarierte Kennung.

Wenn sie deklariert, aber nicht initialisiert wurden. Der Compiler gibt eine Warnung aus:

  • lokale Variable 'A' wird verwendet, ohne initialisiert zu werden.

Sie sollten Compiler-Warnungen niemals ignorieren. Sie können Ihren Code auf seltsame und unerwartete Weise brechen. Korrigieren Sie immer Compiler-Warnungen.

Ein Pass oder zwei?

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.

Maschinencode generieren

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.