当前位置:  开发笔记 > 编程语言 > 正文

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

如何解决《实时(JIT)编译器做什么?》经验,为你挑选了8个好方法。

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



1> Mark Cidade..:

JIT编译器运行后,程序已启动,编制在飞行的代码(通常是字节代码或某种形式的虚拟机指令)(或者刚刚在时间,因为它的称呼)成一种形式,就是通常更快,通常主机CPU的本地指令系统.JIT可以访问动态运行时信息,而标准编译器不能并且可以进行更好的优化,例如内联频繁使用的函数.

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

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


但是,目标不一定是机器代码.JRuby有一个JIT编译器,它会在几次调用之后将Ruby源代码编译成Java字节码.然后,在另外几次调用之后,JVM JIT编译器启动并将字节码编译为本机代码.
与解释代码相反,它会立即开始运行字节码或VM指令而不会延迟,但会比机器语言运行指令慢.
值得注意的是,正如Jörg所暗示的那样,JIT不一定立即被引用.通常,代码将被解释,直到确定它值得JITting.由于JITting可能会引入延迟,因此如果很少使用某些代码,那么**NOT**JIT可能会更快,因此快速响应比整体运行时更重要.
JIT通常与解释代码一起使用以将其转换为机器语言,但是,纯粹解释的代码(没有任何JITting)很慢.即使没有JITter的Java字节码也非常慢.
@ErikReppen:如果出现一台新机器,使用传统编译器为该新机器编译和优化程序可能会比JIT更快地产生结果.另一方面,针对该新机器优化的JIT将能够优化在新机器发明之前发布的代码*的性能*.

2> Craig Trader..:

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

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

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


实际上,JIT是一个附加组件,您仍然可以使用-Xint参数禁用它,因此它只是一个功能.
然而,这个短语*"即时(JIT)编译器是运行时解释器的一个特性"*导致混淆; 例如 - http://stackoverflow.com/questions/16439512/what-is-the-use-of-jvm-if-jit-is-performing-bytecode-conversion-to-machine-instr/16440092#16440092
我不完全同意.JIT不是进化 - 它是经典编译器的替代品.

3> Durai Amutha..:

JIT-及时这个词本身就说需要(按需)

典型场景:

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

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).


JIT在框架中提供了一些特殊优势,支持真正的泛型类型; 可以定义一个通用方法,该方法能够生成无限范围的类型,每个类型都需要不同的机器代码,但只有JIT为实际生成的类型生成代码.相比之下,在C++中,编译器必须为程序将使用的所有类型生成代码.
JVM第一次运行时没有JIT代码.前几次,它解释字节码.然后,如果该代码运行得足够频繁,它可能会决定打扰它.

4> Aniket Thaku..:

正如其他人所说

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

只是为了向上面的讨论添加一点,JVM维护一个函数执行时间的计数.如果此计数超过预定义的限制,JIT会将代码编译为机器语言,这可以由处理器直接执行(与javac将代码编译为字节码然后java的正常情况不同 - 解释器逐行解释此字节码将其转换为机器代码并执行).

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



5> 小智..:

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

在此输入图像描述

如果没有JIT编译器,JVM解释器会逐行转换字节代码,使其看起来好像正在执行本机应用程序.

在此输入图像描述

资源



6> Brian Lyttle..:

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

这很有用,因为编译器可以生成针对您的特定计算机优化的代码.像普通的C编译器一样,静态编译器会将所有代码编译到开发人员机器上的可执行代码中.因此,编译器将基于某些假设执行优化.它可以更慢地编译并进行更多优化,因为它不会减慢用户执行程序的速度.



7> 小智..:

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

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

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


加载到JVM时,整个代码不会被编译,因为关于如何进行编译的信息很少(阅读:指南).请记住,性能是最终目标.JIT相当具有选择性:监控和选择最流行的优化方法.并且它一直这样做,直到达到各个方法的最大优化级别.

8> Anands23..:

即时编译器(JIT):
它将java字节码编译为该特定CPU的机器指令.

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

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

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

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

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

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

请参阅有关了解JIT的Oracle文档以了解更多信息.

推荐阅读
手机用户2402852307
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有