【问题标题】:can MSIL be converted to Java Native Code?MSIL 可以转换为 Java 原生代码吗?
【发布时间】:2011-03-25 17:53:24
【问题描述】:

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

【问题讨论】:

    标签: java .net cil native-code


    【解决方案1】:

    请注意此处的术语:

    • 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 仅作为一个库执行的)。

    【讨论】:

    • 此外,作为 Microsoft CLR 一部分的标准库的很大一部分与 Microsoft 操作系统功能相关联。 JVM 库明显更独立于操作系统。
    【解决方案2】:

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

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

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

    【讨论】:

      【解决方案3】:

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

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

      我也很想知道是否可以反过来,即 .NET 源代码到 Java?

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2011-05-31
        • 1970-01-01
        • 1970-01-01
        • 2013-12-13
        • 1970-01-01
        • 1970-01-01
        • 2023-03-31
        相关资源
        最近更新 更多