In der Schule wurde uns beigebracht, dass Compiler ein Computerprogramm kompilieren, um Sprache zu bearbeiten. Uns wurde auch beigebracht, dass die Maschinensprache aus direkten Anweisungen für die Hardware besteht. Wie kann das gleiche kompilierte Programm auf mehreren Computerkonfigurationen mit unterschiedlicher Hardware ausgeführt werden?Wie kann ein auf Maschinensprache kompiliertes Programm auf verschiedenen Maschinen ausgeführt werden?
Antwort
Hängt davon ab, was Sie mit "anderer Hardware" meinen, wenn es sich um den gleichen Prozessor (oder die selbe Familie, zB Intel x86) handelt, dann sind die Maschinencode-Anweisungen identisch.
Wenn die zusätzliche Hardware unterscheidet sich Peripheriegeräte (Bildschirme, Laufwerke Drucker usw.), dann das Betriebssystem diese Details versteckt, indem Sie einen einheitlichen Satz von Anweisungen zu geben, sie zu fahren
Wenn Sie meinen, wie können Sie ein Programm ausführen für eine ARM-CPU auf einem Intel x86, dann können Sie nicht - außer durch eine Art von virtuellen Maschine Emulator, der jede der ARM-Anweisungen liest und entweder übersetzt sie in x86 oder führt die gleiche Funktionalität wie eine Reihe von x86-Funktionen und kehrt dann zurück die gleiche Antwort, die die ARMs getan hätten.
Edit: Ich nehme an, Sie meinen PCs mit unterschiedlichen hw - dh verschiedene Peripheriegeräte, aber die gleiche Prozessorfamilie?
Das Sprechen mit Hardware beinhaltet keine spezifischen Anweisungen als solche - es ist hauptsächlich eine Frage des Verschiebens von Speicher an bestimmte Stellen, an denen das Betriebssystem und/oder der Gerätetreiber speziell Daten für dieses Gerät reserviert haben. In den alten Tagen von DOS und BIOS würden Sie dann einen Interrupt auslösen, um einen bestimmten Code im BIOS aufzurufen, um auf diese Daten zu reagieren und sie an die Hardware zu senden.
Mit einem Emulator oder einer virtuellen Maschine, von denen jede die Maschinensprache im laufenden Betrieb übersetzt.
Sie meinen also, dass eine Art von Emulation immer in diesem Prozess verwendet wird? –
@BobbyMarinoff: In Situationen, in denen Sie Code für eine CPU-Architektur kompiliert haben und ihn auf einer anderen CPU-Architektur ausführen, muss etwas ausgeführt werden. –
Ich denke es ist genauer zu sagen, dass native Compiler zu einem bestimmten Befehlssatz eines Prozessors kompilieren. Da es Familien von Prozessoren gibt, die rückwärtskompatibel sind: 8086 - 80386 - 80486 - 80586 - Dual Core - Quad Core ...; dann führt jeder Prozessor die Anweisungen seiner Vorfahren aus. Wenn Sie Ihren Code über Prozessorarchitekturen hinweg portieren möchten, benötigen Sie eine virtuelle Maschine oder einen Emulator, wie bereits erwähnt.
Danke für die knappe Antwort. Ich konnte nicht verstehen, wie ein Programm eine Verbindung zur API des Betriebssystems herstellt. Ich stelle mir vor, dass es eine Abstraktionsebene gibt, die zwischen dem Programm und dem Prozessor liegt und die einige Anweisungen ausführt und die anderen an den Prozessor übergibt. Und in welche Sprache (oder Sprachen) sind diese "virtuellen" Anweisungen geschrieben? Wo kann ich mehr über diesen Prozess lesen? –
Es bewegt sich nur der Speicher und nicht spezifische Anweisungen. In den alten Zeiten war es einfacher - der Bildschirm war an einer bestimmten Adresse, du hast '65' an diese Adresse geschrieben und ein 'A' erschien in der oberen Ecke, du hast 1 an einen anderen Ort geschrieben und es hat die Farbe dieses Charts gesetzt rot. –
Ein C-Programm, das kompiliert wurde, wird mit Bibliotheken verknüpft, die sich auf dem aktuellen Computer befinden. Selbst wenn die Prozessorarchitektur die gleiche ist, würde, wenn eine ausführbare Datei von Computer A auf Computer B verschoben wird, die ausführbare Datei nicht ausgeführt, wenn Computer B nicht dieselben Bibliotheken wie Computer A hat? – Sophtware