与非JIT编译器相比,JIT编译器具体做什么?有人能给出简洁易懂的描述吗?
当前回答
正如其他人提到的
JIT代表Just-in-Time,这意味着代码在需要时才编译,而不是在运行时之前。
为了给上面的讨论补充一点,JVM维护一个函数执行时间的计数。如果该计数超过预定义的限制,JIT将代码编译为处理器可以直接执行的机器语言(不像一般情况下,javac将代码编译为字节码,然后java -解释器逐行解释这个字节码,将其转换为机器代码并执行)。
另外,下次计算此函数时,将再次执行相同的编译代码,而不像常规解释那样逐行重新解释代码。这使得执行速度更快。
其他回答
JIT编译器在程序启动后运行,并实时(或称为just-in-time)将代码(通常是字节码或某种虚拟机指令)编译为通常更快的形式,通常是主机CPU的本机指令集。JIT可以访问动态运行时信息,而标准编译器不能,并且可以进行更好的优化,例如经常使用的内联函数。
这与传统的编译器相反,传统的编译器在程序第一次运行之前将所有代码编译为机器语言。
换句话说,在你第一次运行程序之前,传统的编译器会将整个程序构建为一个EXE文件。对于新样式的程序,程序集是用伪代码(p-code)生成的。只有在你在操作系统上执行程序之后(例如,通过双击它的图标),(JIT)编译器才会启动并生成基于英特尔处理器或其他能够理解的机器代码(m-code)。
在Java编译器生成字节代码(与体系结构无关)之后,执行将由JVM(在Java中)处理。字节代码将由加载器加载到JVM中,然后解释每个字节指令。
当我们需要多次调用一个方法时,我们需要多次解释相同的代码,这可能会花费更多的时间。所以我们有了JIT(即时)编译器。当字节被加载到JVM(它的运行时)中时,整个代码将被编译而不是解释,从而节省时间。
JIT编译器只在运行时工作,所以我们没有任何二进制输出。
正如其他人提到的
JIT代表Just-in-Time,这意味着代码在需要时才编译,而不是在运行时之前。
为了给上面的讨论补充一点,JVM维护一个函数执行时间的计数。如果该计数超过预定义的限制,JIT将代码编译为处理器可以直接执行的机器语言(不像一般情况下,javac将代码编译为字节码,然后java -解释器逐行解释这个字节码,将其转换为机器代码并执行)。
另外,下次计算此函数时,将再次执行相同的编译代码,而不像常规解释那样逐行重新解释代码。这使得执行速度更快。
即时编译器(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
虽然在一般情况下,当我们想要将源代码转换为机器码时可能会有例外,但我们可以使用:
Compiler: Takes source code and returns a executable Interpreter: Executes the program instruction by instruction. It takes an executable segment of the source code and turns that segment into machine instructions. This process is repeated until all source code is transformed into machine instructions and executed. JIT: Many different implementations of a JIT are possible, however a JIT is usually a combination of a compiler and an interpreter. The JIT first turn intermediary data (e.g. Java bytecode) which it receives into machine language via interpretation. A JIT can often measures when a certain part of the code is executed often and the will compile this part for faster execution.
Jit代表即时编译器 Jit是一个将Java字节代码转换为可以直接发送到处理器的指令的程序。
在特定的系统平台上使用java即时编译器(实际上是第二个编译器)将字节码遵从为特定的系统代码,一旦代码被jit编译器重新编译,它通常会在计算机中运行得更快。
即时编译器随虚拟机一起提供,可选使用。它将字节码编译为立即执行的特定于平台的可执行代码。
推荐文章
- Go是如何编译得这么快的?
- 编译警告:对于架构i386,没有处理文件的规则
- LL和LR解析之间的区别是什么?
- 为什么Java在连续整数上的切换与添加的情况下运行得更快?
- Clang vs GCC——哪个生成更快的二进制文件?
- __PRETTY_FUNCTION__, __FUNCTION__, __func__之间的区别是什么?
- 为什么编译Python代码?
- 显示构建日期
- 编译语言与解释语言
- 为什么要用C语言链接数学库?
- 如何防止较少试图编译CSS calc()属性?
- 错误:java:无效的源代码发布:8 Intellij。这是什么意思?
- .NET 3.5 JIT在运行应用程序时无法工作
- Java JIT在运行JDK代码时会作弊吗?
- 如何检查Python脚本的语法而不执行它?