Heim  >  Artikel  >  Der Kompilierungsprozess kann in mehrere Phasen unterteilt werden

Der Kompilierungsprozess kann in mehrere Phasen unterteilt werden

青灯夜游
青灯夜游Original
2021-07-02 14:45:1427787Durchsuche

Der Kompilierungsprozess kann in 5 Phasen unterteilt werden: 1. Lexikalische Analysephase In dieser Phase werden die Zeichenfolgen gescannt und zerlegt, aus denen das Quellprogramm besteht, und jedes Wort identifiziert. 2. Phase der Syntaxanalyse, die zur Analyse der grammatikalischen Struktur des Satzes verwendet wird. 3. Semantische Analyse und Zwischenphase der Codegenerierung. 4. Code-Optimierungsphase. 5. Programmphase zur Zielcodegenerierung.

Der Kompilierungsprozess kann in mehrere Phasen unterteilt werden

Die Betriebsumgebung dieses Tutorials: Windows 10-System, Dell G3-Computer.

Der Arbeitsprozess eines Compilers, der ein Quellprogramm in ein Zielprogramm übersetzt, ist in fünf Phasen unterteilt: lexikalische Analyse und Optimierung des Zielcodes;

Das Kompilierungsprogramm ist im Allgemeinen in fünf Phasen unterteilt: lexikalische Analyse, Syntaxanalyse, semantische Analyse und Zwischencodegenerierung, Codeoptimierung und Zielcodegenerierungsprogramm:

Der Kompilierungsprozess kann in mehrere Phasen unterteilt werden

Im Folgenden finden Sie eine detaillierte Erläuterung der fünf Phasen des Kompilierungsprozesses

Für die Arbeit des Kompilierens eines Programms ist der gesamte Prozess von der Eingabe des Quellprogramms bis zur Ausgabe des Zielprogramms sehr kompliziert. Vom Prozess her weist es jedoch viele Ähnlichkeiten mit der direkten Übersetzung natürlicher Sprache durch den Menschen auf. Wenn wir einen Text in einen anderen übersetzen, beispielsweise einen Absatz aus dem Englischen ins Chinesische, müssen wir normalerweise die folgenden Schritte ausführen:

(1) Identifizieren Sie zunächst jedes Wort im Satz.

( 2) Analysieren Sie das grammatikalische Struktur des Satzes;

(3) Erstellen Sie eine vorläufige Übersetzung basierend auf der Bedeutung des Satzes.

(4) Ändern Sie die Übersetzung.

In ähnlicher Weise können wir den Arbeitsprozess des Compilers in fünf Phasen unterteilen: lexikalische Analyse, Syntaxanalyse, semantische Analyse und Zwischencodegenerierung, Optimierung und Zielcodegenerierung.

Die erste Stufe: lexikalische Analyse

Die Aufgabe der lexikalischen Analyse besteht darin, das Quellprogramm einzugeben, die Zeichenfolgen, aus denen das Quellprogramm besteht, zu scannen und zu zerlegen und jedes Wort (auch als Wortsymbol oder kurz Symbol bezeichnet) zu identifizieren ), Zum Beispiel Grundwörter (begin, end, if, for, while), Bezeichner, Konstanten, Operatoren und Trennzeichen (Satzzeichen, linke und rechte Klammern).

Wortsymbole sind die Grundbestandteile der Sprache und die Grundelemente, damit Menschen Programme verstehen und schreiben können. Das Erkennen und Verstehen dieser Elemente ist zweifellos die Grundlage der Übersetzung. Genau wie beim Übersetzen vom Englischen ins Chinesische ist es unmöglich, richtig zu übersetzen, wenn man die englischen Wörter nicht versteht. Was in der Phase der lexikalischen Analyse befolgt wird, sind die lexikalischen Regeln der Sprache (oder Wortbildungsregeln). Effektive Werkzeuge zur Beschreibung lexikalischer Regeln sind formale Formen und effiziente Automaten.

Zweite Stufe: grammatikalische Analyse

Die Aufgabe der grammatikalischen Analyse besteht darin, Wortsymbolketten basierend auf der lexikalischen Analyse und gemäß den grammatikalischen Regeln der Sprache in verschiedene grammatikalische Einheiten (grammatikalische Kategorien) wie „Phrasen“ zu zerlegen. , „Satz“, „Programmabschnitt“ und „Programm“ usw. Durch syntaktische Analyse wird festgestellt, ob die gesamte Eingabezeichenfolge ein grammatikalisch korrektes „Programm“ darstellt. Die grammatikalische Analyse folgt den grammatikalischen Regeln der Sprache. Grammatikregeln werden üblicherweise mithilfe kontextfreier Grammatiken beschrieben. Die lexikalische Analyse ist eine lineare Analyse, während die syntaktische Analyse eine hierarchische Analyse ist. Zum Beispiel: Z= Daher besteht die Aufgabe der Syntaxanalyse darin, X + 0,618 * Y als arithmetischen Ausdruck zu identifizieren, und gleichzeitig gehört das Zehnfache der gesamten oben genannten Symbolzeichenfolge zur Kategorie der Zuweisungsanweisung.

Die dritte Stufe: Semantische Analyse und Zwischencodegenerierung

Die Aufgabe dieser Stufe besteht darin, die Bedeutung verschiedener grammatikalischer Kategorien zu analysieren, die durch Syntaxanalyse identifiziert wurden, und eine vorläufige Übersetzung durchzuführen (Zwischencode zu generieren). Diese Phase umfasst normalerweise zwei Aspekte der Arbeit. Führen Sie zunächst semantische Anordnungen für jede grammatikalische Kategorie durch, z. B. ob die Variable definiert ist, ob der Typ korrekt ist usw. Wenn die Semantik korrekt ist, wird die andere Seite der Arbeit durchgeführt, nämlich die Interpretation des Zwischencodes.

Diese Phase folgt den semantischen Regeln der Sprache. Semantische Regeln werden üblicherweise mithilfe von Attributgrammatiken beschrieben. „Übersetzung“ kommt hier erst ansatzweise ins Spiel. Der sogenannte „Zwischencode“ ist ein Notationssystem mit klarer Bedeutung und einfach zu verarbeiten, das in der Regel unabhängig von spezifischer Hardware ist. Dieses Notationssystem ähnelt entweder bis zu einem gewissen Grad der Befehlsform moderner Computer oder lässt sich relativ einfach in Maschinenanweisungen moderner Computer umwandeln.

Viele Compiler verwenden beispielsweise eine „Quaternion“, die der „Drei-Adressen-Anweisung“ sehr ähnlich ist, als Zwischencode. Seine Bedeutung ist: Führen Sie eine bestimmte Operation an den „linken und rechten Operanden“ (angegeben durch „Operator“) aus und behalten Sie den durch die Operation erhaltenen Wert als „Ergebnis“ bei. Bei der Verwendung von Tetragrammen als Zwischencodes besteht die Aufgabe bei der Generierung von Zwischencodes darin, verschiedene Kategorien gemäß den grammatikalischen Regeln der Sprache in Tetragrammsequenzen zu übersetzen.

Im Allgemeinen ist Zwischencode ein Notationssystem, das von spezifischer Hardware unabhängig ist. Zu den häufig verwendeten mittleren Tanten gehören neben quartären Formeln auch ternäre Formeln, indirekte ternäre Formeln, umgekehrte polnische Notation, Baumdarstellung usw.

Die vierte Stufe: Codeoptimierung

Die Aufgabe der Optimierung besteht darin, den in der vorherigen Stufe generierten Zwischencode zu verarbeiten und zu transformieren, um in der letzten Stufe einen effizienteren (zeit- und platzsparenderen) Zielcode zu erzeugen. Zu den Hauptaspekten der Optimierung gehören: Extraktion von PR-Unterausdrücken, Schleifenoptimierung, Löschen von nutzlosem Code usw. Manchmal kann der Code auch parallelisiert werden, um „parallele Operationen“ zu ermöglichen. Das Prinzip, dem die Optimierung folgt, ist die äquivalente Transformationsregel des Programms.

Die fünfte Stufe: Zielcode-Generierungsprogramm

Die Aufgabe dieser Stufe besteht darin, den Zwischencode (oder nach der Optimierung) auf einer bestimmten Maschine in Low-Level-Sprachcode umzuwandeln. In dieser Phase wird die endgültige Übersetzung implementiert, und ihre Arbeit hängt von der Hardwaresystemstruktur und der Bedeutung der Maschinenanweisungen ab. Die Arbeit in dieser Phase ist sehr komplex und umfasst die Gestaltung der Verwendung von Funktionskomponenten des Hardwaresystems, die Auswahl von Maschinenanweisungen, die Zuweisung von Speicherplatz für verschiedene Datentypvariablen sowie die Planung von Registern und Sicherungsregistern usw.

Der Objektcode kann in Form eines absoluten Anweisungscodes oder eines verschiebbaren Anweisungscodes oder eines Assembler-Anweisungscodes vorliegen. Wenn der Objektcode ein absoluter Befehlscode ist, kann dieser Objektcode sofort ausgeführt werden. Wenn der Zielcode ein Assembler-Anweisungscode ist, muss er vom Assembler kompiliert werden, bevor er ausgeführt werden kann. Es muss darauf hingewiesen werden, dass der von den meisten praktischen Compilern heutzutage generierte Objektcode ein verschiebbarer Befehlscode ist. Vor der Ausführung muss dieser Zielcode ein Verbindungsassemblierungsprogramm verwenden, um jedes Zielmodul (einschließlich der vom System bereitgestellten Bibliotheksfunktionen) miteinander zu verbinden, den Speicherort der Programmvariablen (oder Konstanten) im Hauptspeicher zu bestimmen und zu laden Die Startadresse macht es zu einem absoluten Befehlscodeprogramm, das ausgeführt werden kann.

Weitere Kenntnisse zum Thema Programmierung finden Sie unter: Programmiervideos! !

Das obige ist der detaillierte Inhalt vonDer Kompilierungsprozess kann in mehrere Phasen unterteilt werden. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn