オブジェクトコード、マシンコード、アセンブリコードの違いは何ですか?
それらの違いを視覚的に例を挙げていただけますか?
マシンコードは、CPUによって直接実行できるバイナリ(1と0)コードです。テキストエディターでマシンコードファイルを開くと、印刷できない文字(no、notthoseの印刷不可能な文字を含む)を含むゴミが表示されます。
オブジェクトコードは、完全なプログラムにまだリンクされていないマシンコードの一部です。完成した製品を構成するのは、特定のライブラリまたはモジュールのマシンコードです。また、完成したプログラムのマシンコードにないプレースホルダーまたはオフセットが含まれている場合があります。 リンカーは、これらのプレースホルダーとオフセットを使用してすべてを接続します。
アセンブリコードは、プレーンテキストであり、人間が読み取り可能なソースコードで、ほとんどが機械命令との直接的な1:1アナログを持っています。これは、実際の命令、レジスタ、またはその他のリソースのニーモニックを使用して実現されます。例には、CPUのジャンプおよび乗算命令のJMP
およびMULT
が含まれます。マシンコードとは異なり、CPUはアセンブリコードを理解しません。 アセンブラーまたはコンパイラーを使用して、アセンブリコードをマシンに変換しますが、通常、コンパイラーは、 CPU命令。
完全なプログラムを構築するには、アセンブリまたはC++などの高レベル言語のいずれかのプログラムに対してソースコードを記述する必要があります。ソースコードはオブジェクトコードにアセンブル(アセンブリコード用)またはコンパイル(高レベル言語用)され、個々のモジュールはリンクされて最終プログラムのマシンコードになります。非常に単純なプログラムの場合、リンク手順は必要ない場合があります。 IDE(統合開発環境)などのその他の場合、リンカーとコンパイラーを一緒に呼び出すことができます。その他の場合、複雑なmakeスクリプトまたはsolutionファイルを使用して、最終的なアプリケーションの構築方法を環境に伝えることができます。
解釈された言語もあり、異なる動作をします。解釈された言語は、特別なインタープリタープログラムのマシンコードに依存しています。基本レベルでは、インタープリターがソースコードを解析し、コマンドをすぐに新しいマシンコードに変換して実行します。 runtime-environmentまたはvirtual machineとも呼ばれる最新のインタープリターは、はるかに複雑です:一度にソースコードのセクション全体を評価し、可能な場合はキャッシュと最適化を行い、複雑なメモリ管理タスクの処理。インタプリタ言語は、アセンブリコードと同様に、下位レベルの中間言語またはバイトコードにプリコンパイルされる場合もあります。
他の回答は違いの良い説明を提供しましたが、ビジュアルも要求しました。 Cコードから実行可能ファイルへの道のりを示す図を次に示します。
アセンブリコードは、人間が読み取れるマシンコードの表現です。
mov eax, 77
jmp anywhere
マシンコードは純粋な16進コードです。
5F 3A E3 F1
オブジェクトファイルのようなオブジェクトコードを意味すると思います。これはマシンコードの変形ですが、ジャンプがパラメーター化されており、リンカーが入力できるようになっています。
アセンブラは、アセンブリコードをマシンコード(オブジェクトコード)に変換するために使用されます。リンカは、複数のオブジェクト(およびライブラリ)ファイルをリンクして実行可能ファイルを生成します。
アセンブラープログラムを純粋な16進数(アセンブラーなし)で書いたことがありますが、幸運なことに、これは古き良き(古代)6502に遡ります。
8B 5D 32
はマシンコードです
mov ebx, [ebp+32h]
はアセンブリです
lmylib.so
を含む8B 5D 32
はオブジェクトコードです
まだ言及されていない点の1つは、アセンブリコードにはいくつかの種類があることです。最も基本的な形式では、命令で使用されるすべての数値は定数として指定する必要があります。例えば:
$ 1902:BD 37 14:LDA $ 1437、X $ 1905:85 03:STA $ 03 $ 1907:85 09:STA $ 09 $ 1909:CA:DEX $ 190A:10:BPL $ 1902
上記のコードは、Atari 2600カートリッジのアドレス$ 1900に保存されている場合、アドレス$ 1437で始まるテーブルから取得したさまざまな色の行を表示します。一部のツールでは、上の行の右端の部分とともにアドレスを入力すると、中央の列に示されている値がメモリに保存され、次のアドレスで次の行が開始されます。その形式でコードを入力することは、16進数で入力するよりもはるかに便利ですが、すべての正確なアドレスを知る必要がありました。
ほとんどのアセンブラでは、シンボリックアドレスを使用できます。上記のコードは次のように記述されます。
Rainbow_lp: lda ColorTbl、x sta WSYNC sta COLUBK dex bpl Rainbow_lp
アセンブラはLDA命令を自動的に調整し、ColorTblラベルにマップされたアドレスを参照するようにします。このスタイルのアセンブラを使用すると、すべてのアドレスを手動でキー入力して維持する必要がある場合よりも、コードの記述と編集がはるかに簡単になります。
ソースコード、アセンブリコード、マシンコード、オブジェクトコード、バイトコード、実行可能ファイル、ライブラリファイル。
これらの用語はすべて、彼らが相互に排他的であると考えるという事実のために、ほとんどの人にとってしばしば非常に紛らわしいです。これらの関係を理解するには、図を参照してください。各用語の説明を以下に示します。
人間が読める(プログラミング)言語の指示
高レベル(プログラミング)言語で書かれた命令
e.g.、C、C++、Javaプログラム
アセンブリ言語(低レベルプログラミング言語の一種)で記述された命令。コンパイルプロセスの最初のステップとして、高レベルのコードがこの形式に変換されます。その後、実際のマシンコードに変換されるのはアセンブリコードです。ほとんどのシステムでは、これらの2つのステップはコンパイルプロセスの一部として自動的に実行されます。
e.g.、program.asm
コンパイルプロセスの成果物。マシンコードまたはバイトコードの形式である場合があります。
e.g.、file.o
機械語での指示。
e.g。、a.out
JVMなどのインタープリターによって実行できる中間形式の命令。
e.g。、Javaクラスファイル
リンクプロセスの製品。これらは、CPUによって直接実行できるマシンコードです。
e.g。、。exeファイル。
一部のコンテキストでは、バイトコードまたはスクリプト言語の命令を含むファイルも実行可能と見なされる場合があります。
一部のコードは、再利用性などのさまざまな理由でこの形式にコンパイルされ、後で実行可能ファイルで使用されます。
これらが主な違いだと思います
可読性により、コードを作成してから6か月後にコードを改善または置換できます。一方、パフォーマンスが重要な場合は、低レベル言語を使用して、本番環境にある特定のハードウェアをターゲットにすることができます。より高速な実行。
今日のIMOは、プログラマーがOOPを使用して高速に実行できるほど高速です。
アセンブリは、人間が理解できる短い記述用語であり、CPUが実際に使用するマシンコードに直接変換できます。
アセンブラーは人間にはある程度理解できますが、まだ低レベルです。役に立つことをするには多くのコードが必要です。
そのため、代わりにC、BASIC、FORTANなどの高レベル言語を使用します(わかりました)。これらをコンパイルすると、オブジェクトコードが生成されます。初期の言語では、オブジェクトコードとして機械語が使用されていました。
JavaやC#などの今日の多くの言語は通常、マシンコードではなく、実行時に簡単に解釈されてマシンコードを生成するバイトコードにコンパイルされます。