--- title: Just in Time Compilation localeTitle: 正好在时间汇编中 --- ## 正好在时间汇编中 即时编译是一种提高解释程序性能的方法。在执行期间,可以将程序编译成本机代码以改善其性能。它也称为动态编译。 动态编译比静态编译有一些优势。运行Java或C#应用程序时,运行时环境可以在应用程序运行时对其进行概要分析。这允许生成更优化的代码。如果应用程序的行为在运行时发生更改,则运行时环境可以重新编译代码。 一些缺点包括启动延迟和运行时编译的开销。为了限制开销,许多JIT编译器只编译经常使用的代码路径。 ### 概观 传统上,有两种方法可以将源代码转换为可以在平台上运行的形式。静态编译将代码转换为特定平台的语言。解释器直接执行源代码。 JIT编译试图利用两者的好处。在运行解释的程序时,JIT编译器确定最常用的代码并将其编译为机器代码。根据编译器的不同,可以在方法或较小的代码段上完成。 动态编辑首先在J. McCarthy于1960年在LISP的论文中描述。 Just In Time Compilation,JIT或Dynamic Translation是在程序执行期间进行的编译。这意味着,在运行时,而不是在执行之前。转换为机器代码会发生什么。 JIT的优点在于,由于编译是在运行时进行的,因此JIT编译器可以访问动态运行时信息,从而使其能够进行更好的优化(例如内联函数)。 理解JIT编译的重要一点是它将字节码编译成正在运行的机器的机器代码指令。这意味着,生成的机器代码针对正在运行的机器的CPU架构进行了优化。 JIT编译器的两个例子是:Java中的JVM(Java虚拟机)和C#中的CLR(公共语言运行时)。 ## JIT代表Just-in-Time,这意味着代码在需要时编译,而不是在运行时之前编译。 在开始时,编译器负责将高级语言(定义为高于汇编程序的语言)转换为目标代码(机器指令),然后将其(通过链接器)链接到可执行文件中。 在语言发展的某一点上,编译器会将高级语言编译成伪代码,然后由解释器解释它来运行程序。这消除了目标代码和可执行文件,并允许这些语言可移植到多个操作系统和硬件平台。 Pascal(编译为P-Code)是第一个; Java和C#是最近的例子。最终,术语P-Code被字节码替换,因为大多数伪操作都是一个字节长。 Just-In-Time(JIT)编译器是运行时解释器的一个特性,它不是在每次调用方法时解释字节码,而是将字节码编译成正在运行的机器的机器代码指令,然后调用它目标代码。理想情况下,运行目标代码的效率将克服每次运行时重新编译程序的低效率。 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是在JVM(Java虚拟机)中 在C#中它是在CLR(公共语言运行时) 在Android中,它是新版本的DVM(Dalvik虚拟机)或ART(Android RunTime)。 Java虚拟机(JVM)(JVM执行字节码)维护一个函数执行时间的计数。如果这个计数超过了预定义的限制,JIT会将代码编译成机器语言,这可以由处理器直接执行(与javac将代码编译成字节码然后java的正常情况不同 - 解释器逐行解释这个字节码将其转换为机器代码并执行)。 此外,下次计算该函数时,再次执行相同的编译代码,而不同于正常解释,其中代码再次逐行解释。这使得执行更快。 #### 更多信息 * [JIT编译(维基百科)](https://en.wikipedia.org/wiki/Just-in-time_compilation) * [JIT简介](https://eli.thegreenplace.net/2013/11/05/how-to-jit-an-introduction/)