可以将MSIL转换为Java Native Code吗?

时间:2010-08-05 10:49:25

标签: java .net cil native-code

Dotnet CLR将语言代码转换为MSIL。将Java代码转换为独立于平台的本机代码。我们可以将此MSIL转换为本机代码吗?因此,Dotnet将自动变为独立于平台。

3 个答案:

答案 0 :(得分:13)

请注意您的术语:

  • CLR不会将“语言代码”转换为MSIL - 它会动态地将MSIL转换为本机代码。
  • Java代码未转换为“与平台无关的本机代码”;那是矛盾的。 Java源代码转换为独立于平台的Java字节码。 JVM将字节码转换为本机代码的方式与CLR与MSIL相同(在某种程度上)

请注意,MSIL和字节码都可以解释; HotSpot有时会解释,有时JIT编译,并且经常JIT编译多次。 .NET桌面CLR总是JIT目前只编译一次。

同样值得理解的是,字节码只是平台独立的程度,因为有一个JVM可用于您感兴趣的平台。对于MSIL也是如此。您可以在Windows上编译C#程序,然后在Mono 下在Linux上运行它,如果您的平台有Mono版本,如果它不使用任何库单声道上没有。

现在将MSIL转换为Java字节码......反过来更可行,因为MSIL 通常比Java字节码更强大。例如,MSIL中的自定义值类型和泛型不会轻易转换为字节码。您可能需要更接近用Java编写的CLR 。我敢说有一些聪明的可能性,但那里存在根本性的困难。即使反过来也不容易 - 特别是如果Java 7引入了对字节码的动态调用(而.NET中的动态类型由DLR作为库执行)。

答案 1 :(得分:1)

这个回复可能有点偏离,但值得一提。 MSIL到Java字节代码可能很难被其他人回答这个问题所详述。但是您可以在源代码级别处理从一个框架到另一个框架的转换。

如果您要在.NET应用程序中使用Java库,请使用IKVM。它使用IKVMC将Java代码编译成.NET程序集,IKVMC是.NET IL转换器的Java字节码。在开始使用之前,请检查许可条款!

另外我很想知道反向是否可能,即.NET源代码是否为Java?

答案 2 :(得分:0)

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

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

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