freeCodeCamp/guide/chinese/computer-science/just-in-time-compilation/index.md

5.2 KiB
Raw Blame History

title localeTitle
Just in Time Compilation 正好在时间汇编中

正好在时间汇编中

即时编译是一种提高解释程序性能的方法。在执行期间,可以将程序编译成本机代码以改善其性能。它也称为动态编译。

动态编译比静态编译有一些优势。运行Java或C应用程序时运行时环境可以在应用程序运行时对其进行概要分析。这允许生成更优化的代码。如果应用程序的行为在运行时发生更改则运行时环境可以重新编译代码。

一些缺点包括启动延迟和运行时编译的开销。为了限制开销许多JIT编译器只编译经常使用的代码路径。

概观

传统上,有两种方法可以将源代码转换为可以在平台上运行的形式。静态编译将代码转换为特定平台的语言。解释器直接执行源代码。

JIT编译试图利用两者的好处。在运行解释的程序时JIT编译器确定最常用的代码并将其编译为机器代码。根据编译器的不同可以在方法或较小的代码段上完成。

动态编辑首先在J. McCarthy于1960年在LISP的论文中描述。

Just In Time CompilationJIT或Dynamic Translation是在程序执行期间进行的编译。这意味着在运行时而不是在执行之前。转换为机器代码会发生什么。 JIT的优点在于由于编译是在运行时进行的因此JIT编译器可以访问动态运行时信息从而使其能够进行更好的优化例如内联函数

理解JIT编译的重要一点是它将字节码编译成正在运行的机器的机器代码指令。这意味着生成的机器代码针对正在运行的机器的CPU架构进行了优化。

JIT编译器的两个例子是Java中的JVMJava虚拟机和C中的CLR公共语言运行时

JIT代表Just-in-Time这意味着代码在需要时编译而不是在运行时之前编译。

在开始时,编译器负责将高级语言(定义为高于汇编程序的语言)转换为目标代码(机器指令),然后将其(通过链接器)链接到可执行文件中。

在语言发展的某一点上,编译器会将高级语言编译成伪代码,然后由解释器解释它来运行程序。这消除了目标代码和可执行文件,并允许这些语言可移植到多个操作系统和硬件平台。 Pascal编译为P-Code是第一个; Java和C是最近的例子。最终术语P-Code被字节码替换因为大多数伪操作都是一个字节长。

Just-In-TimeJIT编译器是运行时解释器的一个特性它不是在每次调用方法时解释字节码而是将字节码编译成正在运行的机器的机器代码指令然后调用它目标代码。理想情况下运行目标代码的效率将克服每次运行时重新编译程序的低效率。

JIT编译器在程序启动后运行并将代码通常是字节码或某种VM指令动态编译或者即时就像它的调用一样形成通常更快的形式通常是主机CPU的本机指令系统。 JIT可以访问动态运行时信息而标准编译器则无法进行更好的优化例如内联频繁使用的函数。

这与在程序首次运行之前将所有代码编译为机器语言的传统编译器形成对比。

换句话说传统编译器在您第一次运行它之前将整个程序构建为EXE文件。对于较新的样式程序使用伪代码p代码生成程序集。只有在OS上执行程序之后例如通过双击其图标JIT编译器才会启动并生成基于Intel处理器或其他任何人都能理解的机器代码m代码

典型场景:

源代码完全转换为机器代码

JIT场景

源代码将转换为汇编语言,如结构[对于C的ex IL中间语言对于java的ByteCode]。

仅当应用程序需要时,中间代码才转换为机器语言,只需将代码转换为机器代码。

JIT与非JIT比较

在JIT中并非所有代码都转换为机器代码首先将必要的代码的一部分转换为机器代码然后如果调用的方法或功能不在机器中那么将转换为机器代码...它减轻了负担CPU。 由于机器代码将在运行时生成...... JIT编译器将生成针对运行机器CPU架构进行优化的机器代码。 JIT示例

在Java中JIT是在JVMJava虚拟机中 在C中它是在CLR公共语言运行时 在Android中它是新版本的DVMDalvik虚拟机或ARTAndroid RunTime

Java虚拟机JVMJVM执行字节码维护一个函数执行时间的计数。如果这个计数超过了预定义的限制JIT会将代码编译成机器语言这可以由处理器直接执行与javac将代码编译成字节码然后java的正常情况不同 - 解释器逐行解释这个字节码将其转换为机器代码并执行)。

此外,下次计算该函数时,再次执行相同的编译代码,而不同于正常解释,其中代码再次逐行解释。这使得执行更快。

更多信息