即时编译器和解释器之间有什么区别,.NET和Java JIT编译器之间有区别吗?
答案 0 :(得分:33)
Just-in-time compilation是非本机代码(例如字节码)在执行之前转换为本机代码。
来自维基百科:
JIT建立在运行时环境中的两个早期想法:字节码编译和动态编译。它在本机执行代码之前在运行时转换代码,例如字节代码到本机代码。
interpreter执行程序。它可能有也可能没有抖动。
再次,来自维基百科:
口译员可能是一个程序 任
- 直接执行源代码
- 将源代码翻译成一些有效的中间表示 (代码)并立即执行此
- 显式执行编译器生成的存储预编译代码 这是口译员的一部分 系统
醇>
标准Java和.NET发行版都有JIT编译,但标准并不要求它。 .NET和C#中的JIT编译器当然是不同的,因为中间字节码是不同的。但原则是相同的。
答案 1 :(得分:32)
我总是发现更抽象的解释有时会有所帮助。 让我们说你试图问墨西哥的每个人“你好。你好吗?” (您的源语言)当然,您首先需要将其翻译为西班牙语(该国家/地区的母语)。翻译将是“Hola.Como estas?”
如果您懂西班牙语,则无需翻译(本机代码/汇编程序)。你只问“Hola.Como estas?”
如果你不懂西班牙语,有3种方法可以解决它。
首先是获取西班牙语词典(编译器)并在出发前查看西班牙语单词。也许你意识到“Hola.Que tal?”是一个短音节(编译器优化),并使用它。这是语言编译;您事先将信息转换为母语。
第二个是当你站在第一个人面前然后存储结果时查找西班牙语词典中的单词(查找单词及时)。这里的优势在于您可以获得普通话词典,然后在中国进行相同的实验,而不必保留十个便利贴(不同平台的二进制文件)的翻译短语。
第三个是当你站在每个人面前时,你在那里查找单词。实质上,您可以分别解释每个人的单词(您充当解释器)。这里的优点是,任何更改都会立即反映给下一个人(你可以改为询问“你好。你的狗是什么颜色的?”而不必飞回家并重新启动 - 你不需要重新编译短语)。
答案 2 :(得分:13)
解释器为每条指令动态生成并执行机器代码指令,无论它是否先前已执行过 JIT将先前已解释的指令缓存到机器代码,并重用那些本机机器代码指令,从而节省时间和时间。资源,不必重新解释已被解释的陈述。
答案 3 :(得分:6)
执行引擎是编译器还是解释器的问题可以通过考虑如果例程执行1000次会发生什么来非常简单地回答。如果执行引擎中的代码必须检查代码的某些特定表示1000次,则执行引擎是该表示的解释器。如果执行中的代码执行引擎只需要检查代码的特定表示的次数较少(通常,但不一定是一次),则它是该表示的编译器或转换器。请注意,执行引擎通常会接受输入代码并将其转换为其他可以更容易检查的形式。这样的执行引擎会将前一种形式的编译器或翻译器与后一种形式的解释器结合起来。
请注意,解释器很少生成任何形式的机器代码。几乎是解释器生成机器代码的唯一时间是一个语句应该执行一些真正无法以其他方式完成的操作。例如,如果在8080上运行的BASIC解释器遇到指令“OUT 100,5”,它通常会通过将D3 64 C9(OUT 64h / RET)存储到某个固定地址的三个连续字节来执行该操作,加载A 5,并调用该地址。解释器在技术上可能是生成机器代码,但如果要执行相同的OUT指令500次,则解释器必须每次都重新生成机器代码。
答案 4 :(得分:2)
JIT编译器生成翻译块源代码的二进制机器代码。口译员逐行翻译。
答案 5 :(得分:2)
TL;博士
解释器:一次只执行一条指令
即时:立即获取一段代码并在执行前编译它。所以有足够的优化空间
答案 6 :(得分:1)
当第一次引用类时,JIT执行引擎将包含JVM指令集的Java Compiler生成的.class文件(主二进制文件)重新编译为包含HOST系统指令集的二进制文件。 JIT存储并重用来自Memory的那些重新编译的二进制文件,通过减少解释时间和Native代码执行的好处。
另一方面,一个普通的旧java解释器一次解释一个来自类文件的JVM指令,并对它调用一个过程。
在此处查找详细比较http://bitshub.blogspot.com/2010/01/Flavors-of-JVM.html
答案 7 :(得分:0)
编译Microsoft.NET语言时,编译器会生成用Microsoft中间语言(MSIL)编写的代码。 MSIL是一组可以快速转换为本机代码的指令。
只有在将MSIL代码转换为本机机器代码后才能运行Microsoft.NET应用程序。在.NET Framework中,当运行应用程序或组件而不是在开发时编译应用程序时,中间语言将“及时”(JIT)编译为本机代码。