オブジェクトコード、マシンコード、アセンブリコードの違いは何ですか?
それらの違いの視覚的な例を挙げていただけますか?
オブジェクトコード、マシンコード、アセンブリコードの違いは何ですか?
それらの違いの視覚的な例を挙げていただけますか?
回答:
マシンコードは、CPUが直接実行できるバイナリ(1と0)コードです。あなたはテキストエディタでマシンコードのファイルを開くとしたら、あなたは印刷できない文字を含む、ごみを参照してくださいだろう(いや、ないものを印刷不能文字;))。
オブジェクトコードは、まだ完全なプログラムにリンクされていないマシンコードの一部です。完成した製品を構成するのは、特定の1つのライブラリーまたはモジュールのマシンコードです。また、完成したプログラムのマシンコードにはないプレースホルダーまたはオフセットが含まれている場合もあります。リンカは、接続のすべての一緒にこれらのプレースホルダとオフセットを使用します。
アセンブリコードはプレーンテキストであり、人間の読み取り可能なソースコードであり、ほとんどが機械語命令を含む直接1:1アナログです。これは、実際の命令、レジスタ、またはその他のリソースのニーモニックを使用して実現されます。例としては、JMP
およびMULT
CPUのジャンプと乗算命令のために。マシンコードとは異なり、CPUはアセンブリコードを認識しません。アセンブラーまたはコンパイラーを使用して、アセンブリコードをマシンに変換しますが、通常、コンパイラーは、CPU命令からさらに抽象化された高水準プログラミング言語と関連していると考えられています。
完全なプログラムの構築には、アセンブリまたはC ++のような高水準言語のいずれかでプログラムのソースコードを記述することが含まれます。ソースコードはオブジェクトコードにアセンブル(アセンブリコードの場合)またはコンパイル(高水準言語の場合)され、個々のモジュールがリンクされて最終的なプログラムのマシンコードになります。非常に単純なプログラムの場合、リンク手順は必要ない場合があります。IDE(統合開発環境)などの他のケースでは、リンカーとコンパイラを一緒に呼び出すことができます。その他の場合では、複雑なmakeスクリプトまたはソリューションファイルを使用して、最終的なアプリケーションの構築方法を環境に伝えることができます。
異なる動作をするインタプリタ言語もあります。解釈された言語は、特別な解釈プログラムのマシンコードに依存しています。基本レベルでは、インタープリターがソースコードを解析し、コマンドをすぐに新しいマシンコードに変換して実行します。ランタイム環境または仮想マシンとも呼ばれる最新のインタープリターは、ソースコードのセクション全体を一度に評価し、可能な場合はキャッシュして最適化し、複雑なメモリ管理タスクを処理するという、はるかに複雑なものです。インタプリタ言語は、アセンブリコードと同様に、下位レベルの中間言語またはバイトコードにプリコンパイルすることもできます。
他の答えは違いの良い説明を与えましたが、あなたもビジュアルを求めました。以下は、Cコードから実行可能ファイルへの移行を示す図です。
アセンブリコードは、人間が読める機械コードの表現です。
mov eax, 77
jmp anywhere
マシンコードは純粋な16進コードです:
5F 3A E3 F1
私はあなたがオブジェクトファイルのようなオブジェクトコードを意味すると思います。これはマシンコードのバリアントですが、リンカがジャンプできるようにジャンプがパラメータ化されているという違いがあります。
アセンブラは、アセンブリコードをマシンコード(オブジェクトコード)に変換するために使用されます。リンカは、いくつかのオブジェクト(およびライブラリ)ファイルをリンクして、実行可能ファイルを生成します。
私はかつてアセンブラープログラムを純粋な16進数(アセンブラーなし)で書いたことがありましたが、幸いにもこれは古き良き(古代)6502にさかのぼります。
まだ言及されていない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にマップされたアドレスを参照するようにします。このスタイルのアセンブラを使用すると、すべてのアドレスを手動でキー入力して管理する必要がある場合よりも、コードの記述と編集がはるかに簡単になります。
ソースコード、アセンブリコード、マシンコード、オブジェクトコード、バイトコード、実行可能ファイル、ライブラリファイル。
多くの場合、これらの用語はすべて、相互に排他的であると考えるため、非常に混乱します。図を参照して、それらの関係を理解してください。各用語の説明を以下に示します。
人間が読める(プログラミング)言語での指示
高水準(プログラミング)言語で記述された命令(
C、C ++、Javaプログラムなど)
アセンブリ言語(一種の低水準プログラミング言語)で記述された命令。コンパイルプロセスの最初のステップとして、高レベルのコードがこの形式に変換されます。これは、実際のマシンコードに変換されるアセンブリコードです。ほとんどのシステムでは、これら2つのステップはコンパイルプロセスの一部として自動的に実行されます。
例:program.asm
コンパイルプロセスの結果。マシンコードまたはバイトコードの形式である場合があります。
例:file.o
機械語での説明。
例:a.out
JVMなどのインタプリタで実行できる中間形式の命令。
例:Javaクラスファイル
リンクプロセスの製品。これらは、CPUが直接実行できるマシンコードです。
たとえば、.exeファイル。
一部のコンテキストでは、バイトコードまたはスクリプト言語の命令を含むファイルも実行可能と見なされる場合があることに注意してください。
一部のコードは、再利用性などのさまざまな理由でこの形式にコンパイルされ、後で実行可能ファイルによって使用されます。
cc1
実行可能ファイル内に組み込みのアセンブラーを持たず、別のアセンブラーに供給するasmテキストを実際に作成します)。一部のasmは単なるソースであり、ソースではないため、asmサークルは「ソース」サークルの左側に突き出ているはずです。もちろんそれは決してオブジェクトコードではありませんが、いくつかのasmはソースからオブジェクトファイルへの途中のステップです。
これらが主な違いだと思います
読みやすさにより、わずかな労力で作成されてから6か月後にコードが改善または置き換えられる可能性があります。一方、パフォーマンスが重要な場合は、低レベル言語を使用して、本番環境で使用する特定のハードウェアをターゲットにして、より速い実行。
今日のIMOのコンピューターは、プログラマーがOOPで高速に実行できるほど高速です。
アセンブリは、人間が理解できる短い説明的な用語であり、CPUが実際に使用するマシンコードに直接変換できます。
人間にはある程度理解できるが、アセンブラはまだ低レベルです。有用なことを行うには多くのコードが必要です。
したがって、代わりに、C、BASIC、FORTANなどの高レベルの言語を使用します(私は自分自身とデートしたことを知っています)。コンパイルすると、オブジェクトコードが生成されます。初期の言語では、オブジェクトコードとして機械語が使用されていました。
現在、JAVAやC#などの多くの言語は、通常、マシンコードではなく、実行時に簡単に解釈してマシンコードを生成するバイトコードにコンパイルされます。
プログラムのソースファイルはオブジェクトファイルにコンパイルされ、リンカーはそれらのオブジェクトファイルをリンクして、アーキテクチャのマシンコードを含む実行可能ファイルを生成します。
オブジェクトファイルと実行可能ファイルの両方に、テキストエディターで開いたときに、印刷可能な文字と印刷できない文字の形式のアーキテクチャのマシンコードが含まれます。
それにもかかわらず、ファイル間の二分は、オブジェクトファイルが未解決の外部参照(たとえばなど)を含む可能性があるということですprintf
。したがって、他のオブジェクトファイルに対してリンクする必要がある場合があります。つまり、C / C ++ランタイムライブラリなどの他のオブジェクトファイルとリンクして適切な実行可能実行可能ファイルを取得するには、未解決の外部参照を解決する必要があります。 。