質問
第1四半期)なぜC#最初めILして実行時にJIT遵守とは、トップの仮想マシン(?).ているのか、あるいはJIT遵守るネイティブ機コードについて教えてください。
Q2)の場合はtrue(JIT遵守るネイティブマシンコードしができます。純サンドボックスのコードは何ですか?
Q3)また、なぜそのようなコード編へのIL。なぜなコンパイルにネイティブマシンコードを行うのですか?あのツールからスマートグリッドのように、これngenがなぜこのオプション?
解決
ILは、プロセスが実行されるようネイティブマシンコードにコンパイル(ジャストインタイム= JIT)JIT'dあります。
仮想マシン層の使用は、.NETプラットフォーム間で一貫性のある方法で動作することができます(たとえば、int型は常に32ビットであるにかかわらず、あなたが32ビットまたは64ビットマシン上で実行しているかどうかの、これではありませんC ++の場合)。
JITのコンパイルは「はあなたができる最適化を動的に(例えば頻繁に呼び出されたコードのビットに、より積極的な最適化を適用する、またはSSE2などの特定のマシン上のハードウェア命令の使用が利用できるように)それが実行されるようなコードに自分自身を調整することができますトン静的コンパイラで行います。
他のヒント
A1)JIT統をネイティブコード機
A2)です。当期純などはありませんと出来上がります。あAppDomainsです。その走りの一環としてCLR(の一環として実行可能なプロセス)
A3)NGen点からのジェフリー-リヒタ:
NGenいファイルができる。がCLRロNGenいファイルを比較し、 数特性は以前にコンパイルされたコードおよび現在の実行 環境です。場合の特性と一致しませんのNGenいファイルできません を使用し、通常のJITコンパイラの処理ができるようにしております。
劣負荷時の性能基準改定/。組み立てのファイルは標準のWindows PEファイルなので、それぞれ好ましいベースアドレスです。窓が多く 開発者は慣れの課題ベースのアドレスと、基準改定.時JITの作成のコードでは、これらの課題をな懸念が正しいメモリアドレス参照法により算定しております。
劣るものの実行時間ます。ンパイルするときにコードNGenであるかのように映像化している多くの 想定し、実行環境としては、JITコンパイラです。この原因 NGen.exe を粗悪コードです。例えば、NGenんの最大活用を図 特定のCPUの指示を仰いでindirectionsのためのstaticフィールドのアクセスで実際に アドレスのstaticいます。NGenに挿入しますコードを呼びクラス コンストラクタもので知らないたコードを実行し がクラスのコンストラクタで呼び出されます。
あなたは作成するために、 NGEN に使用することができますあなたの.NETアセンブリのネイティブバージョン。これを行うと、JITは、実行時にこれを実行する必要がないことを意味します。
JITは、コードが実行されて、現在のCPUのためのILコードを最適化するように設計されたので.NET第次いでネイティブのILにコンパイルされます。
.NETコードは、互換性のためにILにコンパイルされます。あなたがなどのC#、VB.NETを使用してコードを作成することができますので、その後、JITは、ネイティブコードにコンパイルするために共通の命令セット(IL)が必要です。 JITは、言語を認識する必要があった場合は、新しい.NET言語がリリースされたとき、その後、JITを更新する必要があります。
私は私の最高の推測では、.NETアプリは3個のアプリケーションドメインで実行されることで、サンドボックスの問題についてはよく分かりません。一つのドメインは、.NETランタイム(mscorlib、System.dllの、など)が含まれ、別のドメインでは、あなたの.NETのコードが含まれている、と私はどのような他のドメインのためのを思い出すことができません。 チェックアウト http://my.safaribooksonline.com/9780321584090する
1. C#で作成でCIL(IL)で有プラットフォームに残ります。純言語であるのはなぜできるDLLクライアントまで、フルのC#と利用でVB.NET F#なく手間いらず).の CLR その後、JITコンパイルのコードをネイティブ機械のコードです。
.純で動作することもできるマルチプラットフォーム(Monoには*NIX OS X).場合はC#とめるネイティブコードは、こなれて、それほど簡単です。
2. ありませんが出来上がります。
3. の答え#1
A1)この方法で、それは(WindowsやLinux、Mac)をプラットフォームに依存しないですし、それはまたあなたの現在のハードウェアのための特定の最適化を使用することができます。それはJITコンパイルされるとき、それはマシンコードにいます。
A2)全体のフレームワーク(.NETフレームワークは)ので、アプリ経由になるかもしれないすべてのコールは、.NETフレームワークのサンドボックスを通過するすべてのサンドボックスです。
A3)の答え1と同様に、それは.NETのバイナリは、異なるプラットフォームで作業し、その場でクライアントマシンに固有の最適化を行うことができます。
コンパイル.NETコードはJavas'オブジェクトコードの場合とまったく同じ方法で、中間言語であるILとなります。はい、 NGEN のツールを使用して、ネイティブマシンコードを生成することが可能です。 NGENは、マシンに、得られたネイティブ画像を結合するので、別のシステムにngen'dバイナリをコピーすると、期待される結果を生成しないであろう。中間コードにコンパイルすると、そうでない場合は(容易に)コードは、その後に記述なるので、それは、異なるハードウェアarchetectures上のコードの機能を可能にする、C ++のような静的に型付けされた言語とすることができないと判断することができるランタイムの決定を可能にしますそれはまた、唯一の32ビットシステムまたは64ビットシステムではなく、両方で動作マシン固有のコードとは対照的に、ビット(例えば32または64)-agnostic方法、でどうするかの意図を説明していること。センスP> 私はそれがシステムにバイナリを結合するようあなたは動的型付け言語の柔軟性でコンパイルされたマシンコードのパフォーマンスを必要としますが、バイナリがないことを知っているとき、それが有用である可能性があるため、
また、NGENはオプションですそれがバインドされていないシステムに移動することがます。