Phasen der Übersetzung
C- und C++-Programme bestehen aus mindestens einer Quelldatei, von denen jede einen Teil des Texts des Programms enthält. Eine Quelldatei, zusammen mit den enthaltenen Dateien, Dateien, die mit der #include
Präprozessordirektive enthalten sind, aber nicht einschließlich Abschnitte von Code, die von bedingten Kompilierungsdirektiven entfernt wurden, #if
wird als Übersetzungseinheit bezeichnet.
Quelldateien können zu unterschiedlichen Zeiten übersetzt werden. In der Tat ist es üblich, nur veraltete Dateien zu übersetzen. Die übersetzten Übersetzungseinheiten können in separate Objektdateien oder in Objektcodebibliotheken verarbeitet werden. Diese separaten, übersetzten Übersetzungseinheiten werden anschließend verknüpft, um ein ausführbares Programm oder eine Dynamic Link Library (DLL) zu bilden. Weitere Informationen zu Dateien, die als Eingabe für den Linker verwendet werden können, finden Sie unter LINK-Eingabedateien.
Übersetzungseinheiten können mit folgenden Methoden kommunizieren:
Aufrufe der Funktionen, die über eine externe Bindung verfügen.
Aufrufe der Klassenmemberfunktionen, die über eine externe Bindung verfügen.
Direkte Änderung von Objekten, die über eine externe Bindung verfügen.
Direkte Änderung von Dateien.
Prozessübergreifende Kommunikation (nur für Microsoft Windows-basierte Anwendungen).
Die folgende Liste beschreibt die Phasen, in denen der Compiler Dateien übersetzt:
Zeichenzuordnung
Zeichen in Quelldatei werden zur internen Quelldarstellung zugeordnet. Trigraphsequenzen werden in dieser Phase in die interne Einzelzeichendarstellung konvertiert.
Liniensplicing
Alle Zeilen, die mit einem umgekehrten Schrägstrich (\) enden, gefolgt von einem Zeilenumbruchzeichen, werden mit der nächsten Zeile in der Quelldatei verknüpft, wodurch logische Linien aus den physischen Zeilen gebildet werden. Sofern sie nicht leer ist, muss eine Quelldatei in einem Zeilenumbruchzeichen enden, dem kein umgekehrter Schrägstrich vorangestellt ist.
Tokenisierung
Die Quelldatei wird in Vorverarbeitungstoken und Leerstellenzeichen unterteilt. Kommentare in der Quelldatei werden jeweils durch ein Leerzeichen ersetzt. Zeilenumbruchzeichen werden beibehalten.
Vorverarbeitung
Vorverarbeitungsanweisungen werden ausgeführt, und Makros werden in die Quelldatei erweitert. Die #include
-Anweisung ruft die Übersetzung auf, die mit den vorherigen drei Übersetzungsschritten für jeden enthaltenen Text beginnt.
Zeichensatzzuordnung
Alle Quellzeichensatzmember und Escapesequenzen werden in ihre Äquivalente im Ausführungszeichensatz konvertiert. Für Microsoft C und C++ sind sowohl die Quell- als auch Ausführungszeichensätze ASCII.
Zeichenfolgenverkettung
Alle angrenzenden Zeichenfolgen und breiten Zeichenfolgenliterale werden verkettet. Beispielsweise wird "String " "concatenation"
zu "String concatenation"
.
Übersetzung
Alle Token werden sowohl syntaktisch als auch semantisch analysiert. Diese Token werden in Objektcode konvertiert.
Verknüpfung
Alle externen Verweise werden aufgelöst, um ein ausführbares Programm oder eine Dynamic Link Library zu erstellen.
Der Compiler gibt während Phasen der Übersetzung, in denen er auf Syntaxfehler trifft, Warnungen oder Fehler aus.
Der Linker löst alle externen Verweise auf und erstellt ein ausführbares Programm oder eine DLL, indem mindestens eine getrennt verarbeitete Übersetzungseinheit mit Standardbibliotheken kombiniert wird.