Ich versuche wirklich zu verstehen, wie genau eine Hochsprache in Maschinencode konvertiert und dann von der CPU ausgeführt wird.
Ich verstehe, dass der Code in Maschinencode kompiliert wird, der der Low-Level-Code ist, den eine CPU verwenden kann. Wenn ich eine Zuweisungserklärung habe, sagen Sie:
x = x + 5;
y = x - 3;
Führt die CPU jede Zeile einzeln aus? Es wird also zuerst x = x + 5 ausgeführt; Befehl und dann der nächste Befehl, den die CPU ausführen wird, ist y = x-3; Ich versuche wirklich zu verstehen, wie der Ausführungsprozess ausgeführt wird und wie der von mir geschriebene Code tatsächlich von der CPU ausgeführt wird.
computer-science
cpu
Frankie
quelle
quelle
Antworten:
Die Codezeilen haben nichts damit zu tun, wie die CPU sie ausführt. Ich würde empfehlen, sich über Assembler zu informieren, da Sie dadurch viel darüber lernen, wie die Hardware tatsächlich funktioniert. Sie können auch Assembler-Ausgaben von vielen Compilern erhalten.
Dieser Code könnte in etwas kompiliert werden (in einer zusammengesetzten Assemblersprache):
Wenn der Compiler jedoch weiß, dass eine Variable nicht erneut verwendet wird, wird die Speicheroperation möglicherweise nicht ausgegeben.
Damit der Debugger weiß, welcher Maschinencode einer Zeile der Programmquelle entspricht, fügt der Compiler Anmerkungen hinzu, um anzuzeigen, welche Zeile wo im Maschinencode entspricht.
quelle
ADD Rx, Rx, $5
undSUB Ry, Rx, $3
(unter der Annahme, dass x- und y-Variablen in Registern abgebildet wurden). Sie beschreiben einen RISC-Ansatz zum Laden / Speichern.Es hängt davon ab, ob.
In den Anfängen wirklich einfacher Maschinen wurde Code zeilenweise ausgeführt. Als die Maschinen größer, schneller und komplexer wurden, stellten Sie fest, dass sowohl mehrere Befehle gleichzeitig ausgeführt werden können als auch Lese- und Schreibvorgänge im Speicher viel länger dauern als bei Operationen an Registern.
Bei der Optimierung von Compilern musste dies berücksichtigt werden, und die von Ihnen angegebenen Zeilen konnten "mehr oder weniger" parallel ausgeführt werden, wobei ein Teil des Prozessors an der Berechnung von y arbeitete, während ein anderer Teil den zuvor berechneten neuen Wert von speicherte x (und die Berechnung von y verwendete diesen neuen Wert aus dem Register).
Die Control Data 6600 war die erste mir bekannte Maschine, die solche Dinge tat. Die Ganzzahladdition dauerte 300 ns, die Speicherreferenz (Lesen oder Schreiben) dauerte 1000 ns, Multiplikationen und Divisionen dauerten viel länger. Je nachdem, welche Funktionseinheiten benötigt wurden, konnten bis zu zehn Befehle parallel ausgeführt werden. Die CDC 6600 FORTRAN-Compiler waren sehr gut darin, all dies zu planen.
quelle
x
. Auf diese Weise hat es den Code bereits ausgeführt und im Cache gespeichert.Nein, es gibt keine Eins-zu-Eins-Zuordnung zwischen Codezeilen / Anweisungen in höheren und niedrigeren Sprachen. Tatsächlich werden beide obigen Zeilen in mehrere Maschinencode- Anweisungen übersetzt, wie z
Die tatsächlichen Details dieser Anweisungen variieren zwischen den Plattformen.
Dies ist die Grundansicht der Dinge. Um die Probleme weiter zu verkomplizieren, wenden moderne CPUs unter anderem Techniken wie Ausführungspipelines , Ausführung außerhalb der Reihenfolge und mehrere Kerne an . Diese führen dazu, dass die CPU mehrere Dinge gleichzeitig ausführt, z. B. verarbeiten Pipelines verschiedene Phasen nachfolgender Anweisungen parallel innerhalb derselben Verarbeitungseinheit, während mehrere Kerne unabhängige Anweisungen parallel verarbeiten können.
quelle
Sie sollten in einem Buch ausführlich nachsehen, um weitere Informationen zur Funktionsweise zu erhalten, möglicherweise auch in einer Compiler-Klasse.
Grundsätzlich konzentriert sich Ihre Frage auf zwei verschiedene Aspekte.
1) Wie wird der Code in Maschinencode übersetzt?
2) Wann / wie wird der Code mittels Parallelisierung berechnet?
Die Antwort auf 1) hängt von der Sprache ab, die Sie verwenden (obwohl dies für Ihr Beispiel trivial ist, sodass die Ausgabe dieselbe wäre). Die Art und Weise, wie der Compiler die Übersetzung in Maschinencode durchführt, ist eine der Stärken der Sprache. Außerdem gibt es einige Bedenken, die in Ihrem Beispiel berücksichtigt werden müssen. Der Code sollte die Daten in den Speicher laden, speichern usw.
Schließlich ist Parallelisierung eine Funktion, die Sie aus programmtechnischer Sicht erzwingen können. Kurz gesagt, einige Prozessoren versuchen möglicherweise zu glauben, dass ein Teil des Codes gleichzeitig ausgeführt werden kann, da sie unabhängig sind. In Ihrem Fall ist dies natürlich nicht der Fall, da Sie die Anweisungen nacheinander ausführen müssen. Nein, sie werden nicht gleichzeitig ausgeführt.
quelle