与非JIT编译器相比,JIT编译器专门做什么?有人可以给出简洁明了的描述吗?
与非JIT编译器相比,JIT编译器专门做什么?有人可以给出简洁明了的描述吗?
Answers:
JIT编译器在程序启动后运行,然后将代码(通常称为字节码或某种VM指令)即时(或称为即时)编译为通常更快的形式,通常是主机CPU的本机指令系统。JIT可以访问动态运行时信息,而标准编译器则不能,并且可以进行更好的优化,例如内联经常使用的函数。
这与传统的编译器相反,传统的编译器在程序首次运行之前将所有代码编译为机器语言。
换个说法,传统的编译器会在您首次运行之前将整个程序构建为EXE文件。对于较新样式的程序,将使用伪代码(p代码)生成程序集。只有在OS上执行程序后(例如,通过双击其图标),才会(JIT)编译器启动并生成基于Intel的处理器或其他任何可以理解的机器代码(m代码)。
最初,编译器负责将高级语言(定义为比汇编程序更高的语言)转换为目标代码(机器指令),然后将其(通过链接器)链接为可执行文件。
在语言发展的某一时刻,编译器会将高级语言编译为伪代码,然后将其解释(由解释器)以运行您的程序。这消除了目标代码和可执行文件,并允许这些语言可移植到多个操作系统和硬件平台。Pascal(编译为P-Code)是最早的一个。Java和C#是最近的示例。最终,术语“ P-Code”被字节码代替,因为大多数伪操作都是一个字节长。
即时(JIT)编译器是运行时解释器的功能,它不是在每次调用方法时都解释字节码,而是将字节码编译为正在运行的计算机的机器代码指令,然后调用此代码。目标代码。理想情况下,运行目标代码的效率将克服每次运行时重新编译程序的效率低下的问题。
JIT-及时,单词本身说出何时需要(按需)
源代码已完全转换为机器代码
源代码将被转换为汇编语言,如结构[对于C#来说,是ex IL(中间语言),对于Java是ByteCode)。
仅当应用程序需要的中间代码仅转换为机器代码时,才将中间代码转换为机器语言。
在JIT中,并非所有代码都首先转换为机器代码,一部分必需的代码将被转换为机器代码,然后,如果所调用的方法或功能不在机器中,则将其转换为机器代码...它减少了CPU的负担。
由于机器代码将在运行时生成...。JIT编译器将生成针对机器的CPU体系结构进行了优化的机器代码。
正如其他提到的
JIT代表即时(Just-in-Time),这意味着在需要时而不是在运行时才对代码进行编译。
只是在上面的讨论中增加了一点,JVM维护着一个函数执行多少次的计数。如果此计数超过预定义的限制,则JIT会将代码编译为机器语言,该语言可以直接由处理器执行(不同于正常情况下,javac将代码编译为字节码,然后由java解释器逐行解释此字节码,将其转换为机器代码并执行)。
同样,下次计算此函数时,将再次执行相同的编译代码,这与正常解释不同,在正常解释中,代码逐行再次解释。这使执行速度更快。
JIT代表即时(Just-in-Time),这意味着在需要时而不是在运行时才对代码进行编译。
这是有益的,因为编译器可以生成针对您的特定计算机优化的代码。像普通的C编译器一样,静态编译器会将所有代码编译为开发人员计算机上的可执行代码。因此,编译器将基于一些假设执行优化。它可以编译得更慢并且可以进行更多优化,因为它不会降低用户程序的执行速度。
Java编译器生成字节代码(与体系结构无关)后,执行将由JVM(在Java中)处理。字节码将由加载程序加载到JVM中,然后解释每个字节指令。
当我们需要多次调用一个方法时,我们需要多次解释相同的代码,这可能比需要花费更多的时间。因此,我们有了JIT(即时)编译器。将字节加载到JVM(运行时)后,整个代码将被编译而不是解释,从而节省了时间。
JIT编译器仅在运行时起作用,因此我们没有任何二进制输出。
即时编译器(JIT):
它将Java字节码编译为该特定CPU的机器指令。
例如,如果我们的java代码中有一个loop语句:
while(i<10){
// ...
a=a+i;
// ...
}
如果i的值为0,则上述循环代码将运行10次。
不必一次又一次地编译字节码10次,因为同一条指令将执行10次。在这种情况下,仅需编译一次该代码,并且该值可以更改所需的次数。因此,Just In Time(JIT)编译器会跟踪此类语句和方法(如前所述),并将此类字节代码编译为机器代码以提高性能。
另一个类似的示例是在字符串/句子列表中使用“正则表达式”搜索模式。
JIT编译器不会将所有代码编译为机器代码。它编译在运行时具有类似模式的代码。
您有被某些IL(中间语言)编译的代码。当您运行程序时,计算机不理解该代码。它只了解本机代码。因此,JIT编译器可将您的IL即时编译为本机代码。它在方法级别执行此操作。
即时编译器(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)编译,(也动态翻译或运行时编译),是一个执行计算机代码的方式即在执行过程中涉及编译程序的-在运行时- 而不是在执行之前。
IT编译是两种传统的翻译成机器代码的方法的组合 - 提前编译(AOT)和解释 -并结合了两者的优点和缺点。JIT编译结合了已编译代码的速度和解释的灵活性。
让我们考虑一下JVM中使用的JIT,
例如,HotSpot JVM JIT编译器会生成动态优化。换句话说,它们在Java应用程序运行时做出优化决策,并生成针对底层系统体系结构的高性能本机指令。
选择一种方法进行编译时,JVM会将其字节码提供给即时编译器(JIT)。JIT必须先了解字节码的语义和语法,然后才能正确编译该方法。为了帮助JIT编译器分析该方法,首先将其字节码重新格式化为称为跟踪树的内部表示形式,该内部表示比字节码更类似于机器代码。然后对方法的树进行分析和优化。最后,将树翻译成本地代码。
跟踪树是在编程代码的运行时编译中使用的数据结构。跟踪树用于“及时编译器”中,该跟踪器跟踪在热点期间执行的代码并对其进行编译。请参考此。
参考:
非JIT编译器获取源代码,并在编译时将其转换为机器特定的字节码。JIT编译器采用在编译时生成的与机器无关的字节码,并在运行时将其转换为机器特定的字节码。Java使用的JIT编译器允许单个二进制文件无需修改就可以在多种平台上运行。
80%的时间使用了20%的字节码。JIT编译器获取这些统计信息,并通过添加内联方法,删除未使用的锁等并创建特定于该计算机的字节码来优化这20%的字节码以使其运行更快。我引用这篇文章,发现它很方便。http://java.dzone.com/articles/just-time-compiler-jit-hotspot
JIT指的是少数JVM实现中的执行引擎,它是一种即时编译器,速度更快但需要更多内存。在这种方案中,方法的字节码在第一次调用该方法时被编译为本地机器代码。然后将缓存该方法的本机代码,以便下次调用同一方法时可以重新使用它。