【发布时间】:2011-03-25 17:53:24
【问题描述】:
Dotnet CLR 将语言代码转换为 MSIL。而 Java 代码被转换为与平台无关的本机代码。我们可以将此 MSIL 转换为本机代码吗?因此,Dotnet 将自动变得独立于平台。
【问题讨论】:
标签: java .net cil native-code
Dotnet CLR 将语言代码转换为 MSIL。而 Java 代码被转换为与平台无关的本机代码。我们可以将此 MSIL 转换为本机代码吗?因此,Dotnet 将自动变得独立于平台。
【问题讨论】:
标签: java .net cil native-code
请注意此处的术语:
请注意,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 仅作为一个库执行的)。
【讨论】:
我只能部分回答你的问题。
是的,可以使用 ngen.exe 将 MSIL 转换为本机代码。但是,在这种情况下,您将失去在不同目标架构上高效运行的能力,例如32 位与 64 位。此外,您需要为每个目标平台创建多个版本。
除此之外,我建议使用 Kurt 的答案。
【讨论】:
这个回复可能有点离题,但值得一提。 MSIL 到 Java 字节码可能很难,正如其他人回答问题所详述的那样。但是您可以在源代码级别处理从一个框架到另一个框架的转换。
如果您有想要在 .NET 应用程序中使用的 Java 库,请使用 IKVM。它使用 IKVMC 将 Java 代码编译成 .NET 程序集,这是一个 Java 字节码到 .NET IL 的转换器。在开始使用它之前,请检查许可条款!
我也很想知道是否可以反过来,即 .NET 源代码到 Java?
【讨论】: