Kompilierungsprozess in c
Was ist eine Kompilierung?
Bei der Kompilierung wird der Quellcode in Objektcode konvertiert. Dies geschieht mit Hilfe des Compilers. Der Compiler überprüft den Quellcode auf syntaktische oder strukturelle Fehler, und wenn der Quellcode fehlerfrei ist, generiert er den Objektcode.
Der c-Kompilierungsprozess konvertiert den als Eingabe verwendeten Quellcode in den Objektcode oder Maschinencode. Der Kompilierungsprozess kann in vier Schritte unterteilt werden, d.h., Vorverarbeitung, Kompilieren, Zusammenbauen und Verbinden.
Der Präprozessor nimmt den Quellcode als Eingabe und entfernt alle Kommentare aus dem Quellcode. Der Präprozessor nimmt die Präprozessordirektive und interpretiert sie. Zum Beispiel, wenn <stdio.h>, die Direktive ist im Programm verfügbar, dann interpretiert der Präprozessor die Direktive und ersetzt diese Direktive durch den Inhalt des ‘stdio.h’ Datei.
Im Folgenden sind die Phasen aufgeführt, die unser Programm durchläuft, bevor es in eine ausführbare Form umgewandelt wird:
- Präprozessor
- Compiler
- Assembler
- Linker
Präprozessor
Der Quellcode ist der Code, der in einem Texteditor geschrieben wird, und der Quellcode ist der datei erhält eine Endung “.c”. Dieser Quellcode wird zuerst an den Präprozessor übergeben, und dann erweitert der Präprozessor diesen Code. Nach dem Erweitern des Codes wird der erweiterte Code an den Compiler übergeben.
Compiler
Der vom Präprozessor erweiterte Code wird an den Compiler übergeben. Der Compiler konvertiert diesen Code in Assemblercode. Oder wir können sagen, dass der C-Compiler den vorverarbeiteten Code in Assemblercode konvertiert.
Assembler
Der Assemblercode wird mithilfe eines Assemblers in Objektcode konvertiert. Der Name der vom Assembler generierten Objektdatei entspricht der Quelldatei. Die Erweiterung der Objektdatei in DOS ist ‘.obj,’ und in UNIX ist die Erweiterung ‘o’. Wenn der Name der Quelldatei ‘hello.c’, dann wäre der Name der Objektdatei ‘Hallo.obj’.
Linker
Hauptsächlich verwenden alle in C geschriebenen Programme Bibliotheksfunktionen. Diese Bibliotheksfunktionen sind vorkompiliert, und der Objektcode dieser Bibliotheksdateien wird mit ‘ gespeichert.lib’ (oder ‘.a’) Verlängerung. Die Hauptaufgabe des Linkers besteht darin, den Objektcode von Bibliotheksdateien mit dem Objektcode unseres Programms zu kombinieren. Manchmal tritt die Situation auf, wenn sich unser Programm auf die in anderen Dateien definierten Funktionen bezieht. Es verknüpft den Objektcode dieser Dateien mit unserem Programm. Daher schließen wir, dass die Aufgabe des Linkers darin besteht, den Objektcode unseres Programms mit dem Objektcode der Bibliotheksdateien und anderer Dateien zu verknüpfen. Die Ausgabe des Linkers ist die ausführbare Datei. Der Name der ausführbaren Datei entspricht der Quelldatei, unterscheidet sich jedoch nur in ihren Erweiterungen. In DOS ist die Erweiterung der ausführbaren Datei ‘.exe’ und in UNIX kann die ausführbare Datei als ‘a.out’ bezeichnet werden. Wenn wir beispielsweise die Funktion printf() in einem Programm verwenden, fügt der Linker den zugehörigen Code in einer Ausgabedatei hinzu.
Lassen Sie uns anhand eines Beispiels verstehen.
Hallo.c
Nun erstellen wir ein Flussdiagramm des obigen Programms:
Im obigen Flussdiagramm werden die folgenden Schritte ausgeführt, um ein Programm auszuführen:
- Erstens die Eingabedatei, d. H. Hallo.c, wird an den Präprozessor übergeben, und der Präprozessor konvertiert den Quellcode in erweiterten Quellcode. Die Erweiterung des erweiterten Quellcodes wäre hallo.i.
- Der erweiterte Quellcode wird an den Compiler übergeben, und der Compiler konvertiert diesen erweiterten Quellcode in Assemblercode. Die Erweiterung des Assemblercodes wäre hello .s.
- Dieser Assemblercode wird dann an den Assembler gesendet, der den Assemblercode in Objektcode umwandelt.
- Nach der Erstellung eines Objektcodes erstellt der Linker die ausführbare Datei. Der Loader lädt dann die ausführbare Datei für die Ausführung.