Dotnet CLR将语言代码转换为MSIL。而Java代码可以转换为平台无关的本机代码。我们能否将此MSIL转换为本机代码?这样,Dotnet将自动变成平台无关的。
Dotnet CLR将语言代码转换为MSIL。而Java代码可以转换为平台无关的本机代码。我们能否将此MSIL转换为本机代码?这样,Dotnet将自动变成平台无关的。
在这里要注意术语:
请注意,MSIL和字节码都可以被解释执行;HotSpot有时会解释执行,有时会JIT编译,并经常多次JIT编译。.NET桌面CLR目前总是进行一次JIT编译。
另外值得理解的是,字节码只有在你感兴趣的平台上有JVM可用的情况下才是平台无关的。MSIL也是如此。你可以在Windows上编译C#程序,然后在Mono下的Linux上运行它——但前提是你的平台上有Mono的构建版本,而且它不使用任何在Mono上不可用的库。
现在谈到将MSIL转换为Java字节码......反过来更可行,因为MSIL通常比Java字节码更强大。例如,MSIL中的自定义值类型和泛型不易转换为字节码。你可能需要更接近用Java编写的CLR。我敢说有一些聪明的可能性,但存在重大困难。即使是反过来也不容易——特别是如果Java 7引入了字节码的动态调用(而.NET中的动态类型是通过DLR作为库来执行的)。
我只能部分回答你的问题。
是的,MSIL可以使用ngen.exe转换为本机代码。但在这种情况下,您失去了在不同目标架构(例如32位与64位)上高效运行的能力。此外,您需要创建多个版本,每个版本针对一个目标平台。
除此之外,我建议使用Kurt的答案。