Cにはコンパイラーがあることは知っていますが、実行パフォーマンスを決定するものは何ですか?
たとえば、if elseブロックで、if elseの代わりにすべてのifがコードに含まれている場合、すべてのifが実行されると判断するものは何ですか?JavaではJVMになりますが、Cでは実行コンパイラのことは何ですか?
Cにはコンパイラーがあることは知っていますが、実行パフォーマンスを決定するものは何ですか?
たとえば、if elseブロックで、if elseの代わりにすべてのifがコードに含まれている場合、すべてのifが実行されると判断するものは何ですか?JavaではJVMになりますが、Cでは実行コンパイラのことは何ですか?
回答:
Javaでは、仮想マシンがコードを実行しますが、Cコンパイラは実際のマシンが実行するコードを生成します。正確には、どちらの場合もプログラムは実際のマシンコードに変換されますが、Javaの場合は、JVMバイトコードにコンパイルする中間ステップがあります。
したがって、Javaプログラムはロード時にJVMによって実際の命令に変換されますが、Cプログラムは実行前にコンパイラによって既に実際の命令に変換されます。
マシンコード以外に、ハードウェア上で直接実行されるプログラミング言語は存在しません。つまり、リテラルソーステキストをフィードできないという意味です。すべての実際の実装では、ソースプログラムを「マシン」の言語に翻訳する必要があります。
一部の実装では、静的に翻訳されます。通常、これらの実装は「コンパイル済み」と呼ばれます。他の人のために、それは何らかの中間形式に翻訳され、その後、プログラムが実行されると動的に翻訳されます。通常、これらの実装を「解釈済み」と呼びます。これらの間には連続した可能性があり、現代の多くのCPUでさえ、その実行コアの一部として動的変換を行います。
プログラムが実行のかなり前に静的にコンパイルされている場合でも、ファームウェアを記述している場合を除き、コンパイルされたコードがベアメタル上で直接実行されることはまれです。オペレーティングシステムは、ユーザー空間プログラム用の仮想マシンを提供し、多くの場合、CPUがすべて揃っているという錯覚などの機能を提供します。マシンに接続されている物理RAMよりも大きいフラットメモリスペースの錯覚は、「仮想メモリ」とも呼ばれます。
さらに、Cでプログラミングしている場合でも、C仮想マシンがあります!従来、「Cランタイム」または略してCRTと呼ばれていました。
Cはほとんどの場合事前にアセンブリ/マシンコードに直接変換されるため(プラットフォームによっては、スレッドコードもあり、仮想マシンの一部と見なすことができます)、通常、仮想マシンは起動とシャットダウン。
通常、起動にはスタックとヒープの設定が含まれます。オペレーティングシステムがこれらを提供することはめったになく、これらをプログラマに提供するのはプログラミング言語の仕事です。一部のプラットフォームでは、シグナル処理の初期化、マルチスレッド環境での「メイン」スレッドのセットアップ、プログラムがC ++コードにリンクされている可能性のないグローバルコンストラクターの実行、動的リンクライブラリの処理などがあります。 argc / argvおよびenvpをセットアップするために必要な処理である可能性があります。最後に、CRTは制御をメインに転送します。
シャットダウンに関しては、多くのオペレーティングシステムがプロセスを不当に強制終了する可能性があるため、シャットダウンはあまり必要ありません。主なことは、プログラムが正常に終了する場合のatexit()呼び出しを処理することです。