JREがインストールされていない場合にJavaプログラムを実行すると、動作しません。
GoogleChromeブラウザのような有名なアプリケーションのほとんどがC++で書かれていることがわかりました。では、WindowsはC ++のランタイム環境なしでそのようなプログラムをどのように実行するのでしょうか?インストールで実際に何が起こっているのでしょうか?
4 に答える
では、C ++のランタイム環境なしで、Windowsはどのようにそのようなプログラムを実行するのでしょうか。
質問の前提は実際には真実ではありません。少なくともWindowsには、実際にはC++のランタイム環境があります。このランタイムの1つのコンポーネント(おそらく最も重要なコンポーネント)は、CランタイムまたはCRTと呼ばれます。:-)
通常、プログラムがmain()
関数に入る前に、CRTは一連の初期化ルーチンを実行し、main()
関数から戻ると、CRTはそれ自体の後でクリーンアップします。このダンスの要点は、事実上すべてのCおよびC++プログラムが必要とする標準機能を提供することです。
msvcrt.dll
Windowsプログラムを起動するときに、欠落しているものなど(新しいプログラムの場合など)に関連するエラーに遭遇したことがあるmsvcr110.dll
場合は、CRTの欠如がプログラムの不満です。はmsvcrt.dll
CRTを実装するファイルです。「MicrosoftVisualCRuntime」の略です。
明らかにmsvcrt.dll
、その親戚はWindowsオペレーティングシステムに同梱されています。そのため、ユーザーまたはコンピューターの製造元のいずれかがインストールする必要があるJREとは異なり、ランタイム環境が欠落しているという問題は通常発生しません。
ただし、Windows C ++アプリケーションは特定のバージョンのMSVCRTを使用するようにコンパイルされており、MSVCRTのバージョンが間違っていると、オペレーティングシステムは、欠落している場合と同じように文句を言います。*インストーラーが通常行うことは、チェックすることです。 OSのバージョンが正しいこと、そうでない場合は、OSが独自のインストールファイルからコンピュータのどこかにコピーすること。
ただし、MSVCRTは、すべてのWindowsプログラムが機能するための必要条件でも十分条件でもありません。MSVCRTに依存しないプログラムを作成することは完全に可能であり、WindowsプログラムがMSVCRT以外の依存関係を持つことも完全に可能です。事実上すべての重要なWindowsプログラムは、MSVCRTおよびその他のオペレーティングシステムコンポーネントに依存します。プログラムのインストーラーは、これらもチェックします。
JREとMSVCRTの間にはいくつかの重要な違いがあります。大きな違いの1つは、JREがJavaアプリケーション用の仮想マシン環境を実装することです(これにより、「クロスプラットフォーム」機能が実現されます)。これには、ジャストインタイムコンパイルなどが含まれる場合がありますが、MSVCRTは標準機能のみを提供し、何もしません。 C++プログラムのアセンブリコードについて。
* C ++アプリケーションはDLLに依存しないMSVCRTに静的にリンクできるため、これは厳密には正しくありません。ただし、ほとんどのWindows C ++アプリケーションは動的にリンクします。その場合、正しいDLLが必要です。
質問は明白に思えますが、少し掘り下げると、明白にはほど遠いように見えます。より抽象的な見方をさせてください。
すべての言語は、言語の構造を特定のハードウェアに配線する適切なマシンによって「実行」でき、操作を「実行」します。違いは、「配線」がどのように行われるか、つまり、どの程度直接で、いつ設定されるかです。上。
Windows(Linuxでも同じように機能します)マシンは、少なくとも、プロセッサマシンコードによって呼び出される特定の「重要な」DLL(たとえば、Kernel.dll)によって公開される関数のセットです。
Cプログラムは通常、コンパイル時にその「プロトコル」を尊重するシステムコールを配置するマシンコードに変換されます。他の機能を必要としないプログラムは、その環境でネイティブに実行できます。
他の機能を必要とするプログラムは、次のことができます。
- 関数をマシンコードに実装するライブラリに静的にリンクします(実際にはそれらのコードを組み込みます)。これにより、プログラムは引き続きネイティブに実行可能になります。
- これらのライブラリに動的にリンクする:プログラムは、起動時または実行中にこれらのライブラリをロードしてリンクする必要があります。これらのライブラリ自体がすでにオペレーティングシステムの一部である場合は、プログラムが実行されます。それ以外の場合は、これらのライブラリをどこかに配置する必要があります。プログラムはそれらを見つけることができます(OS自体のコンパイルに使用されたバージョン以外のバージョンのCランタイムサポートの場合です)
ちなみに、Javaプログラムは、Java言語が設計および実装されているため、マシンコードに直接変換されません。これは中間言語(バイトコード)に変換され、基盤となるマシンに対してマシンコードで動作することによって実際に命令を実行するインターペッター(Javaマシン)の「入力」として使用する必要があります。
Windows自体はJavaで記述されていないため、そのようなインタープリターは必要ありません。したがって、Windowsのインストールで直接見つけることはできませんが、必要に応じてそこに配置する必要があります。
これを明確にするために、Javaプログラムはjdkを介してバイトコードにコンパイルされ、jreで実行されます。
Windowsで実行するためにjreをコンパイルする必要があるのと同じように、c++プログラムは機械可読コードに直接コンパイルされます。
ランタイム(またはCまたはC ++標準ライブラリ)は、通常、オペレーティングシステム(glibc、msvcrt、...)とともにインストールされます。
C / C ++プログラムは、「静的に」コンパイルすることもできます。この場合、プログラムで使用されるライブラリ部分は実行可能ファイルにリンク(マージ)されるため、プログラムは独自のバイナリファイルにライブラリを持ちます。
Javaコードを実行する「仮想マシン」も。C ++は通常、実行されるシステムのネイティブマシンコードにコンパイルされます。CPUは、それを実行する非仮想マシンです。
C ++プログラムをさまざまな種類の「バイトコード」(.NET CLR、LLVM)にコンパイルすることもできますが、これはあまり一般的ではありません。