Ahead-of-time compilation
在计算机科学中,提前编译(AOT编译)是编译更高级编程语言(如C或C ++)或中间代码(如Java字节码或.NET Framework通用中间语言(CIL)代码),转换为本机(系统相关的)机器代码,以便生成的二进制文件可以本机执行的行为。
AOT生成机器优化的代码,就像标准的本机编译器一样。不同之处在于AOT将现有虚拟机(VM)的字节码转换为机器代码。
减少运行时开销
一些具有托管代码运行时的编程语言可以编译为中间代码,使用即时(JIT)编译。在中间代码执行时,这简要地将中间代码编译为本机运行的机器代码,这可能会降低应用程序的性能。提前(AOT)编译通过在执行之前而不是在执行期间发生而消除了对该步骤的需要。
在有限的情况下,可以提前将动态类型语言编译为本机机器代码或其他静态VM字节码。例如,Erlang语言的高性能Erlang项目(HiPE)AOT编译器可以做到这一点,因为先进的静态类型重建技术和类型推测。
在大多数具有完全AOT编译的程序和库的情况下,可以删除运行时环境的有用部分,从而节省磁盘空间,内存,电池寿命和启动时间(无JIT预热阶段)等。因此,它可用于嵌入式或移动设备。
性能权衡
AOT编译器可以执行复杂和高级的代码优化,在大多数情况下,JITing将被认为成本太高。相反,AOT通常无法在JIT中执行某些优化,如运行时配置文件引导优化(PGO),伪常量传播或间接虚拟函数内联。
此外,JIT编译器可以通过对代码进行假设来推测性地优化热代码。如果推测假设后来证明是错误的,则可以对生成的代码进行去优化。这种操作会降低运行软件的性能,直到通过自适应优化再次优化代码。AOT编译器无法做出这样的假设,需要在编译时尽可能多地推断出信息。它需要求助于不太专业的代码,因为它无法知道哪种类型将通过方法。些问题可以通过配置文件引导的优化来缓解。但即使在这种情况下,生成的代码也不能像JIT编译器那样动态地适应不断变化的运行时配置文件。