MSIL能转换成Java本地代码吗?

5

Dotnet CLR将语言代码转换为MSIL。而Java代码可以转换为平台无关的本机代码。我们能否将此MSIL转换为本机代码?这样,Dotnet将自动变成平台无关的。

3个回答

14

在这里要注意术语:

  • CLR不会将“语言代码”转换为MSIL——它会即时将MSIL转换为本机代码。
  • Java代码并不会被转换为“平台无关的本机代码”;这是一个自相矛盾的说法。Java源代码会被转换为平台无关的Java字节码。JVM会以与CLR处理MSIL类似的方式将字节码转换为本机代码(某种程度上是这样)

请注意,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作为库来执行的)。


此外,作为 Microsoft CLR 的一部分的标准库中相当大一部分都与 Microsoft 操作系统功能相关联。而 JVM 库则更加独立于操作系统。 - Jim Rush

2
这篇回复可能有点离题,但值得一提。将MSIL转换为Java字节码可能会很困难,正如其他回答此问题的人所述。但是,您可以在源代码级别处理从一个框架到另一个框架的转换。
如果您有一个想在.NET应用程序中使用的Java库,请使用IKVM。它使用IKVMC将Java代码编译为.NET程序集,这是一种将Java字节码转换为.NET IL的工具。在使用之前,请务必检查许可条款!
我也很好奇是否可能反过来,即.NET源代码转换为Java?

0

我只能部分回答你的问题。

是的,MSIL可以使用ngen.exe转换为本机代码。但在这种情况下,您失去了在不同目标架构(例如32位与64位)上高效运行的能力。此外,您需要创建多个版本,每个版本针对一个目标平台。

除此之外,我建议使用Kurt的答案。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接