11

たとえば、C アプリケーションをコンパイルすると、出力されたファイルはバイナリとして読み取られますか、それとも OS がコンパイルを解釈しますか? 「機械語」は純粋なバイナリですか?

編集: はい、コンピューター上のすべては純粋なバイナリです。プロセッサがコンパイラによって出力されたファイルを直接解釈するのか、OS が最初に処理するのかを尋ねています。

4

6 に答える 6

20

コンパイルされたプログラムには通常、ヘッダーとそれに続く実際の CPU 命令 (「バイナリ」と呼ばれるもの) + さまざまなその他のデータが含まれます。

OS にプログラムをロードするように指示しようとすると、ヘッダーが OS によって読み取られ、実行可能ファイルが実際にこの OS およびこのアーキテクチャ用の実行可能ファイルであることを確認するために使用されます。つまり、誤って Linux プログラムを Windows などで実行しないようにするためです。

ヘッダーには、実際の CPU 命令が実行ファイル内のどこにあるか、データ セグメント (テキスト、文字列、グラフィックス) がどこにあるかなど、さまざまな情報も含まれています。

実行可能ファイルが本来あるべきものであることを OS が確認すると、OS は実行可能ファイルからさまざまなセグメントをメモリにロードし、CPU に「バイナリ」コード セグメントの実行を開始するように指示します。このコードは、純粋な CPU アセンブリ コードであるという意味で「純粋」です。

ただし、オペレーティング システムは CPU に割り込むことができます (たとえば、別のプログラムに切り替えたり、メモリからプログラムを強制終了したりするなど)。したがって、この実行中のプログラムの周りで多くのことが起こっており、OS がそれを「管理」し、それがナイスボーイのように振る舞うことを確認しますが、実行中のコード自体は純粋な CPU 命令を可能な限り高速に実行しています。 ..OS が間にコードを解釈する必要はありません。

また、実行中のプログラムは、実行中にさまざまな方法で OS を呼び出す場合があることに注意してください。たとえば、ディスプレイ上でウィンドウを開く、ネットワーク接続を開く、メモリを割り当てるなどを OS に要求します。実際に起こっていることは、CPU が別の場所で実行中のコードにジャンプすることだけです (つまり、実行可能ファイルのコードの実行から OS のコードの一部の実行にジャンプし、その後ジャンプして戻ります)。

一言でいうと以上です。ただし、プログラムを実行する方法は他にもたくさんあります。仮想マシン、インタープリター言語 (Java や Ruby など) などがあります。そして、それらはすべて、C/C++ のような従来の「純粋なバイナリ」言語とは異なる方法でプログラムを実行しますが、これがどのように機能するかを少しよく理解するのに役立つことを願っています.

于 2011-07-27T01:54:44.053 に答える
3

あなたが本当に求めているのは、コンパイルされたプログラムがベアメタルで実行されるか (OS とは無関係に実行されるか) だと思います。非常に短い答えは、いいえです。プログラム自体はネイティブの CPU 命令を実行しますが、OS はそれを制限してその動作を制御することができます。さらに、読み込みフェーズ中に、特定の外部 (dll) シンボルを解決する必要があります。最後に、ほとんどのプログラムはさまざまなオペレーティング システムの抽象化に依存しています (たとえば、メモリ アクセス -- 独自のスワップ機能を作成することは非常に困難で無意味です)。この意味で、どのバイナリも自律的なベアメタル マシン コードではありません。

ただし、それら純粋なバイナリです。コンピューター上のすべてのものです。

編集

あなたの質問を解釈する別の方法は、コンパイルされたプログラムは実際にはネイティブの CPU 命令です。答えはイエスです ( OS が支援しなければならないバイナリのロードは別として)。コンパイラは、各行が正確に 1 つの CPU 命令に対応するアセンブリ言語を出力します。これはまだテキストです。アセンブリは、アセンブラによって実際のバイナリにコンパイルされます。

于 2011-07-27T01:21:51.100 に答える
2

「真のバイナリ」とはどういう意味ですか? CPU は内部ゲートとトランジスタのレイアウトに従ってオペコードを「解釈」しますが、コンピュータ内のすべてのデータは 1 と 0 です。バイナリ言語のプラトニックな理想はありません。

于 2011-07-27T01:20:27.863 に答える
0

このようなアプリケーションは、通常、プロセッサによって直接実行される命令であるマシン コードにコンパイルされます。

http://en.wikipedia.org/wiki/Machine_code

x86 ASM は、最も一般的なものの 1 つです。これは、コードが非常に低レベルの言語にコンパイルされると考えてください。これは、金属に沿って直接送信される 1 と 0 だけの上のレイヤーであり、OS は実行される内容を制御できます。しかし、はい、結局のところ、すべてがバイナリに要約されます-PC上のすべてが実行されます!

于 2011-07-27T01:19:47.947 に答える
0

インタープリター言語には仮想マシン コードがあることも考慮する必要があります。(まだバイナリです。) これらは、ソフトウェアのクラスである仮想マシンによってマシン コードに変換されます。(これもバイナリです。)

于 2011-07-27T01:27:52.277 に答える
0

リンカーの概念について誰も言及しなかったのはなぜだろうか。

基本的に、コンパイラの出力は実際にはバイナリ ファイルですが、これには問題があります。このコンパイルされたバイナリ ファイルは、多くの場合、オブジェクト コードを含むオブジェクトファイルと呼ばれます。さて、ここで混乱しないでください。オブジェクト コードは、マシン コードまたはバイナリ コードと呼ばれるものに他なりませんが、その一部にすぎません。コンパイラは通常、1 つのプログラムのソースから複数のオブジェクト ファイルを出力します。したがって、基本的に、これらの各オブジェクト ファイルには、そのプログラムの完全な実行可能なマシン コードの一部が含まれています。ここでリンカの出番です。基本的に、これらすべてのオブジェクト ファイルを完全な実行可能ファイルにリンクします。マシンがプログラムとして実行できること。

于 2014-01-21T14:07:16.830 に答える