

Was ist nötig, um ein in einer Hochsprache geschriebenes Quellprogramm in ein ausführbares Programm umzuwandeln?
Die Konvertierung eines in einer Hochsprache geschriebenen Quellprogramms in ein ausführbares Programm erfordert „Kompilierung und Verknüpfung“. In Hochsprachen geschriebene Quellprogramme können nicht direkt auf der Maschine ausgeführt werden und müssen kompiliert und verknüpft werden.
Damit ein Programm ausgeführt werden kann, muss es vier Schritte durchlaufen: Vorverarbeitung, Kompilierung, Assemblierung und Verknüpfung. Als nächstes erklären wir diese Prozesse anhand einiger einfacher Beispiele im Detail.
Zu den oben verwendeten Optionen bedarf es einiger Erläuterungen.
Wenn Sie den Befehl gcc ohne Optionen verwenden, wird der gesamte Prozess der Vorverarbeitung, Kompilierung, Assemblierung und Verknüpfung standardmäßig ausgeführt. Wenn das Programm korrekt ist, erhalten Sie eine ausführbare Datei
-E-Option: Fordert den Compiler auf, nach der Vorverarbeitung anzuhalten, und die nachfolgende Kompilierung, Assemblierung und Verknüpfung wird nicht ausgeführt. -S-Option: Fordert den Compiler auf, nach der Kompilierung anzuhalten und keine Assemblierung und Verknüpfung durchzuführen. -c-Option: fordert den Compiler auf, nach der Ausführung der Assembly anzuhalten. Diese drei Optionen entsprechen also der Begrenzung der Stoppzeit des Compiler-Ausführungsvorgangs, anstatt einen bestimmten Schritt separat zur Ausführung herauszunehmen.1. Vorverarbeitung:
Verwenden Sie die Option -E, was bedeutet, dass nur eine Vorkompilierung durchgeführt wird und entsprechend eine .i-Datei generiert wird. Vorgänge, die während des Vorverarbeitungsprozesses ausgeführt werden:- Alle „#define“ löschen und alle Makrodefinitionen erweitern
- Alle bedingten Kompilierungsanweisungen verarbeiten, z. B. „#if“, „#ifdef“, „#elif““, „ #else“, „#endif“
- Verarbeiten Sie die Vorkompilierungsanweisung „#include“ und fügen Sie die enthaltene Header-Datei am Speicherort der Kompilierungsanweisung ein. (Dieser Vorgang ist rekursiv, da die eingebundene Datei auch andere Dateien enthalten kann)
- Entfernen Sie alle Kommentare „//“ und „/* */“.
- Fügen Sie Zeilennummern und Dateinamenbezeichner hinzu, damit der Compiler Zeilennummern zum späteren Debuggen während der Kompilierung generieren und Zeilennummern anzeigen kann, wenn während der Kompilierung Kompilierungsfehler oder Warnungen auftreten.
- Behalten Sie alle #pragma-Pragmas bei, da der Compiler sie benötigt.
2. Kompilieren:
Verwenden Sie die Option -S, um anzugeben, dass der Kompilierungsvorgang nach der Ausführung beendet wird. Entsprechend wird eine .s-Datei generiert. Der Kompilierungsprozess besteht darin, eine Reihe von lexikalischen Analysen, Syntaxanalysen und semantischen Analysen durchzuführen Analyse und Optimierung der vorverarbeiteten Datei. Generieren Sie die entsprechende Assembler-Codedatei.- Lexikalische Analyse:
- Grammatikanalyse: Der Grammatikanalysator analysiert die durch die lexikalische Analyse generierte Token-Sequenz gemäß den vom Benutzer angegebenen Grammatikregeln und bildet daraus dann einen Grammatikbaum. Für verschiedene Sprachen unterscheiden sich lediglich ihre grammatikalischen Regeln. Es gibt auch ein fertiges Tool zur Syntaxanalyse namens yacc.
- Semantische Analyse:
Die syntaktische Analyse schließt die Analyse der grammatikalischen Ebene des Ausdrucks ab, versteht jedoch nicht, ob die Aussage wirklich sinnvoll ist. Einige Anweisungen sind grammatikalisch zulässig, haben jedoch keine praktische Bedeutung. Wenn beispielsweise zwei Zeiger multipliziert werden, ist eine semantische Analyse erforderlich. Die einzige Semantik, die der Compiler analysieren kann, ist jedoch.
Statische Semantik: Semantik, die zur Kompilierzeit bestimmt werden kann. Beinhaltet normalerweise Deklaration, Typabgleich und Typkonvertierung. Wenn beispielsweise ein Gleitkommaausdruck einem Ganzzahlausdruck zugewiesen wird, erfolgt implizit eine Konvertierung vom Gleitkommaausdruck in einen Ganzzahlausdruck, und die semantische Analyse muss diese Konvertierung abschließen. Ein weiteres Beispiel ist die Konvertierung eines Gleitkommaausdrucks in einen Ganzzahlausdruck Das Zuweisen eines Ausdrucks zu einem Zeiger ist definitiv nicht möglich. Bei der semantischen Analyse wird festgestellt, dass die beiden Typen nicht übereinstimmen, und der Compiler meldet einen Fehler.
Dynamische Semantik: Semantik, die erst zur Laufzeit ermittelt werden kann. Wenn Sie beispielsweise zwei ganze Zahlen dividieren, gibt es kein Problem mit der Syntax und die Typen stimmen überein. Wenn der Divisor jedoch 0 ist, ist dieses Problem nicht bekannt im Voraus und kann nur während des Betriebs durchgeführt werden. Erst wenn es soweit ist, können wir herausfinden, dass mit ihm etwas nicht stimmt.
- Zwischencodegenerierung
Für einige Werte, die während der Kompilierung ermittelt werden können, werden sie beispielsweise 2+6 während der Kompilierung optimiert Sein Wert ist 8, es ist jedoch schwieriger, die Syntax direkt zu optimieren. In diesem Fall konvertiert der Optimierer zunächst den Syntaxbaum in Zwischencode. Zwischencode ist im Allgemeinen unabhängig von der Zielmaschine und der Betriebsumgebung. (Beinhaltet nicht Datengröße, Variablenadresse, Registernamen usw.). Zwischencodes haben in verschiedenen Compilern unterschiedliche Formen. Die gebräuchlichsten sind Drei-Adressen-Code und P-Code.
Der Zwischencode ermöglicht die Aufteilung des Compilers in Front-End und Back-End. Das Compiler-Front-End ist für die Generierung von maschinenunabhängigem Zwischencode verantwortlich, und das Compiler-Back-End konvertiert den Zwischencode in Maschinencode.
- Zielcodegenerierung und -optimierung
Der Codegenerator wandelt den Zwischencode in Maschinencode um. Dieser Vorgang hängt von der Zielmaschine ab, da verschiedene Maschinen unterschiedliche Wortlängen, Register, Datentypen usw. haben.
Abschließend optimiert der Zielcode-Optimierer den Zielcode, indem er beispielsweise geeignete Adressierungsmethoden auswählt, eindeutige Methoden verwendet, um Multiplikation und Division zu ersetzen, und redundante Anweisungen löscht.
3. Assembler
Der Assembler-Prozess wird durch den Aufruf des Assemblers as abgeschlossen, der dazu dient, den Assembler-Code in Anweisungen umzuwandeln, die die Maschine ausführen kann.
Verwenden Sie den Befehl als hello.s -o hello.o oder verwenden Sie gcc -c hello.s -o hello.o, um ihn bis zum Ende des Montagevorgangs auszuführen. Die entsprechende generierte Datei ist eine .o-Datei.
4. Links
Der Hauptinhalt von Links besteht darin, die Teile, die zwischen Modulen aufeinander verweisen, korrekt zu verbinden. Seine Aufgabe besteht darin, die Verweise einiger Anweisungen auf andere Symboladressen zu korrigieren. Der Verknüpfungsprozess umfasst hauptsächlich die Adress- und Raumzuweisung sowie die Symbolauflösung und -umleitung
Symbolauflösung: Manchmal auch Symbolbindung, Namensbindung, Namensauflösung oder Adressbindung genannt, bezieht sich dies tatsächlich auf die Verwendung von Symbolen zur Identifizierung einer Adresse. A Zum Beispiel int a = 6; ein solcher Code. Verwenden Sie A, um einen Raum mit einer Größe von 4 Bytes im Raum zu identifizieren. Der im Raum gespeicherte Inhalt beträgt 4 Umschreiben.
Die grundlegendste Verknüpfung wird als statische Verknüpfung bezeichnet. Dabei wird die Quellcodedatei jedes Moduls in eine Zieldatei (Linux: .o Windows: .obj) kompiliert und anschließend die Zieldatei und die Bibliothek miteinander verknüpft, um die endgültige Datei zu bilden ausführbare Datei. Eine Bibliothek ist eigentlich ein Paket aus einer Reihe von Zieldateien. Einige der am häufigsten verwendeten Codes werden in Zieldateien umgewandelt und dann gepackt und gespeichert. Die gebräuchlichste Bibliothek ist die Laufzeitbibliothek, eine Sammlung grundlegender Funktionen, die die Programmausführung unterstützen.
Weitere Informationen zu diesem Thema finden Sie auf:
Chinesische PHP-Website!
Das obige ist der detaillierte Inhalt vonWas ist nötig, um ein in einer Hochsprache geschriebenes Quellprogramm in ein ausführbares Programm umzuwandeln?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Heiße KI -Werkzeuge

Undresser.AI Undress
KI-gestützte App zum Erstellen realistischer Aktfotos

AI Clothes Remover
Online-KI-Tool zum Entfernen von Kleidung aus Fotos.

Undress AI Tool
Ausziehbilder kostenlos

Clothoff.io
KI-Kleiderentferner

AI Hentai Generator
Erstellen Sie kostenlos Ai Hentai.

Heißer Artikel

Heiße Werkzeuge

Notepad++7.3.1
Einfach zu bedienender und kostenloser Code-Editor

SublimeText3 chinesische Version
Chinesische Version, sehr einfach zu bedienen

Senden Sie Studio 13.0.1
Leistungsstarke integrierte PHP-Entwicklungsumgebung

Dreamweaver CS6
Visuelle Webentwicklungstools

SublimeText3 Mac-Version
Codebearbeitungssoftware auf Gottesniveau (SublimeText3)

Heiße Themen



Merkmale der Maschinensprache: schwer zu erlernen, zu verstehen und nicht universell; erfordert manuelle Speicherzuweisung; Die Merkmale der Assemblersprache: Die Ausführungseffizienz des Programms ist sehr hoch, es nimmt wenig Speicherplatz ein, es fehlt ihm an Vielseitigkeit und das Programm ist nicht einfach zu übertragen. Merkmale von Hochsprachen: einfach, gewisse Vielseitigkeit und kann von Computern nicht direkt erkannt und ausgeführt werden.

Systemsoftware, die in Hochsprachen geschriebene Quellprogramme in Zielprogramme übersetzen kann, ist ein „Compiler“. Ein Compiler ist ein Übersetzungsprogramm, das mithilfe eines generativen Implementierungsansatzes implementiert wird. Er verwendet ein in einer höheren Programmiersprache geschriebenes Quellprogramm als Eingabe und verwendet ein in Assemblersprache oder Maschinensprache ausgedrücktes Zielprogramm als Ausgabe.

Die Assemblersprache ist keine Hochsprache; sie ist eine Niedrigsprache wie die Maschinensprache. Der Unterschied zwischen Assemblersprache und Hochsprache: 1. Die Programmiereffizienz der Assemblersprache ist nicht hoch, während die Programmiereffizienz der Hochsprache höher ist als die der Assemblersprache höher als die der Assemblersprache; 3. Die Assemblersprache ist eine Maschinensprache, während die Hochsprache vereinfacht ist und der menschlichen natürlichen Sprache nahe kommt.

Die Konvertierung eines in einer höheren Programmiersprache geschriebenen Programms in ein äquivalentes ausführbares Programm erfordert Kompilierung und Verknüpfung. Hochrangige Programmiersprachen können die unterschiedlichen Einschränkungen von Computeranweisungssystemen und Zufallsmaschinen in Maschinensprache beseitigen und Quellprogramme in Zielcodes umwandeln, die die CPU erkennen kann.

Maschinensprache ist keine Hochsprache, sondern eine Niedrigsprache, die für Computerhardware verwendet wird. Sie interagiert direkt mit der zugrunde liegenden Hardware des Computers. Jede Anweisung entspricht einer Operation oder Funktion der Computerhardware. Hochsprache ist eine Programmiersprache, die der menschlichen Sprache näher kommt und höhere Abstraktionsfähigkeiten und Entwicklungseffizienz bietet. Maschinensprache und Hochsprache spielen unterschiedliche Rollen in der Programmierung, jede mit ihren eigenen Vorteilen anwendbare Szenarien.

Kuai Technology berichtete am 17. November, dass Shenzhen Kaihong heute Morgen bekannt gab, dass der erste humanoide KaihongOS-Roboter auf Basis des Open-Source-Hongmeng, der gemeinsam von ihm und Leju Robot entwickelt wurde, offiziell veröffentlicht wurde. Der offiziellen Einführung zufolge handelt es sich um ein rundum intelligentes Lehrsystem, das mit KaihongOS ausgestattet ist und Roboter als Träger verwendet, das mehrere Szenarien wie Industrie und Dienstleistungen abdeckt. Dieser Roboter ist mit einem Blutsauerstoff-Herzfrequenzsensor, einem Temperatur- und Feuchtigkeitssensor, einem Infrarot-Temperatursensor, einem Induktionssensor für den menschlichen Körper, NFC, einem OLED-Display und LED-Leuchten ausgestattet. Durch die Erkennung mehrerer Gelenke kann er Entscheidungen intelligent ausführen. Gleichzeitig kann der Roboter auch in Echtzeit mit Mobiltelefonen, Tablets, Computern und anderen Geräten verbunden werden, wodurch die herkömmliche Kabelbaumverbindungsmethode entfällt und die Unterrichtseffizienz verbessert wird. Gleichzeitig hat dieser Roboter auch 17

Die C-Sprache legt fest, dass die Position der Hauptfunktion in einem Quellprogramm beliebig sein kann. Wenn ein in der C-Sprache geschriebenes Programm ausgeführt wird, entspricht die Hauptfunktion dem Eingang zum Ausführungsprogramm, unabhängig von der Position der Hauptfunktion Während des gesamten Prozesses startet ein C-Programm die Ausführung immer von der MAM-Funktion aus.

Funktionsanalyse der Go-Sprache: Ist es eine Hochsprache? Die Go-Sprache ist eine von Google entwickelte statisch stark typisierte Programmiersprache. Sie ist einfach, leicht zu lesen und zu schreiben und verfügt über effiziente Parallelitätsfunktionen. Lassen Sie uns also gemäß der Definition einer Hochsprache analysieren, ob die Go-Sprache eine Hochsprache ist. Definition einer Hochsprache Eine Hochsprache ist eine Programmiersprache, die der menschlichen Sprache näher kommt als der Maschinensprache. Es zeichnet sich durch eine prägnante Syntax, einfaches Lesen und Schreiben sowie einen hohen Abstraktionsgrad aus, der es Programmierern ermöglicht, sich mehr auf die Lösung des Problems selbst zu konzentrieren.