0

私は C++ の経験が豊富で、Java や C# について深く理解したことはありません。しかし、仮想マシンの内部の仕組みに興味があります。いくつかの Windows exe を試してみたところ、実際の仮想マシンは jvm と clr の動的ライブラリであることがわかりました。

ここで気になるのは、これらのライブラリが exe ファイル内の命令とどのように相互作用するのかということです。

私の唯一の推測は、バイトコードが実際には exe ファイルの .data セグメントに格納されているということです。そして実際には、バイトコード命令を変換する .dll に制御を渡します。あれは正しいですか?

この件については何も見つけられなかったので、参考にしていただければ幸いです。

4

2 に答える 2

3

最も基本的なレベルでは、java.exeその通りです。バイトコードを読み取り、そこに含まれる命令を解釈して「実行」するネイティブ アプリケーション ( などのランタイム) があります。

この図に対して行う必要がある最初の調整は、パフォーマンス上の理由から、現在ほとんどの VM が JIT コンパイルを使用していることです。つまり、バイトコードは解釈されず、オンザフライでネイティブ コードにコンパイルされます。

私の唯一の推測は、バイトコードが実際には exe ファイルの .data セグメントに格納されているということです。

依存します。Java の場合、通常はバイトコードを含む JAR ファイルがあり、起動されるネイティブ バイナリとは分離されています。しかし、はい、それを単一の実行可能ファイルに結合して、ネイティブランチャーコード (ただし、依存するすべての共有ライブラリではない可能性があります) とバイトコードを「データとして」含めることができます。

たとえば、Eclipse は JVM で実行されますよね? それでも、exeを介して起動します。

はい。Eclipseには、これらの「起動ラッパーexe」の1つがあります。でもよく見ると小さいですね。スプラッシュ画面を表示し、JVM (exe の一部ではなく、システムにインストールされています) を起動し、いくつかの JAR ファイルをスローします (Eclipse の一部としてインストールされますが、exe 内にはインストールされません)。

于 2013-05-04T01:07:01.397 に答える
3

IL が保存されている場所についての推測は、次のとおりです。

http://en.wikipedia.org/wiki/Portable_Executable#.NET.2C_metadata.2C_and_the_PE_format

あなたの推測は基本的にC#では正しいです。実行可能ファイルは CLR を起動し、メタデータと IL を渡します。次に、CLR は "Main" の場所を特定し、IL を取得して x86 (またはその他のコード) に jit コンパイルし、それを実行します。各メソッドは、最初に実行する前に「ジャスト イン タイム」にコンパイルされるため、「jit コンパイラ」という用語が付けられています。

もちろん、これは非常に単純化された概要です。.NET の仕組みについて詳しく知りたい場合は、次から始めてください。

http://msdn.microsoft.com/en-us/library/a4t23ktk.aspx

于 2013-05-04T14:39:00.263 に答える