Computerwissenschaften

Was ist ein Code-Compiler und was macht er?

Ein Compiler ist ein Programm. das lesbaren Quellcode in computerausführbaren Maschinencode übersetzt. Um dies erfolgreich durchzuführen, muss der für Menschen 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. Der AC-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“

 

Syntaktische Analyse

Die lexikalische Ausgabe geht an den syntaktischen Analysator des Compilers, der anhand der Grammatikregeln entscheidet, ob die Eingabe gültig ist oder nicht. Sofern die Variablen. und B nicht zuvor deklariert wurden und sich im Gültigkeitsbereich befanden, 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 benötigen mindestens zwei Durchgänge. Manchmal liegt es an Vorwärtsdeklarationen 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 des kompilierten ausführbaren Codes 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 – normalerweise bekannt für schnelles Debuggen von Kompilierungen und vollständige Optimierung für den freigegebenen Code.

 

Die Codegenerierung ist eine Herausforderung

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

  • Anleitung Pipelining
  • Interne Caches .

Wenn alle Anweisungen innerhalb einer Codeschleife können in der statt CPU. Cache, dann läuft die Schleife sehr viel schneller , als wenn die CPU Befehle aus dem Haupt – RAM zu holen ist. 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 dann von einem Linkerprogramm miteinander verknüpft werden.

Similar Posts

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.