DotnetCLRは言語コードをMSILに変換します。Javaコードは、プラットフォームに依存しないネイティブコードに変換されます。このMSILをネイティブコードに変換できますか?したがって、Dotnetは自動的にプラットフォームに依存しなくなります。
3 に答える
ここでの用語には注意してください。
- 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 によってライブラリとして実行されます)。
この返信は少し的外れかもしれませんが、言及する価値があります。MSIL から Java バイト コードへの変換は、質問に回答している他のユーザーが詳しく説明しているように難しい場合があります。ただし、あるフレームワークから別のフレームワークへの変換は、ソース コード レベルで処理できます。
.NET アプリケーションで使用したい Java ライブラリがある場合は、IKVMを使用してください。Java バイトコードから .NET IL へのトランスレータである IKVMC を使用して、Java コードを .NET アセンブリにコンパイルします。これを使用する前に、ライセンス条項を確認してください。
また、その逆、つまり .NET ソース コードから Java への変換が可能かどうかも知りたいです。
あなたの質問には部分的にしか答えられません。
はい、MSIL はngen.exeを使用してネイティブ コードに変換できます。ただし、その場合、異なるターゲット アーキテクチャ (32 ビットと 64 ビットなど) で効率的に実行できなくなります。また、ターゲット プラットフォームごとに 1 つずつ、複数のバージョンを作成する必要があります。
それとは別に、カートの答えを使用することをお勧めします。