我还不清楚JIT编译器将字节码编译成机器码的概念。我想知道为什么它产生更快的代码v.s非JIT解释器。有人能给我一个关于如何完成这个过程的好例子吗?
答案 0 :(得分:20)
假设你有一个需要执行一百万次的循环。
“真正的”解释器需要在循环的每次迭代中查看此字节码,并确定代码应对系统状态(调用等)产生的影响。
JIT编译器仅查看字节码一次 1 ,并将其编译为本机代码,然后可由计算机直接理解 - 无需进一步翻译。翻译需要时间,所以如果你只做一次,它会更有效率。
举一个现实世界的例子:如果你有一本英文小说,以及一些对它感兴趣的法国人,你可以把这本书交给那些懂两种语言的人,谁能阅读它大声地对每个人大声说出来。或者,你可以让那个人拿走这本书,把它翻译成法语,然后用法语给每个法国人一本书。如果只有一个人对这本书感兴趣,那么即时翻译会更有效率 - 不需要复制编辑器,布局专家,打印机等...但如果你有很多人想要阅读本书,然后进行更彻底的一次性翻译 更有意义。
1 一些JIT,包括HotSpot中的一个JIT,实际上会根据不同的优势,使用不同的优化级别多次JIT编译相同的代码。
答案 1 :(得分:1)
JIT编译的代码实际上直接在裸机上运行,而解释代码必须由解释器不断重新解释。解释器不再需要重新处理和重新处理字节代码。
答案 2 :(得分:0)
编译器将我们的高级源代码翻译成字节码,并将字节码翻译成机器码,一些实现有普通的解释器,一些有即时编译器。为了执行一个循环,比如说,百万次,JIT 编译器只将字节码转换为机器码一次,而在下一次迭代中,机器只会理解字节码。而普通解释器,在每次迭代中,反复将字节码翻译成机器码,从而需要更多时间来完成一个循环,比如说,百万次。