5

DotnetCLRは言語コードをMSILに変換します。Javaコードは、プラットフォームに依存しないネイティブコードに変換されます。このMSILをネイティブコードに変換できますか?したがって、Dotnetは自動的にプラットフォームに依存しなくなります。

4

3 に答える 3

14

ここでの用語には注意してください。

  • CLR は "言語コード" を MSIL に変換しません。MSIL をオンザフライでネイティブ コードに変換します。
  • Java コードは「プラットフォームに依存しないネイティブ コード」に変換されません。それは矛盾した表現です。Java ソース コードは、プラットフォームに依存しない Java バイトコードに変換されます。JVM は、CLR が MSIL で行うのと同じ方法でバイトコードをネイティブ コードに変換します (まあ、ある程度)。

MSIL とバイトコードの両方を解釈できることに注意してください。HotSpot は解釈することもあれば、JIT コンパイルを行うこともあり、JIT コンパイルを複数回行うこともよくあります。.NET デスクトップ CLR は、現時点で常に 1 回 JIT コンパイルします。

また、関心のあるプラットフォームで使用できる JVM がある限り、バイトコードはプラットフォームに依存しないということも理解しておく必要があります。MSIL についても同じことが言えます。プラットフォーム用の Mono のビルドがあり、Mono で使用できないライブラリを使用しいない場合は、Windows で C# プログラムをコンパイルし、Mono の下で Linux で実行できます。

MSIL を Java バイトコードに変換する場合は、逆の方が実行可能です。一般に、MSIL はJava バイトコードよりも強力です。たとえば、MSIL のカスタム値型とジェネリックは、バイトコードに簡単に変換できません。おそらくJava で書かれた CLR に近いものが必要になるでしょう。いくつかの巧妙な可能性があるとあえて言いますが、そこには根本的な困難があります。特に Java 7 がバイトコードに動的呼び出しを導入する場合 (一方、.NET での動的型付けは DLR によってライブラリとして実行されます)。

于 2010-08-05T10:54:48.117 に答える
2

この返信は少し的外れかもしれませんが、言及する価値があります。MSIL から Java バイト コードへの変換は、質問に回答している他のユーザーが詳しく説明しているように難しい場合があります。ただし、あるフレームワークから別のフレームワークへの変換は、ソース コード レベルで処理できます。

.NET アプリケーションで使用したい Java ライブラリがある場合は、IKVMを使用してください。Java バイトコードから .NET IL へのトランスレータである IKVMC を使用して、Java コードを .NET アセンブリにコンパイルします。これを使用する前に、ライセンス条項を確認してください。

また、その逆、つまり .NET ソース コードから Java への変換が可能かどうかも知りたいです。

于 2010-08-05T16:59:31.697 に答える
0

あなたの質問には部分的にしか答えられません。

はい、MSIL はngen.exeを使用してネイティブ コードに変換できます。ただし、その場合、異なるターゲット アーキテクチャ (32 ビットと 64 ビットなど) で効率的に実行できなくなります。また、ターゲット プラットフォームごとに 1 つずつ、複数のバージョンを作成する必要があります。

それとは別に、カートの答えを使用することをお勧めします。

于 2010-08-05T10:56:13.413 に答える