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

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

283713 次浏览

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

这与传统编译器相反,传统编译器将所有代码编译为之前机器语言,程序首先运行。

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

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

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

这是有益的,因为编译器可以生成针对特定机器优化的代码。静态编译器,就像普通的C编译器一样,将所有代码编译为开发人员机器上的可执行代码。因此,编译器将基于一些假设执行优化。它可以编译得更慢,做更多的优化,因为它不会降低用户执行程序的速度。

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

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

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

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

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

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

JIT编译器只在运行时工作,所以我们没有任何二进制输出。

jit -来得正是时候 单词本身表示需要时(按需)

典型场景:

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

JIT的场景:

源代码将转换为汇编语言,如结构[为ex IL(中间语言)为c#,字节码为java]。

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

JIT与非JIT的比较:

    在JIT中,不是所有的代码都先转换成机器代码 所有必要的代码都将被转换成机器代码 如果调用的方法或功能不在机器中,那么 将被转换成机器代码…

  • 因为机器代码将在运行时....生成JIT 编译器将生成优化运行的机器代码

JIT的例子:

  1. 在Java中,JIT是在JVM (Java虚拟机)中
  2. 在c#中,它是在CLR(公共语言运行库)中
  3. 在Android中,它是在DVM (Dalvik Virtual Machine)中,或者在更新的版本中是ART (Android RunTime)。

正如其他人提到的

# EYZ0

为了给上面的讨论补充一点,JVM维护一个函数执行时间的计数。如果该计数超过预定义的限制,JIT将代码编译为处理器可以直接执行的机器语言(不像一般情况下,javac将代码编译为字节码,然后java -解释器逐行解释这个字节码,将其转换为机器代码并执行)。

另外,下次计算此函数时,将再次执行相同的编译代码,而不像常规解释那样逐行重新解释代码。这使得执行速度更快。

我知道这是一个老线程,但是运行时优化是JIT编译的另一个重要部分,这里似乎没有讨论它。基本上,JIT编译器可以在程序运行时监视它,以确定改进执行的方法。然后,它可以在运行时动态地进行这些更改。谷歌JIT优化(javaworld有一个漂亮的关于它的好文章。)

Jit代表即时编译器 Jit是一个将Java字节代码转换为可以直接发送到处理器的指令的程序

在特定的系统平台上使用java即时编译器(实际上是第二个编译器)将字节码遵从为特定的系统代码,一旦代码被jit编译器重新编译,它通常会在计算机中运行得更快。

即时编译器随虚拟机一起提供,可选使用。它将字节码编译为立即执行的特定于平台的可执行代码。

20%的字节码在80%的时间内被使用。JIT编译器获得这些统计数据,并优化这20%的字节代码,通过添加内联方法、删除未使用的锁等,并创建特定于这台机器的字节码来更快地运行。我引用这篇文章,我发现它很方便。# EYZ0

JIT指的是一些JVM实现中的执行引擎,它更快,但需要更多内存,是一种即时编译器。在此方案中,方法的字节码在第一次调用方法时被编译为本机机器码。然后缓存该方法的本机机器码,以便下次调用相同的方法时可以重用它。

出于性能原因,JVM实际上在运行时执行编译步骤。这意味着Java没有一个清晰的编译-执行分离。它首先执行从Java源代码到字节码的所谓静态编译。然后将此字节码传递给JVM执行。但是执行字节码很慢,所以JVM会测量字节码运行的频率,当它检测到频繁运行的代码的“热点”时,它会执行从字节码到“热点”代码的机器码的动态编译(热点分析器)。所以现在Java程序是通过机器码执行来运行的。

< p > # EYZ0 < br > 它将java字节码编译成特定CPU的机器指令。< / p >

例如,如果我们在java代码中有一个循环语句:

while(i<10){
// ...
a=a+i;
// ...
}

如果i的值为0,上述循环代码将运行10次。

没有必要一次又一次地编译字节码10次,因为相同的指令将执行10次。在这种情况下,只需要编译该代码一次,并且可以将值更改所需的次数。因此,Just In Time (JIT) Compiler会跟踪这些语句和方法(如上所述),并将这些字节代码片段编译为机器代码以获得更好的性能。

另一个类似的例子是在字符串/句子列表中使用“正则表达式”搜索模式。

JIT Compiler不会将所有代码编译为机器代码。它在运行时编译具有类似模式的代码。

请参阅关于理解JIT的Oracle文档阅读更多内容。

JIT编译器只在第一次执行时将字节码编译为等效的本机代码。在每次连续执行时,JVM仅使用已编译的本机代码来优化性能。

enter image description here

如果没有JIT编译器,JVM解释器将逐行转换字节码,使其看起来就像正在执行本机应用程序一样。

enter image description here

Source .

即时(JIT)编译,(也称为动态翻译或运行时编译),是程序的执行计算机代码的方式涉及执行期间的编译 -在运行时- 而不是在执行之前

IT编译是将机器代码转换为机器代码的两种传统方法预编译(AOT)解释的一种,并结合了两者的一些优点和缺点。# EYZ3。

让我们考虑在JVM中使用的JIT,

例如,HotSpot JVM JIT编译器生成动态优化。换句话说,它们在Java应用程序运行时做出优化决策,并生成高性能的本机机器指令针对底层系统架构。

当选择一个方法进行编译时,JVM将其字节码提供给即时编译器(JIT)。在正确编译方法之前,JIT需要理解字节码的语义和语法。为了帮助JIT编译器分析方法,它的字节码首先在一个称为跟踪树的内部表示形式中重新表述,它更像机器代码而不是字节码。然后对该方法的树进行分析和优化。最后,将树转换为本地代码。

跟踪树是在编程代码的运行时编译中使用的数据结构。跟踪树用于一种“即时编译器”,它跟踪在热点期间执行的代码并编译它。参考# EYZ0。

参考:

即时编译器(JIT)是一种软件,它接收一个不可执行的输入,并返回要执行的适当机器代码。例如:

Intermediate representation    JIT    Native machine code for the current CPU architecture


Java bytecode            --->        machine code
Javascript (run with V8) --->        machine code

其结果是,对于特定的CPU体系结构,必须安装适当的JIT编译器。

区别编译器、解释器和JIT

虽然在一般情况下,当我们想要将源代码转换为机器码时可能会有例外,但我们可以使用:

  1. 编译器:接受源代码并返回可执行文件
  2. 翻译:逐条指令执行程序。它获取源代码的可执行段,并将该段转换为机器指令。这个过程一直重复,直到所有源代码都转换成机器指令并执行为止。
  3. JIT:可能有许多不同的JIT实现,但是JIT通常是编译器和解释器的组合。JIT首先将它接收到的中间数据(例如Java字节码)通过解释转换为机器语言。JIT通常可以测量代码的某一部分何时经常执行,并编译这一部分以获得更快的执行速度。

Just In Time编译器也称为JIT编译器用于 Java的性能改进。默认启用。它是 编译在执行时完成。 Java通过将JIT编译器包含在 JVM . < / p >