JavaにはJVMがありますが、Cには何がありますか?


15

Cにはコンパイラーがあることは知っていますが、実行パフォーマンスを決定するものは何ですか?

たとえば、if elseブロックで、if elseの代わりにすべてのifがコードに含まれている場合、すべてのifが実行されると判断するものは何ですか?JavaではJVMになりますが、Cでは実行コンパイラのことは何ですか?


16
学ぶのに役立つニュアンスは、言語は単なる言語であるということです。たとえば、Cコードを取得してJVMで実行するコンパイラを作成できます。
テラスティン

10
+1。これは非常に良い質問です。私はその無知のためにそれを支持しないだろう-これは多くのJava学生がこれを求めないのは不思議だ。
-djechlin

JavaをマシンコードにコンパイルしてJVMを回避することもできます...
AK_

2
また:プログラミング言語!=フレームワーク!=ランタイムライブラリ!=コンパイラ!=ジャストインタイムコンパイラ!= Interperter
AK_

回答:


17

Javaでは、仮想マシンがコードを実行しますが、Cコンパイラは実際のマシンが実行するコードを生成します。正確には、どちらの場合もプログラムは実際のマシンコードに変換されますが、Javaの場合は、JVMバイトコードにコンパイルする中間ステップがあります。

したがって、Javaプログラムはロード時にJVMによって実際の命令に変換されますが、Cプログラムは実行前にコンパイラによって既に実際の命令に変換されます。


20
Javaを使用してマシンコードを生成するコンパイラがあります。たとえば、Excelsior Jetです。また、実際のマシンが実行するコードを生成しないC(picoc)のインターピーターもあります。言語は言語です。実装は実装です。2つを混同することは、人々を混乱させることがあります。

6

マシンコード以外に、ハードウェア上で直接実行されるプログラミング言語は存在しません。つまり、リテラルソーステキストをフィードできないという意味です。すべての実際の実装では、ソースプログラムを「マシン」の言語に翻訳する必要があります。

一部の実装では、静的に翻訳されます。通常、これらの実装は「コンパイル済み」と呼ばれます。他の人のために、それは何らかの中間形式に翻訳され、その後、プログラムが実行されると動的に翻訳されます。通常、これらの実装を「解釈済み」と呼びます。これらの間には連続した可能性があり、現代の多くのCPUでさえ、その実行コアの一部として動的変換を行います。

プログラムが実行のかなり前に静的にコンパイルされている場合でも、ファームウェアを記述している場合を除き、コンパイルされたコードがベアメタル上で直接実行されることはまれです。オペレーティングシステムは、ユーザー空間プログラム用の仮想マシンを提供し、多くの場合、CPUがすべて揃っているという錯覚などの機能を提供します。マシンに接続されている物理RAMよりも大きいフラットメモリスペースの錯覚は、「仮想メモリ」とも呼ばれます。

さらに、Cでプログラミングしている場合でも、C仮想マシンがあります!従来、「Cランタイム」または略してCRTと呼ばれていました。

Cはほとんどの場合事前にアセンブリ/マシンコードに直接変換されるため(プラットフォームによっては、スレッドコードもあり、仮想マシンの一部と見なすことができます)、通常、仮想マシンは起動とシャットダウン。

通常、起動にはスタックとヒープの設定が含まれます。オペレーティングシステムがこれらを提供することはめったになく、これらをプログラマに提供するのはプログラミング言語の仕事です。一部のプラットフォームでは、シグナル処理の初期化、マルチスレッド環境での「メイン」スレッドのセットアップ、プログラムがC ++コードにリンクされている可能性のないグローバルコンストラクターの実行、動的リンクライブラリの処理などがあります。 argc / argvおよびenvpをセットアップするために必要な処理である可能性があります。最後に、CRTは制御をメインに転送します。

シャットダウンに関しては、多くのオペレーティングシステムがプロセスを不当に強制終了する可能性があるため、シャットダウンはあまり必要ありません。主なことは、プログラムが正常に終了する場合のatexit()呼び出しを処理することです。


2
CランタイムとJVMは、まったく別のものです。CRTは単なるライブラリです。
デッドMG

答えを編集して、物事をもう少し明確にしました。ちなみに、JVMとVirtualBoxもまったく異なるものです。
仮名

@仮名:そうでもない。さて、大丈夫、VirtualBoxはバーチャライザーですが、典​​型的なJVMはエミュレータですが、センテンスで例えばVirtualBoxをQEmuに置き換えた場合、実際には2つは同じです。
ヨルグWミッター
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.