即时(JIT)编译器有什么作用?
与非JIT编译器相比,JIT编译器专门做什么?有人可以给出简洁明了的描述吗?
解决方案
JIT编译器在程序启动后运行,然后将代码(通常称为字节码或者某种VM指令)即时(或者称为即时)编译为通常更快的形式,通常是主机CPU的本机指令系统。 JIT可以访问动态运行时信息,而标准编译器则不能,并且可以进行更好的优化,例如内联经常使用的函数。
这与传统的编译器相反,传统的编译器在程序首次运行之前将所有代码编译为机器语言。
换个说法,传统的编译器会在我们第一次运行该程序之前将整个程序构建为EXE文件。对于较新样式的程序,将使用伪代码(p代码)生成程序集。只有在OS上执行程序后(例如,通过双击其图标),才会(JIT)编译器启动并生成基于Intel的处理器或者任何可理解的机器代码(m代码)。
我们有被某些IL(中间语言)编译的代码。当我们运行程序时,计算机不理解该代码。它只了解本机代码。因此,JIT编译器可以将IL即时编译为本机代码。它在方法级别执行此操作。
JIT代表即时(Just-in-Time),这意味着代码将在需要时(而不是在运行时之前)进行编译。
这是有益的,因为编译器可以生成针对特定计算机优化的代码。像普通的C编译器一样,静态编译器会将所有代码编译为开发人员计算机上的可执行代码。因此,编译器将基于一些假设执行优化。它可以更慢地编译并进行更多优化,因为它不会减慢用户程序的执行速度。
最初,编译器负责将高级语言(定义为比汇编程序高的语言)转换为目标代码(机器指令),然后将其(通过链接器)链接为可执行文件。
在语言发展的某一时刻,编译器会将高级语言编译为伪代码,然后将其解释(由解释器)以运行程序。这消除了目标代码和可执行文件,并使这些语言可移植到多个操作系统和硬件平台。 Pascal(编译为P-Code)是最早的一个。 Java和Care的最新示例。最终,术语P-Code替换为字节码,因为大多数伪操作都是一个字节长。
即时(JIT)编译器是运行时解释器的功能,它不会在每次调用方法时都解释字节码,而是将字节码编译为正在运行的计算机的机器代码指令,然后调用此代码。目标代码代替。理想情况下,运行目标代码的效率将克服每次运行时重新编译程序的效率低下的问题。
非JIT编译器获取源代码,并在编译时将其转换为机器特定的字节码。 JIT编译器采用在编译时生成的与机器无关的字节码,并在运行时将其转换为机器特定的字节码。 Java使用的JIT编译器允许单个二进制文件无需修改就可以在多种平台上运行。