webentwicklung-frage-antwort-db.com.de

Baugruppencode vs Maschinencode vs Objektcode?

Was ist der Unterschied zwischen Objektcode, Maschinencode und Baugruppencode?

Können Sie ein visuelles Beispiel für ihren Unterschied geben?

209
mmcdole

Maschinencode ist ein Binärcode (1 und 0), der direkt von der CPU ausgeführt werden kann. Wenn Sie eine Maschinencodedatei in einem Texteditor öffnen würden, würden Sie Müll sehen, einschließlich nicht druckbarer Zeichen (nein, nicht diese nicht druckbaren Zeichen;)).

Objektcode ist ein Teil des Maschinencodes, der noch nicht zu einem vollständigen Programm verknüpft wurde. Es ist der Maschinencode für eine bestimmte Bibliothek oder ein bestimmtes Modul, aus dem das fertige Produkt besteht. Es kann auch Platzhalter oder Offsets enthalten, die nicht im Maschinencode eines abgeschlossenen Programms enthalten sind. Der Linker verwendet diese Platzhalter und Offsets, um alles miteinander zu verbinden.

Assembly-Code ist Klartext- und (etwas) menschenlesbarer Quellcode, der meistens ein direktes 1: 1-Analogon mit Maschinenanweisungen enthält. Dies wird mit Hilfe von Mnemoniken für die tatsächlichen Anweisungen, Register oder anderen Ressourcen erreicht. Beispiele sind JMP und MULT für die Sprung- und Multiplikationsanweisungen der CPU. Im Gegensatz zum Maschinencode versteht die CPU den Assembly-Code nicht. Sie konvertieren Assembly-Code mithilfe eines Assembler oder eines Compiler in einen Computer, obwohl wir normalerweise an Compiler denken, die mit einer höheren Programmiersprache in Verbindung stehen, die weiter von der abstrahiert ist CPU-Anweisungen.

Zum Erstellen eines vollständigen Programms muss Quellcode für das Programm in Assembly oder einer höheren Sprache wie C++ geschrieben werden. Der Quellcode wird zu Objektcode zusammengestellt (für Assembly-Code) oder kompiliert (für übergeordnete Sprachen), und einzelne Module werden miteinander verknüpft, um den Maschinencode für das endgültige Programm zu erhalten. Bei sehr einfachen Programmen ist der Verknüpfungsschritt möglicherweise nicht erforderlich. In anderen Fällen, zum Beispiel mit einer IDE (integrierte Entwicklungsumgebung)), können der Linker und der Compiler zusammen aufgerufen werden. In anderen Fällen kann ein kompliziertes make Skript oder - solution file kann verwendet werden, um der Umgebung mitzuteilen, wie die endgültige Anwendung erstellt werden soll.

Es gibt auch interpretierte Sprachen, die sich anders verhalten. Interpretierte Sprachen basieren auf dem Maschinencode eines speziellen Interpreterprogramms. Auf der Basisebene analysiert ein Interpreter den Quellcode, konvertiert die Befehle sofort in neuen Maschinencode und führt sie aus. Moderne Interpreter, die manchmal auch als Laufzeitumgebung oder virtuelle Maschine bezeichnet werden, sind viel komplizierter: Sie können ganze Abschnitte des Quellcodes gleichzeitig auswerten, wenn möglich zwischenspeichern und optimieren und Bewältigung komplexer Speicherverwaltungsaufgaben. Eine interpretierte Sprache kann auch zu einer Zwischensprache oder einem Bytecode einer niedrigeren Ebene vorkompiliert werden, ähnlich dem Assembler-Code.

269
Joel Coehoorn

Die anderen Antworten gaben eine gute Beschreibung des Unterschieds, aber Sie fragten auch nach einer visuellen Darstellung. Hier ist ein Diagramm, das zeigt, wie sie vom C-Code zu einer ausführbaren Datei wechseln.

117
Graphics Noob

Assembler-Code ist eine von Menschen lesbare Darstellung des Maschinencodes:

mov eax, 77
jmp anywhere

Maschinencode ist reiner Hexadezimalcode:

5F 3A E3 F1

Ich nehme an, Sie meinen Objektcode wie in einer Objektdatei. Dies ist eine Variante des Maschinencodes, mit dem Unterschied, dass die Sprünge so parametrisiert sind, dass ein Linker sie ausfüllen kann.

Ein Assembler konvertiert Assembly-Code in Maschinencode (Objektcode). Ein Linker verknüpft mehrere Objektdateien (und Bibliotheksdateien), um eine ausführbare Datei zu generieren.

Ich habe einmal ein Assembler-Programm in reinem Hex geschrieben (kein Assembler verfügbar), zum Glück war dies eine Zeitreise zurück zum guten alten 6502. Aber ich bin froh, dass es Assembler für die Pentium-Opcodes gibt.

47
Toon Krijthe

8B 5D 32 ist Maschinencode

mov ebx, [ebp+32h] ist Versammlung

lmylib.so mit 8B 5D 32 ist Objektcode

17
Quassnoi

Ein Punkt, der noch nicht erwähnt wurde, ist, dass es einige verschiedene Arten von Assembly-Code gibt. In der einfachsten Form müssen alle in Anweisungen verwendeten Zahlen als Konstanten angegeben werden. Beispielsweise:

 $ 1902: BD 37 14: LDA $ 1437, X 
 $ 1905: 85 03: STA $ 03 
 $ 1907: 85 09: STA $ 09 
 $ 1909: CA: DEX 
 $ 190A: 10: BPL $ 1902 

Das obige Codebit zeigt, wenn es unter der Adresse $ 1900 in einer Atari 2600-Kassette gespeichert ist, eine Reihe von Zeilen in verschiedenen Farben an, die aus einer Tabelle ab der Adresse $ 1437 abgerufen werden. Bei einigen Tools speichert die Eingabe einer Adresse zusammen mit dem äußersten rechten Teil der obigen Zeile die in der mittleren Spalte angezeigten Werte und beginnt die nächste Zeile mit der folgenden Adresse. Das Eingeben von Code in dieser Form war viel praktischer als das Eingeben von Hex, aber man musste die genauen Adressen von allem kennen.

Die meisten Assembler erlauben die Verwendung symbolischer Adressen. Der obige Code würde eher wie folgt geschrieben:

 Rainbow_lp: 
 Lda ColorTbl, x 
 Sta WSYNC 
 Sta COLUBK 
 Dex 
 Bpl Rainbow_lp 

Der Assembler würde den LDA-Befehl automatisch so anpassen, dass er sich auf die Adresse bezieht, die dem Etikett ColorTbl zugeordnet ist. Die Verwendung dieses Assembler-Stils erleichtert das Schreiben und Bearbeiten von Code erheblich, als dies möglich wäre, wenn alle Adressen manuell eingegeben und verwaltet werden müssten.

7
supercat

Quellcode, Assembly-Code, Maschinencode, Objektcode, Byte-Code, ausführbare Datei und Bibliotheksdatei.

All diese Begriffe sind für die meisten Menschen oftmals sehr verwirrend, da sie glauben, dass sie sich gegenseitig ausschließen . Sehen Sie sich das Diagramm an, um ihre Beziehungen zu verstehen. Die Beschreibung jedes Begriffs ist unten angegeben.


Types of code


Quellcode

Anweisungen in menschenlesbarer (Programmier-) Sprache


Code auf hoher Ebene

Anweisungen in einer höheren Programmiersprache
, z. B. C, C++ und Java Programme


Assembler-Code

Anweisungen, die in einer Assemblersprache geschrieben sind (eine Art Programmiersprache auf niedriger Ebene). Als erster Schritt des Kompilierungsprozesses wird Code auf hoher Ebene in dieses Formular konvertiert. Es ist der Assembly-Code, der dann in den tatsächlichen Maschinencode konvertiert wird. Bei den meisten Systemen werden diese beiden Schritte automatisch als Teil des Kompilierungsprozesses ausgeführt.
z. B. program.asm


Objektcode

Das Produkt eines Kompilierungsprozesses. Es kann in Form von Maschinencode oder Bytecode vorliegen.
z.B. file.o


Maschinensprache

Anleitung in Maschinensprache.
z. B. a.out


Byte-Code

Anweisung in einer Zwischenform, die von einem Interpreter wie JVM ausgeführt werden kann.
z. B. Java class file


Ausführbare Datei

Das Produkt des Verknüpfungsprozesses. Es handelt sich um Maschinencode, der direkt von der CPU ausgeführt werden kann.
z. B. eine .exe-Datei.

Beachten Sie, dass in einigen Kontexten eine Datei, die Anweisungen für Bytecode oder Skriptsprache enthält, auch als ausführbar angesehen werden kann.


Bibliotheksdatei

Einige Codes werden aus verschiedenen Gründen, z. B. aus Gründen der Wiederverwendbarkeit, in dieses Formular kompiliert und später von ausführbaren Dateien verwendet.

2
Anees

Der Assembler-Code wird beschrieben hier .

"Eine Assemblersprache ist eine einfache Programmiersprache für Computer. Sie implementiert eine symbolische Darstellung der numerischen Maschinencodes und anderer Konstanten, die zum Programmieren einer bestimmten CPU-Architektur erforderlich sind."

Maschinencode wird beschrieben hier .

"Maschinencode oder Maschinensprache ist ein System von Anweisungen und Daten, die direkt von der Zentraleinheit eines Computers ausgeführt werden."

Assembler-Code ist im Grunde die Sprache und wird von einem Assembler (analog zu einem Compiler) in Objektcode (den systemeigenen Code, den die CPU ausführt) übersetzt.

1
nzpcmad

Ich denke, das sind die Hauptunterschiede

  • lesbarkeit des Codes
  • kontrolle darüber, was Ihr Code tut

Durch die Lesbarkeit kann der Code 6 Monate nach seiner Erstellung mit geringem Aufwand verbessert oder ersetzt werden. Wenn die Leistung jedoch kritisch ist, sollten Sie möglicherweise eine einfache Sprache verwenden, um auf die spezifische Hardware zuzugreifen, die Sie in der Produktion haben schnellere Ausführung.

IMO-Computer sind heutzutage schnell genug, um einem Programmierer eine schnelle Ausführung mit OOP zu ermöglichen.

1

Assembly ist eine kurze Beschreibung, die Menschen verstehen können und die direkt in den Maschinencode übersetzt werden kann, den eine CPU tatsächlich verwendet.

Assembler ist zwar für Menschen einigermaßen verständlich, aber immer noch auf niedrigem Niveau. Es braucht viel Code, um etwas Nützliches zu tun.

Also verwenden wir stattdessen höhere Sprachen wie C, BASIC, FORTAN (OK, ich weiß, dass ich mich selbst datiert habe). Beim Kompilieren erzeugen diese Objektcode. Frühe Sprachen hatten Maschinensprache als Objektcode.

Viele heutige Sprachen wie Java und C # kompilieren normalerweise einen Bytecode, der kein Maschinencode ist, der aber zur Laufzeit leicht interpretiert werden kann, um Maschinencode zu erzeugen.

1
Jim C