Compiler Design - Übersicht
Computer sind eine ausgewogene Mischung aus Software und Hardware. Hardware ist nur ein mechanisches Gerät und seine Funktionen werden von einer kompatiblen Software gesteuert. Hardware versteht Anweisungen in Form von elektronischer Ladung, die das Gegenstück zur Binärsprache in der Softwareprogrammierung ist. Die Binärsprache hat nur zwei Alphabete, 0 und 1. Zum Anweisen müssen die Hardware-Codes im Binärformat geschrieben werden, das einfach eine Reihe von Einsen und Nullen ist. Es wäre eine schwierige und umständliche Aufgabe für Computerprogrammierer, solche Codes zu schreiben, weshalb wir Compiler haben, um solche Codes zu schreiben.
Sprachverarbeitungssystem
Wir haben gelernt, dass jedes Computersystem aus Hardware und Software besteht. Die Hardware versteht eine Sprache, die Menschen nicht verstehen können. Deshalb schreiben wir Programme in einer Hochsprache, die für uns leichter zu verstehen und zu merken ist. Diese Programme werden dann in eine Reihe von Tools und Betriebssystemkomponenten eingespeist, um den gewünschten Code zu erhalten, der von der Maschine verwendet werden kann. Dies ist als Sprachverarbeitungssystem bekannt.
Die Hochsprache wird in verschiedenen Phasen in eine Binärsprache umgewandelt. EINcompilerist ein Programm, das Hochsprache in Assemblersprache konvertiert. Ebenso einassembler ist ein Programm, das die Assemblersprache in eine Sprache auf Maschinenebene konvertiert.
Lassen Sie uns zunächst verstehen, wie ein Programm mit dem C-Compiler auf einem Host-Computer ausgeführt wird.
Der Benutzer schreibt ein Programm in der Sprache C (Hochsprache).
Der C-Compiler kompiliert das Programm und übersetzt es in ein Assembler-Programm (Low-Level-Sprache).
Ein Assembler übersetzt dann das Assemblerprogramm in Maschinencode (Objekt).
Ein Linker-Tool wird verwendet, um alle Teile des Programms zur Ausführung miteinander zu verknüpfen (ausführbarer Maschinencode).
Ein Loader lädt alle in den Speicher und dann wird das Programm ausgeführt.
Bevor wir uns direkt mit den Konzepten von Compilern befassen, sollten wir einige andere Tools verstehen, die eng mit Compilern zusammenarbeiten.
Präprozessor
Ein Präprozessor, der im Allgemeinen als Teil des Compilers betrachtet wird, ist ein Tool, das Eingaben für Compiler erzeugt. Es befasst sich mit Makroverarbeitung, Erweiterung, Dateieinbeziehung, Spracherweiterung usw.
Dolmetscher
Ein Interpreter übersetzt wie ein Compiler eine Hochsprache in eine Maschinensprache auf niedriger Ebene. Der Unterschied liegt in der Art und Weise, wie sie den Quellcode oder die Eingabe lesen. Ein Compiler liest den gesamten Quellcode auf einmal, erstellt Token, überprüft die Semantik, generiert Zwischencode, führt das gesamte Programm aus und kann viele Durchgänge umfassen. Im Gegensatz dazu liest ein Interpreter eine Anweisung aus der Eingabe, konvertiert sie in einen Zwischencode, führt sie aus und nimmt dann die nächste Anweisung nacheinander auf. Wenn ein Fehler auftritt, stoppt ein Interpreter die Ausführung und meldet ihn. Ein Compiler liest das gesamte Programm, auch wenn mehrere Fehler auftreten.
Assembler
Ein Assembler übersetzt Assembler-Programme in Maschinencode. Die Ausgabe eines Assemblers wird als Objektdatei bezeichnet, die eine Kombination von Maschinenanweisungen sowie die Daten enthält, die zum Speichern dieser Anweisungen im Speicher erforderlich sind.
Linker
Linker ist ein Computerprogramm, das verschiedene Objektdateien verknüpft und zusammenführt, um eine ausführbare Datei zu erstellen. Alle diese Dateien wurden möglicherweise von separaten Assemblern kompiliert. Die Hauptaufgabe eines Linkers besteht darin, referenzierte Module / Routinen in einem Programm zu suchen und zu lokalisieren und den Speicherort zu bestimmen, an dem diese Codes geladen werden, so dass die Programmanweisung absolute Referenzen enthält.
Lader
Loader ist Teil des Betriebssystems und dafür verantwortlich, ausführbare Dateien in den Speicher zu laden und auszuführen. Es berechnet die Größe eines Programms (Anweisungen und Daten) und schafft Speicherplatz dafür. Es initialisiert verschiedene Register, um die Ausführung zu initiieren.
Cross-Compiler
Ein Compiler, der auf Plattform (A) ausgeführt wird und ausführbaren Code für Plattform (B) generieren kann, wird als Cross-Compiler bezeichnet.
Source-to-Source-Compiler
Ein Compiler, der den Quellcode einer Programmiersprache in den Quellcode einer anderen Programmiersprache übersetzt, wird als Source-to-Source-Compiler bezeichnet.