编辑
2023-11-07
linux
00
请注意,本文编写于 550 天前,最后修改于 550 天前,其中某些信息可能已经过时。

目录

AOT编译
JIT编译

AOT编译

AOT(Ahead Of Time)是一种编译方式,也被称为提前编译。它是在程序运行之前将代码编译成机器码的过程,以便在运行时直接执行机器码,而不需要在运行时进行即时编译。与AOT相对的是JIT(Just-in-Time)编译,它是在程序运行时将代码逐行解释并编译成机器码。

AOT编译的优点是:

  1. 启动时间快:由于代码已经提前编译成机器码,因此在程序启动时不需要再进行编译,可以直接执行机器码,从而加快启动速度。
  2. 执行性能好:AOT编译可以对代码进行更深入的优化,生成更高效的机器码,因此在执行时可以获得更好的性能表现。

然而,AOT编译也有一些缺点:

  1. 生成时间长:AOT编译需要在程序运行之前进行,因此会增加程序的安装时间。
  2. 占用磁盘空间多:由于AOT编译会将代码提前编译成机器码并保存在程序中,会占用更多的磁盘空间。

AOT编译适用于对启动时间和执行性能有较高要求的场景,但需要权衡生成时间和磁盘空间的消耗。

JIT编译

JIT(即时编译)是一种执行计算机代码的方法,它在程序执行过程中(在执行期)而不是在执行之前进行编译。它通常将源代码或字节码转换为机器码,然后直接执行。JIT编译器会不断地分析正在执行的代码,并确定可被即时编译加速的部分。通过编译或重新编译这些部分,JIT编译可以提高代码的执行性能,超过编译代码的开销[1]

JIT编译是传统的提前编译(AOT)和直译器的结合,结合了两者的优点和缺点。它结合了编译代码的速度和解释的灵活性。JIT编译是动态编译的一种形式,允许自适应优化,比如动态重编译和特定于微架构的加速。因此,在理论上,JIT编译比静态编译能够产生更快的执行速度。JIT编译特别适合于动态编程语言,因为运行时系统可以处理后期绑定的数据类型并实施安全保证[1]

JIT编译可以应用于某些程序和能力,特别是动态能力,如正则表达式。它可以将运行时提供的正则表达式编译成机器码,从而加快匹配速度。一些现代的运行时环境依赖JIT编译来实现高速代码执行,包括大多数Java实现和微软的.NET框架。JIT编译也用于一些模拟器中,以便将机器代码从一个CPU体系结构转换到另一个CPU体系结构[1]

JIT编译的常见实现方式是先进行AOT编译,将源代码编译成字节码(虚拟机代码),然后将其JIT编译为机器码。与解释相比,这提高了运行时性能,但代价是编译造成的延迟。JIT编译器会不断地进行翻译,并对编译后的代码进行缓存,以最大限度地减少在给定运行期间将来执行相同代码的延迟[1]

在字节码编译的系统中,源代码被转换为中间表示形式称为字节码。JIT编译器会读取字节码,并将其动态编译成机器代码,以便程序能够更快地运行。JIT编译可以针对每个文件、每个函数甚至任意代码片段进行编译。代码可以在即将执行时进行编译,然后缓存并在以后重用,无需重新编译。相比之下,传统的解释型虚拟机只解释字节码,性能通常较低[1]

使用JIT技术的一个共同目标是达到或超过静态编译的性能,同时保持字节码解释的优势。JIT编译可以针对目标CPU和应用程序运行的操作系统模型进行优化。它可以收集关于程序在其所在环境中实际运行情况的统计信息,并根据这些信息重新排列和重新编译以获得最佳性能。JIT编译还可以进行全局代码优化,同时保留动态链接的优点。此外,JIT编译可以更容易地重新排列执行的代码,以获得更好的缓存利用率[1]

总结一下,JIT(即时编译)是一种在程序执行过程中将源代码或字节码转换为机器码的方法。它结合了编译代码JIT(即时编译)是一种执行计算机代码的方法,它在程序执行过程中(在执行期)而不是在执行之前进行编译。它将源代码或字节码转换为机器码,并直接执行。JIT编译器会不断地分析正在执行的代码,并确定可被即时编译加速的部分。通过编译或重新编译这些部分,JIT编译可以提高代码的执行性能,超过编译代码的开销[1]

JIT编译是传统的提前编译(AOT)和直译器的结合,结合了两者的优点和缺点。它结合了编译代码的速度和解释的灵活性。JIT编译是动态编译的一种形式,允许自适应优化,比如动态重编译和特定于微架构的加速[1]。因此,理论上,JIT编译可以比静态编译产生更快的执行速度。JIT编译特别适合于动态编程语言,因为运行时系统可以处理后期绑定的数据类型并实施安全保证[1]

JIT编译可以应用于某些程序和某些能力,特别是动态能力,如正则表达式。它可以将运行时提供的正则表达式编译成机器码,从而加快匹配速度。一些现代的运行时环境依赖JIT编译来实现高速代码执行,包括大多数Java实现和微软的.NET框架。JIT编译也用于一些模拟器中,将机器代码从一个CPU体系结构转换到另一个CPU体系结构[1]

JIT编译的常见实现方式是先进行AOT编译,将源代码编译成字节码(虚拟机代码),然后将其JIT编译为机器码。与解释相比,这提高了运行时性能,但代价是编译造成的延迟。JIT编译器不断地进行翻译,并对编译后的代码进行缓存,以最大限度地减少在给定运行期间将来执行相同代码的延迟[1]

在字节码编译的系统中,源代码被转换为称为字节码的中间表示形式。字节码不是任何特定计算机的机器代码,可以在不同计算机体系结构之间移植。JIT编译器会读取字节码,并将其动态编译成机器代码,以便程序能够更快地运行。JIT编译可以针对每个文件、每个函数甚至任意代码片段进行编译,代码可以在即将执行时进行编译,并在以后重用,无需重新编译[1]

JIT编译的优势包括:

  • 可以针对目标CPU和应用程序运行的操作系统模型进行优化。
  • 可以收集关于程序在其所在环境中实际运行情况的统计信息,并根据这些信息重新排列和重新编译以获得最佳性能。
  • 可以进行全局代码优化,同时保留动态链接的优点。
  • 可以更好地利用缓存,提高缓存利用率[1]

JIT编译的性能通常优于解释器,有时甚至优于静态编译。它可以在运行时根据目标CPU和应用程序运行的操作系统模型进行优化,收集统计信息并进行全局代码优化。此外,JIT编译的代码是可移植的,可以在安全的沙箱中


  1. AOT,JIT区别,各自优劣,混合编译_aot jit-CSDN博客

  2. 什么是 JIT 和 AOT - 简书

  3. Xamarin.Mac 提前编译 - Xamarin | Microsoft Learn

  4. 即时编译 - 维基百科,自由的百科全书

  5. 基本功 | Java即时编译器原理解析及实践 - 美团技术团队

  6. JIT 编译器

  7. JIT即时编译

本文作者:yowayimono

本文链接:

版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!