Compilation 即时(JIT)编译器做什么?

Compilation 即时(JIT)编译器做什么?,compilation,compiler-construction,jit,Compilation,Compiler Construction,Jit,与非JIT编译器相比,JIT编译器具体做什么?有人能给出一个简洁易懂的描述吗?JIT编译器在程序启动后运行,并将代码(通常是字节码或某种VM指令)动态编译(或及时编译,顾名思义)成通常更快的形式,通常是主机CPU的本机指令集。JIT可以访问动态运行时信息,而标准编译器不能,并且可以进行更好的优化,如经常使用的内联函数 这与传统编译器不同,传统编译器在程序首次运行之前将代码编译成机器语言 换言之,传统编译器在您第一次运行整个程序之前将其构建为EXE文件。对于较新样式的程序,使用伪代码(p代码)生成

与非JIT编译器相比,JIT编译器具体做什么?有人能给出一个简洁易懂的描述吗?

JIT编译器在程序启动后运行,并将代码(通常是字节码或某种VM指令)动态编译(或及时编译,顾名思义)成通常更快的形式,通常是主机CPU的本机指令集。JIT可以访问动态运行时信息,而标准编译器不能,并且可以进行更好的优化,如经常使用的内联函数

这与传统编译器不同,传统编译器在程序首次运行之前将代码编译成机器语言


换言之,传统编译器在您第一次运行整个程序之前将其构建为EXE文件。对于较新样式的程序,使用伪代码(p代码)生成程序集。只有在操作系统上执行程序(例如,双击其图标)后,(JIT)编译器才会启动并生成基于英特尔处理器或其他任何处理器都能理解的机器代码(m代码)。

您的代码被编译成某种IL(中间语言)。当您运行程序时,计算机无法理解此代码。它只理解本机代码。因此,JIT编译器会动态地将IL编译成本机代码。它在方法级别执行此操作。

JIT代表实时性,这意味着代码在需要时编译,而不是在运行时之前编译


这是有益的,因为编译器可以生成针对特定机器优化的代码。静态编译器,就像普通的C编译器一样,将把所有代码编译成开发人员机器上的可执行代码。因此,编译器将根据一些假设执行优化。它可以更慢地编译并进行更多优化,因为它不会减慢用户程序的执行。

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

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


实时(JIT)编译器是运行时解释器的一项功能,它不是每次调用方法时都解释字节码,而是将字节码编译成运行机器的机器码指令,然后调用此目标码。理想情况下,运行目标代码的效率将克服每次运行程序时重新编译程序的低效性。

非JIT编译器获取源代码,并在编译时将其转换为特定于机器的字节码。JIT编译器接受编译时生成的与机器无关的字节码,并在运行时将其转换为特定于机器的字节码。Java使用的JIT编译器允许一个二进制文件在多种平台上运行,无需修改。

在Java编译器生成字节码(与体系结构无关)后,执行将由JVM(Java)处理。加载程序将字节码加载到JVM中,然后解释每个字节指令

当我们需要多次调用一个方法时,我们需要多次解释同一代码,这可能需要比需要更多的时间。所以我们有了JIT(即时)编译器。当字节加载到JVM(其运行时)时,整个代码将被编译而不是解释,从而节省时间

JIT编译器仅在运行时工作,因此我们没有任何二进制输出。

JIT实时性 单词本身在需要时(按需)表示

典型情况: 源代码完全转换为机器代码

JIT场景: 源代码将被转换成类似于汇编语言的结构[对于C#的ex-IL(中间语言),对于java的字节码]

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

JIT与非JIT比较:
  • 在JIT中,并不是所有代码都首先转换为机器代码 所需的所有代码都将转换为机器代码 然后,如果调用的方法或功能不在计算机中,则 将转换为机器代码。。。它减少了CPU的负担

  • 由于机器代码将在运行时生成…JIT 编译器将生成为运行而优化的机器代码 机器的CPU架构

JIT示例:
  • 在Java中,JIT在JVM(Java虚拟机)中
  • 在C#中,它位于CLR(公共语言运行库)中
  • 在安卓系统中,它是在DVM(Dalvik虚拟机)或ART(安卓运行时)的较新版本中

  • 正如其他人提到的那样

    JIT代表准时制,这意味着代码在需要时进行编译,而不是在运行时之前。

    为了在上面的讨论中添加一点,JVM维护一个函数执行多少次的计数。如果此计数超过预定义的限制,JIT会将代码编译成可由处理器直接执行的机器语言(与javac将代码编译成字节码然后java的正常情况不同-解释器逐行解释此字节码并将其转换为机器码并执行)
    while(i<10){
        // ...
        a=a+i;
        // ...
     }
    
    Intermediate representation    JIT    Native machine code for the current CPU architecture
    
         Java bytecode            --->        machine code
         Javascript (run with V8) --->        machine code