使用中间语言(.Net:MSIL,Java:字节码)我们可以实现平台独立性,这很棒。但是当一个应用程序应该只在一个平台上运行(例如Windows)时,在那种情况下有没有简单的方法来指定“我不需要每次都需要JIT,只需给我本机代码。”?
3 回答
我不能代表 .Net,但肯定有原生 Java 编译器,例如 GNU GCJ。
然而,更重要的是,您真的确定要避免 JITing 吗?JIT 编译器根据代码的全局状态进行操作,通常可以进行静态编译器无法进行的优化。例如,当 JIT 编译器知道当前不存在覆盖它的子类时,它可以内联虚拟方法(而静态编译器不知道以后是否会(静态或动态)链接这样的类)。还有很多其他的例子,但我不认为这个答案的范围是列出它们。:)
单一平台(Windows)并不真正意味着单一目标。我目前在 Windows 上运行 - 有些二进制文件是 x86,有些是 x64。即使在同一个处理器系列中,不同的特定芯片也具有 JIT 可以处理的不同功能。
在 .NET 上,您可以使用NGEN - 但就我个人而言,在您实际在生产中使用它之前,我会看到有多少好处。我相信主要的好处是启动时间而不是实际执行时的性能。事实上,我相信“正常”JIT 可以进行一些优化,而 NGEN 不会。
需要注意的一点是,尽管如 Dolda2000 所提到的,Java 的 Hotspot JIT 是自适应的,但 .NET JIT目前是“仅一次”——如果结果被大量使用,它不会重新 JIT 代码付出更多的努力,或者围绕子类化做出假设,然后稍后“撤消”它们。
还有一点:
许多当前框架在类加载期间操纵字节码。这意味着磁盘上的代码不是执行的代码。任何基于注解的依赖注入的 Java 框架都将使用它。JPA/Hibernate 使用它。AOP(面向方面编程)通常使用它,尽管 AOP 框架通常也提供一种在构建期间操作类文件的方法。
将代码预先编译为本机代码将使这些框架变得无用。