与非JIT编译器相比,JIT编译器具体做什么?有人可以给出一个简洁易懂的描述吗?
JIT编译器运行后,程序已启动,编制在飞行的代码(通常是字节代码或某种形式的虚拟机指令)(或者刚刚在时间,因为它的称呼)成一种形式,就是通常更快,通常主机CPU的本地指令系统.JIT可以访问动态运行时信息,而标准编译器不能并且可以进行更好的优化,例如内联频繁使用的函数.
这与在程序首次运行之前将所有代码编译为机器语言的传统编译器形成对比.
换句话说,传统编译器在您第一次运行它之前将整个程序构建为EXE文件.对于较新的样式程序,使用伪代码(p代码)生成程序集.只有在OS上执行程序之后(例如,通过双击其图标),(JIT)编译器才会启动并生成基于Intel处理器或其他任何人都能理解的机器代码(m代码).
最初,编译器负责将高级语言(定义为高于汇编程序的语言)转换为目标代码(机器指令),然后将其(通过链接器)链接到可执行文件中.
在语言发展的某一点上,编译器会将高级语言编译成伪代码,然后由解释器解释它来运行程序.这消除了目标代码和可执行文件,并允许这些语言可移植到多个操作系统和硬件平台.Pascal(编译为P-Code)是第一个; Java和C#是最近的例子.最终,术语P-Code被字节码替换,因为大多数伪操作都是一个字节长.
Just-In-Time(JIT)编译器是运行时解释器的一个特性,它不是在每次调用方法时解释字节码,而是将字节码编译成正在运行的机器的机器代码指令,然后调用它目标代码.理想情况下,运行目标代码的效率将克服每次运行时重新编译程序的低效率.
JIT-及时这个词本身就说需要(按需)
源代码完全转换为机器代码
源代码将转换为汇编语言,如结构[对于C#的ex IL(中间语言),对于java的ByteCode].
仅当应用程序需要所需的代码仅转换为机器代码时,中间代码才转换为机器语言.
在JIT中,并非所有代码都转换为机器代码,首先将必要的代码的一部分转换为机器代码,然后如果调用的方法或功能不在机器中,那么将转换为机器代码...它会减少CPU的负担.
由于机器代码将在运行时生成.... JIT编译器将生成针对运行机器的CPU架构进行优化的机器代码.
在Java中JIT是在JVM(Java虚拟机)中
在C#中它是在CLR(公共语言运行时)
在Android中,它是新版本的DVM(Dalvik虚拟机)或ART(Android RunTime).
正如其他人所说
JIT代表Just-in-Time,这意味着代码在需要时编译,而不是在运行时之前编译.
只是为了向上面的讨论添加一点,JVM维护一个函数执行时间的计数.如果此计数超过预定义的限制,JIT会将代码编译为机器语言,这可以由处理器直接执行(与javac将代码编译为字节码然后java的正常情况不同 - 解释器逐行解释此字节码将其转换为机器代码并执行).
此外,下次计算该函数时,再次执行相同的编译代码,而不同于正常解释,其中代码被逐行地再次解释.这使得执行更快.
JIT编译器仅在首次执行时将字节代码编译为等效的本机代码.每次连续执行时,JVM仅使用已编译的本机代码来优化性能.
如果没有JIT编译器,JVM解释器会逐行转换字节代码,使其看起来好像正在执行本机应用程序.
资源
JIT代表Just-in-Time,这意味着代码在需要时编译,而不是在运行时之前编译.
这很有用,因为编译器可以生成针对您的特定计算机优化的代码.像普通的C编译器一样,静态编译器会将所有代码编译到开发人员机器上的可执行代码中.因此,编译器将基于某些假设执行优化.它可以更慢地编译并进行更多优化,因为它不会减慢用户执行程序的速度.
在Java编译器生成字节代码(体系结构中立)之后,执行将由JVM(在Java中)处理.字节代码将由加载器加载到JVM中,然后解释每个字节指令.
当我们需要多次调用一个方法时,我们需要多次解释相同的代码,这可能需要更多的时间.所以我们有JIT(即时)编译器.当字节被加载到JVM(其运行时)时,整个代码将被编译而不是解释,从而节省时间.
JIT编译器仅在运行时工作,因此我们没有任何二进制输出.
即时编译器(JIT):
它将java字节码编译为该特定CPU的机器指令.
例如,如果我们的java代码中有一个循环语句:
while(i<10){ // ... a=a+i; // ... }
如果i的值为0,则上述循环代码运行10次.
由于同一条指令要执行10次,因此无需一次又一次地编译字节码10次.在这种情况下,有必要仅编译该代码一次,并且可以将值更改所需的次数.因此,Just In Time(JIT)编译器会跟踪这些语句和方法(如上所述),并将这些字节代码编译成机器代码以获得更好的性能.
另一个类似的例子是在字符串/句子列表中使用"正则表达式"搜索模式.
JIT编译器不会将所有代码编译为机器代码.它编译在运行时具有类似模式的代码.
请参阅有关了解JIT的Oracle文档以了解更多信息.