Heim häufiges Problem Was ist nötig, um ein in einer Hochsprache geschriebenes Quellprogramm in ein ausführbares Programm umzuwandeln?

Was ist nötig, um ein in einer Hochsprache geschriebenes Quellprogramm in ein ausführbares Programm umzuwandeln?

Aug 31, 2020 pm 03:44 PM
可执行程序 源程序 高级语言

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.

Was ist nötig, um ein in einer Hochsprache geschriebenes Quellprogramm in ein ausführbares Programm umzuwandeln?

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.

Jeder sollte mit dem Ausführungsprozess des oben genannten Programms vertraut sein, damit ich keine Zeit verschwende.

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.
Verwenden Sie ein einfaches Programm, um zu überprüfen, ob die Fakten den oben genannten entsprechen.

Schreiben Sie ein einfaches Programm, verwenden Sie dann die Option -E, um den Vorverarbeitungsprozess durchzuführen, öffnen Sie die generierte .i-Datei und vergleichen Sie sie mit der Quelldatei The Die Ergebnisse sind auf einen Blick klar

                              Das Hinzufügen von Zeilennummern zum Code wird hier nicht demonstriert. Die angezeigten Zeilennummern werden von den oben verwendeten Bearbeitungstools nicht automatisch hinzugefügt , und diese Zeilennummern können vom Kompilierungssystem nicht gesehen werden. Wir haben jedoch festgestellt, dass bei einem Problem mit einer Zeile unseres Codes während der Kompilierung eine Meldung angezeigt wird, dass bei welcher Codezeile ein Problem vorliegt. Dies ist bereits ein Beweis dafür, dass der Compiler automatisch Zeilennummern hinzufügt.

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:
Die lexikalische Analyse verwendet ein Programm namens lex, um das lexikalische Scannen zu implementieren. Es teilt die Eingabezeichenfolge gemäß den zuvor vom Benutzer beschriebenen lexikalischen Regeln auf. Die generierten Token werden im Allgemeinen in Schlüsselwörter, Bezeichner, Literale (einschließlich Zahlen, Zeichenfolgen usw.) und Sonderzeichen (Operatoren, Gleichheitszeichen usw.) unterteilt und dann in die entsprechenden Tabellen eingefügt.

    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!

Erklärung dieser Website
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

Heiße KI -Werkzeuge

Undresser.AI Undress

Undresser.AI Undress

KI-gestützte App zum Erstellen realistischer Aktfotos

AI Clothes Remover

AI Clothes Remover

Online-KI-Tool zum Entfernen von Kleidung aus Fotos.

Undress AI Tool

Undress AI Tool

Ausziehbilder kostenlos

Clothoff.io

Clothoff.io

KI-Kleiderentferner

AI Hentai Generator

AI Hentai Generator

Erstellen Sie kostenlos Ai Hentai.

Heißer Artikel

R.E.P.O. Energiekristalle erklärten und was sie tun (gelber Kristall)
3 Wochen vor By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. Beste grafische Einstellungen
3 Wochen vor By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. So reparieren Sie Audio, wenn Sie niemanden hören können
3 Wochen vor By 尊渡假赌尊渡假赌尊渡假赌
WWE 2K25: Wie man alles in Myrise freischaltet
3 Wochen vor By 尊渡假赌尊渡假赌尊渡假赌

Heiße Werkzeuge

Notepad++7.3.1

Notepad++7.3.1

Einfach zu bedienender und kostenloser Code-Editor

SublimeText3 chinesische Version

SublimeText3 chinesische Version

Chinesische Version, sehr einfach zu bedienen

Senden Sie Studio 13.0.1

Senden Sie Studio 13.0.1

Leistungsstarke integrierte PHP-Entwicklungsumgebung

Dreamweaver CS6

Dreamweaver CS6

Visuelle Webentwicklungstools

SublimeText3 Mac-Version

SublimeText3 Mac-Version

Codebearbeitungssoftware auf Gottesniveau (SublimeText3)

Was sind die Merkmale von Maschinensprache, Assemblersprache und Hochsprache? Was sind die Merkmale von Maschinensprache, Assemblersprache und Hochsprache? Apr 22, 2021 pm 04:00 PM

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.

Welche Systemsoftware kann in Hochsprachen geschriebene Quellprogramme in Zielprogramme übersetzen? Welche Systemsoftware kann in Hochsprachen geschriebene Quellprogramme in Zielprogramme übersetzen? Jan 22, 2021 pm 05:36 PM

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.

Ist Assemblersprache eine Hochsprache? Ist Assemblersprache eine Hochsprache? Jan 30, 2023 pm 03:14 PM

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.

Was ist erforderlich, um ein in einer höheren Programmiersprache geschriebenes Programm in ein gleichwertiges ausführbares Programm umzuwandeln? Was ist erforderlich, um ein in einer höheren Programmiersprache geschriebenes Programm in ein gleichwertiges ausführbares Programm umzuwandeln? Jan 12, 2021 pm 02:41 PM

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.

Ist Maschinensprache eine Hochsprache? Ist Maschinensprache eine Hochsprache? Aug 22, 2023 pm 05:13 PM

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.

Veröffentlichung des weltweit ersten Open-Source-humanoiden Roboters auf Hongmeng-Basis, der die Hochsprache JS/ArkTS unterstützt Veröffentlichung des weltweit ersten Open-Source-humanoiden Roboters auf Hongmeng-Basis, der die Hochsprache JS/ArkTS unterstützt Nov 17, 2023 pm 08:07 PM

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

Wo befindet sich die Hauptfunktion im C-Quellprogramm? Wo befindet sich die Hauptfunktion im C-Quellprogramm? Nov 19, 2020 am 11:06 AM

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? Funktionsanalyse der Go-Sprache: Ist es eine Hochsprache? Mar 23, 2024 pm 04:00 PM

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.