2016-12-22 39 views
0

基本的なことコンピュータの命令/プログラムの機能を使って、高レベル言語でソースコードを書くことを学びました。コンパイラは低レベル言語(機械コード/オブジェクトコード)に変換します。アセンブラーはアセンブリ言語を機械コード/オブジェクトコードに変換することも学びました。コンパイラは直接ローレベルにハイレベルを変換する場合は、このアセンブリ言語が生成されることから高水準言語をアセンブリ言語に変換する人


  1. は、それから私は、次の疑問を持っています。

  2. 変換プロセスは、アセンブリ言語、すなわちを通過する必要がある場合

高水準言語====>アセンブリ言語====>オブジェクトコード/マシンコードは、
はその後、変換

アセンブリ言語にこの高水準の言語とは何ですか?

+0

一般に、誰もいません。高レベルのコンパイラは、ソースコードを*アセンブリ言語*に変換しません。むしろ、オブジェクトコード/マシンコードに直接変換します。アセンブリ言語は、プログラマのために設計された、人間が読めるオブジェクト/マシンコードのバージョンです。 (しかし、他の答えが示唆しているように、生成されたオブジェクト/マシンコードのアセンブリコードのリストを与えるために、コンパイラに高水準言語を依頼することはほとんどいつでも可能です。発生する)。 –

+1

@CodyGray:gccは非常に広く使用されています。実際には、コンパイラからのテキスト出力としてasmを作成し、別の実行可能プログラムを実行する別個のプロセスとしてアセンブラを実行します。 (tmpファイルまたはパイプ)。 'binutils'はgcc自身とは別のパッケージです。したがって、コンパイラの中にはこのようにコンパイルするものがあります。 Clangはそうではなく、ポータブルでないコンパイラもしばしばマシンコードに直面することがよくあります。 –

+0

機械語を表現する方法としてアセンブリ言語を表示できます。アセンブリ言語ステーションでコンパイラを停止する必要はありません。 –

答えて

2

これは非常に一般的な質問です(正直言って理解しにくいです)。

高水準言語のコンパイラは、高水準コードをアセンブラに変換し、セカンダリユーティリティは、アセンブラをマシンコードと呼ぶものに変換できます。コンパイラはマシンコードを直接生成することもできます。どちらのオプションも有効で、どれが最適かを判断するのはコンパイラの設計者次第です。

しかし、アセンブリは "マシンコード"から一歩離れているので、コンパイラが何をしたのかを読むために読むことができると便利なことがよくあります。時にはこれによって、高レベルのコードを最適化するための洞察が得られます。 1337プログラマは、手作業でアセンブリを編集することを選択するかもしれません。このため、たとえコンパイラがマシンコードを直接生成するようであっても、代わりにアセンブリコードを生成することができます。

詳細はthis SO answerを参照してください。

+2

'gcc -S -fverbose-asm'は実際にasmにコメントを入れます。単純にマシンコードの出力を逆アセンブルするより意味があります。 ICC(インテルのコンパイラ)は支店での確率についての見積もり率を支店に設定します。 clangの '-fverbose-asm'には、SIMDベクトルシャッフルが何をするかを示すコメント(例えば' xmm0 = xmm1 [3,2,3,2] ')が含まれています。 –

+0

@リチャード:ありがとうございます、実装に依存していることをありがとうございます.2つのケースがあります - 1.CompilerはHLLをアセンブリ言語に変換し、アセンブリ言語をLL言語(マシンコード/オブジェクトコード)2に変換します.Complerは、HLLをLLL(machine code/object code)に直接変換します。これらの2つの概念について私を助けてくれれば感謝します。OBJECT CODEまたはMACHINE CODE ..これらが生成されたときは? – laura

+1

@ laura:このサイトのフォーマットは、可能な限り、一度に1つの質問のみを尋ねることです。その質問に対する回答がまだ存在していない場合は、新しい質問としてそれを質問する必要があります。 – Richard

2

これは、不正確な用語と特定の実装の問題です。

"古典的な"モデルでは、コンパイラは高水準コードをアセンブリに変換し、アセンブラはそれをオブジェクトファイルに格納されたマシンコードにアセンブルし、オブジェクトファイルにリンクして実行可能ファイルを生成します。

通常、コンパイラドライバを使用してコンパイラを呼び出すため、これらの手順はほとんど隠されています(特にアセンブリ部分)。このコンパイラドライバは、このツールチェーンのすべての部分を自動的に呼び出します。何らかのレベルで何が起こっているのかを調べることができます(コンパイラの作業を検査するためにアセンブリレベルで停止することは十分に面白く、several sites dedicated just to thatもあります)。

これはかなり高いレベルのビューであり、言語や実装によっては、いくつかのステップが異なるか処理が異なる可能性があります。たとえば、コンパイラで直接マシンコードを生成したり、 (リンクタイムコードの生成を有効にすると、これは常に発生します)。したがって、上記のスキーマは基本的な流れを理解するのに役立つスキーマですが、実行可能な可能性を網羅しているわけではありません。高水準の言語が入力される限り、ある種の実行可能コードが終了すると、何かが行きます。

関連する問題