7

最初に .NET コードが MSIL にコンパイルされ、次に JIT によってそれがマシン依存コードに変換されます。2ステップのコンパイルにより、すべての利点が得られることを誰か教えてもらえますか.Thank

4

4 に答える 4

20

いくつかの理由があります。何よりもまず、おそらくクロスプラットフォームにすることです。C# やその他の .NET 言語をネイティブ コードに直接コンパイルした場合は、実行するプラットフォームごとに再コンパイルする必要があります。VM を使用すると、すべてのコードを中間形式に保つことができ、プラットフォームごとに VM 実装を作成するだけで済みます。

また、言語に依存しない中間言語を使用することで、他の言語で記述されたすべてのアセンブリを参照する多くの高水準言語 (C#、VB.NET、Python など) を使用できます。それらはすべて同じものにコンパイルされるため、相互にシームレスに動作できます。

パフォーマンス上の利点もあります。JIT コンパイラーは、その時点でコードが実行されているマシンに対して特に積極的な最適化を行うことができます。この意味で .NET JIT コンパイラがどの程度の最適化を行っているかはわかりませんが、理論的には非常に大きなメリットが得られる可能性があります。

于 2009-12-18T05:12:33.207 に答える
6

答えはMSDNにあります

于 2009-12-18T05:15:21.093 に答える
1

最初に高級言語からマシンレベルに変換します。これが.Netプラットフォームの設計方法です。第1層は高級言語からMSILを処理し、第2レベルはプラットフォームのヒッチとグリッチに集中してMSILからマシンレベルのコードに変換できます。これは主に言語の相互運用性をサポートしており、近い将来、Monoのようなプロジェクトがさらに発展するときにクロスプラットフォームのサポートも提供する予定です。

于 2009-12-18T06:01:40.050 に答える
1
  • 実行可能ファイルはプラットフォームにバインドされていません。たとえば、XNA は PPC (Xbox360) と x86 プロセッサの両方を対象としています。一部のプログラムは、Linux または OSX 上の Mono で実行されます。

  • これにより、ターゲット マシンをより適切に最適化したり、不足している機能を置き換えたりすることができます。

    • たとえば、OSX >= 10.5 は、OpenCL を使用した実行時に、不足している GPU 命令でコンパイルされます。
    • 浮動小数点をサポートしていない CPU で作業している場合、コードを完全に書き直すことなく JIT でエミュレートできます。
    • 将来のある時点で、処理を GPU やその他のターゲットに動的にオフロードできるようになる可能性があります (これには関数型言語の方が適していると思います)。
于 2009-12-18T05:19:34.020 に答える