有没有类似“编译时JIT”的东西?

时间:2014-05-22 23:09:07

标签: compiler-construction code-generation jit native-code compile-time

据我了解,JIT(即时编译)是指运行时进程,其中字节码被编译(转换)为本机代码,以提高运行时性能。 / p>

另一方面,编译时评估是通用编程或运行时优化的常见做法。同样,据我所知,在这种情况下,编译器解释源代码以评估表达式(例如产生值或类型)。在这种情况下,编译时间通常会显着增加。

是否存在编译时JIT 进程,其中编译器将源代码转换为本机以进行更有效的编译时评估?我发现这很自然,但是任何编译器都能用任何语言做到这一点吗?

如果我在自己的编译器中这样做,那会是个好主意吗?与运行时JIT相比,我会遇到哪些额外的困难?

2 个答案:

答案 0 :(得分:0)

不会有任何意义。编译器已经在编译代码。常量表达式评估仅发生一次。例如,Java HotSpot JVM发现在将代码执行数千次之后将其编译为本机代码是有益的。

答案 1 :(得分:0)

我认为你所谈论的是 - 当默认行为是解释或即时代码生成时,提前执行代码生成 - 被称为 ahead-of-time (AOT) compilation

优点:

  • 降低启动延迟,如果读取原生图像比翻译通常较小的中间语言图像更快
  • 一个进程的多个实例之间的已翻译本机代码的共享页面可能减少主内存占用,但仅当多个实例同时运行时

缺点:

  • 难以根据运行时特征进行优化; HotSpot的动态配置文件导向的整个程序优化可能会在不同的程序中以不同的方式编译相同的方法,具体取决于它的使用方式
  • 总计划存储空间通常会增加,因为原生图像通常比中间代码大,而且在生成本机图像后通常无法删除中间代码

你可以想象在AOT编译的代码上进行配置文件导向的整个程序优化,但是你最终会得到一些类似于HotSpot运行时的“预热”版本的东西,用足够热量的方法回购共享内存。重新翻译它们。