Tiefes Verständnis von Computerprogrammen

Inhaltsverzeichnis

Programmspeicher

Programmkompilierungsprozess


Hallo zusammen, dieses Mal werden wir darüber sprechen, wie Programme von unten auf dem Computer gespeichert und kompiliert werden.

Programmspeicher

Nehmen wir als Beispiel das einfachste Programm:

#include<stdio.h>
int main()
{
  printf("hello world");
  return 0;
}

Nehmen Sie den obigen Code als Beispiel. Der Hallo-Programmzyklus beginnt mit einem Quellprogramm (auch Quelldatei genannt), bei dem es sich ebenfalls um eine Textdatei handelt, die wir mit dem Editor erstellen und speichern. Der Dateiname lautet hello.c. Das Quellprogramm ist eigentlich eine Bitfolge bestehend aus 0 und 1, und 8 Bits sind ein Byte. Jedes Byte repräsentiert ein Textzeichen im Programm.

Moderne Computersysteme verwenden grundsätzlich ASCII zur Darstellung von Textzeichen. Auf diese Weise wird jedes Zeichen durch einen eindeutigen Einzelbyte-Ganzzahlwert dargestellt.

Der obige Code wird in ASCII wie folgt ausgedrückt: (SP bedeutet Leerzeichen)

Das Programm hello.c wird als Bytefolge in einer Datei gespeichert. Jedes Byte hat einen ganzzahligen Wert, der einem Zeichen entspricht.

Beispiel: Der ganzzahlige Wert des ersten Bytes ist 35, was dem Zeichen „#“ entspricht. Das zweite Byte hat einen ganzzahligen Wert von 105, das entsprechende Zeichen ist „i“ und so weiter.

Achten Sie besonders darauf, dass jede Textzeile mit einem unsichtbaren Zeilenumbruchzeichen „\n“ endet, dessen entsprechender Ganzzahlwert 10 ist.

Eine Datei wie hello.c, die aus ASCII-Zeichen besteht, wird als Textdatei bezeichnet, alle anderen Dateien werden als Binärdateien bezeichnet.

Programmkompilierungsprozess

Der Lebenszyklus des Hallo-Programms beginnt mit einem High-Level-C-Sprachprogramm, da dieses Formular von Menschen gelesen werden kann. Menschen können es jedoch lesen, Computer jedoch nicht. Um unser hello.c-Programm auf dem Computersystem auszuführen, muss daher jede C-Anweisung von anderen Programmen in eine Reihe von Anweisungen in Maschinensprache auf niedriger Ebene konvertiert werden (d. h. die Maschinensprache, eine Sprache, die der Computer verstehen kann) Diese Anweisungen werden dann in ein Format gepackt, das als ausführbares Objektprogramm bezeichnet wird, und als binäre Festplattendatei gespeichert. Ein Objektprogramm wird auch als ausführbare Objektdatei bezeichnet.

Dabei liest der Compiler-Treiber die Quellprogrammdatei hello.c und übersetzt sie in eine ausführbare Objektdatei hello. Dieser Prozess kann in vier Stufen abgeschlossen werden, wie in der Abbildung dargestellt, wobei die Programme ( Präprozessor, Compiler, Assembler, Linker ), die diese vier Stufen ausführen, zusammen das Kompilierungssystem bilden.

  1. Vorverarbeitungsphase. Der Präprozessor (cpp) modifiziert das ursprüngliche C-Programm basierend auf Befehlen, die mit dem Zeichen # beginnen. Beispielsweise weist der Befehl #include<stdio.h> in Zeile 1 von hello.c den Präprozessor an, den Inhalt der System-Header-Datei stdio.h zu lesen und ihn direkt in den Programmtext einzufügen. Das Ergebnis ist ein weiteres C-Programm, normalerweise mit der Dateierweiterung .i.
  2. Kompilierungsphase. Der Compiler (ccl) übersetzt die Textdatei hello.i in die Textdatei hello.s, die ein Assemblerprogramm enthält. Das Programm enthält die Definition der Funktion main wie folgt:
  3. Montagephase. Als nächstes übersetzt der Assembler (as) hello.s in Anweisungen in Maschinensprache, verpackt diese Anweisungen in ein Format, das als verschiebbares Objektprogramm bezeichnet wird, und speichert das Ergebnis in der Objektdatei hello.o. Die Datei hello.o ist eine Binärdatei und die darin enthaltenen 17 Bytes sind die Befehlscodes der Funktion main. Wenn wir die hello.o-Datei in einem Texteditor öffnen, sehen wir eine Menge Kauderwelsch.
  4. Link-Stufe. Beachten Sie, dass das Hello-Programm die printf-Funktion aufruft, eine Funktion in der Standard-C-Bibliothek, die von jedem C-Compiler bereitgestellt wird. Die printf-Funktion existiert in einer separaten vorkompilierten Objektdatei namens printf.o, und diese Datei muss auf irgendeine Weise in unser he11o. eingebunden werden. in Bearbeitung. Der Linker (1d) ist für die Abwicklung dieser Zusammenführung verantwortlich. Das Ergebnis ist eine he11o-Datei, bei der es sich um eine ausführbare Objektdatei (oder einfach eine ausführbare Datei) handelt, die in den Speicher geladen und vom System ausgeführt werden kann.

Das ASCII-Referenzdiagramm lautet wie folgt:

Acho que você gosta

Origin blog.csdn.net/zsd2829568515/article/details/134635362
Recomendado
Clasificación