我最近了解到JIT编译器是用来将平台无关的代码编译成本地代码的。JVM和.NET运行环境使用它来获得更好的性能和显著缩短编译时间。我的问题是,为什么不把直接编译成本地代码(如C编译器)的普通编译器也制作成JIT?是否有限制或规范适用于使用JIT编译器?
随着x86指令集的分歧和消费设备中越来越广泛使用arm、mips等不同操作系统,商业软件的情况正在发生变化。当你添加了JIT编译器可以使用视频卡上的本地代码(这也是多种多样的),就不再合理尝试为每个唯一组合优化编译版本的分发。在某个时候,一个合理的JIT编译器可以访问所有CPU和GPU将优于受限于(例如)x86子集的编译等效版本。
经常被问到的一件事是,你是否可以只分发字节码...几乎可以,但不完全相同。这对于Java来说是可行的,因为它被设计成虚拟的,因此不需要担心字节序和其他硬件问题,libc则需要考虑到这些问题,或者针对每种体系结构定制汇编语言代码(所有这些都在虚拟机中实现)。要真正获得强大立足点,就需要实现一个基本适用于JIT的libc(可能基于musl libc,由于其简化的代码和许可证)。
提前优化编译器,例如大多数C编译器(如GCC),可能会产生比JIT编译器更好的机器代码。但是提前优化编译器通常需要比JIT更多的时间来进行优化。例如,gcc -O3
正在执行许多昂贵的优化,而大多数JIT JVM无法承担。因此,gcc -O3
通常会产生非常高效的机器代码(比JVM能做的要好得多)。
然而,在某些情况下,JIT技术可能会提供更好的代码,因为它能够考虑到一些提前优化编译器不知道的动态属性。例如,JIT编译器可以考虑到在某个特定的调用点上,调用的参数通常具有一个给定的类(该类取决于调用点,并且是动态学习的)。
mysql
,或者计算DNA或核反应堆数周CPU时间的复杂数值代码)从预先优化编译器中获益良多。 - Basile Starynkevitch