Was ist ein Code-Compiler und was macht er?

click fraud protection

EIN Compiler ist ein Programm das übersetzt menschlich lesbar Quellcode in computerausführbaren Maschinencode. Um dies erfolgreich durchzuführen, muss der für Menschen lesbare Code den Anforderungen entsprechen Syntax Regeln der Programmiersprache, in der sie 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 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 von lexikalischen Token. Zum Beispiel der C ++ - Code:

int C = (A * B) +10;

könnte wie folgt analysiert werden:

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

Syntaktische Analyse

Die lexikalische Ausgabe geht an den Teil des syntaktischen Analysators des Compilers, der anhand der Grammatikregeln entscheidet, ob die Eingabe gültig ist oder nicht. Es sei denn Variablen A und B wurden zuvor deklariert und waren im Geltungsbereich, könnte der Compiler sagen:

  • 'A': nicht deklarierter Bezeichner.

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 erfordern mindestens zwei Durchgänge. Manchmal liegt es an Vorwärtserklärungen von Funktionen oder Klassen.

In C ++ kann eine Klasse deklariert, aber erst später definiert werden. Der Compiler kann erst herausfinden, wie viel Speicher die Klasse benötigt, wenn er den Hauptteil der Klasse kompiliert. 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 in der letzten Phase Maschinencode generiert. Dies ist insbesondere bei modernen CPUs ein komplizierter Prozess.

Die Geschwindigkeit der kompilierten ausführbar Der Code sollte so schnell wie möglich sein und kann je nach Qualität des generierten Codes und der angeforderten Optimierung erheblich variieren.

Bei den meisten Compilern können Sie den Umfang der Optimierung angeben. Dies ist normalerweise für das schnelle Debuggen von Kompilierungen und die vollständige Optimierung des freigegebenen Codes bekannt.

Die Codegenerierung ist eine Herausforderung

Der Compiler-Writer steht beim Schreiben eines Codegenerators vor Herausforderungen. Viele Prozessoren beschleunigen die Verarbeitung mithilfe von

  • Anleitung Pipelining
  • Intern Caches.

Wenn alle Anweisungen innerhalb eines Codes Schleife kann in der gehalten werden Zentralprozessor Cache, dann läuft diese Schleife viel schneller als wenn die CPU Anweisungen aus dem Haupt-RAM abrufen muss. Der CPU-Cache ist ein in den CPU-Chip integrierter Speicherblock, auf den viel schneller zugegriffen wird als auf Daten im Haupt-RAM.

Caches und Warteschlangen

Die meisten CPUs haben eine Pre-Fetch-Warteschlange, in der die CPU Anweisungen in den Cache liest, bevor sie ausgeführt werden. Wenn eine bedingte Verzweigung auftritt, muss die CPU die Warteschlange neu laden. Der Code sollte generiert werden, um dies zu minimieren.

Viele CPUs haben separate Teile für:

  • Ganzzahlige Arithmetik (ganze Zahlen)
  • Gleitkomma-Arithmetik (Bruchzahlen)

Diese Vorgänge können häufig parallel ausgeführt werden, um die Geschwindigkeit zu erhöhen.

Compiler generieren normalerweise Maschinencode in Objektdateien, die es dann sind verknüpft zusammen durch ein Linkerprogramm.

instagram story viewer