Roo*_*ian 34 .net java compiler-construction interpreter jit
Just-in-Time-Compiler和Interpreter之间有什么区别,.NET和Java JIT编译器之间有区别吗?
Mar*_*ers 35
即时编译是在执行之前将非本机代码(例如字节码)转换为本机代码.
来自维基百科:
JIT建立在运行时环境中的两个早期想法:字节码编译和动态编译.它在本机执行代码之前在运行时转换代码,例如字节代码到本机代码.
一种解释执行程序.它可能有也可能没有抖动.
再次,来自维基百科:
口译员也可以是一个程序
- 直接执行源代码
- 将源代码转换为一些有效的中间表示(代码)并立即执行此操作
- 显式执行由编译器生成的存储的预编译代码,该编译器是解释器系统的一部分
标准Java和.NET发行版都有JIT编译,但标准并不要求它..NET和C#中的JIT编译器当然是不同的,因为中间字节码是不同的.但原则是一样的.
Col*_*ome 35
我总是发现更抽象的解释有时会有所帮助.让我们说你试图问墨西哥的每个人"你好.你好吗?" (您的源语言)当然,您首先需要将其翻译成西班牙语(该国的母语).翻译将是"Hola.Como estas?"
如果您懂西班牙语,则无需翻译(本机代码/汇编程序).你问"Hola.Como estas?"
如果您不懂西班牙语,有3种方法可以解决它.
第一个是获得西班牙语词典(编译器)并在你去之前查找西班牙语单词.也许你意识到"Hola.Que tal?" 是一个短音节(编译器优化)并使用它.这是语言汇编 ; 您事先将信息转换为母语.
第二个是你站在第一人称面前查找西班牙语词典中的单词,然后存储结果(查找单词及时).这里的优势在于您可以获得普通话词典,然后在中国进行相同的实验,而不必保留翻译短语的十个粘滞便笺(不同平台的二进制文件).
第三是当你站在每个人面前时,你在那里查找单词.实质上,您可以分别解释每个人的单词(您充当翻译).这里的优点是任何变化都会立即反映给下一个人(你可以改为询问"你好.你的狗是什么颜色的?"而不必飞回家并重新启动 - 你不需要重新编译这些短语).
cro*_*wne 16
解释器为每条指令动态生成并执行机器代码指令,无论它是否先前已被执行.
JIT将先前已解释的指令缓存到机器代码,并重用那些本机机器代码指令,从而通过不必重新解释已经解释的语句来节省时间和资源.
通过考虑如果例程执行1000次会发生什么,可以非常简单地回答执行引擎是编译器还是解释器的问题.如果执行引擎中的代码必须检查代码的某些特定表示1000次,则执行引擎是该表示的解释器.如果执行中的代码执行引擎只需要检查代码的特定表示的次数较少(通常,但不一定是一次),则它是该表示的编译器或转换器.请注意,执行引擎通常会接受输入代码并将其转换为其他可以更容易检查的形式.这样的执行引擎将前一种形式的编译器或翻译器与后一种形式的解释器组合.
请注意,解释器很少生成任何形式的机器代码.几乎是解释器生成机器代码的唯一时间是一个语句应该执行一些实际上无法以其他方式完成的操作.例如,如果在8080上运行的BASIC解释器遇到指令"OUT 100,5",它通常会通过将D3 64 C9(OUT 64h/RET)存储到某个固定地址的三个连续字节来执行该操作,加载A 5,并调用该地址.解释器在技术上可以生成机器代码,但是如果要执行500次相同的OUT指令,则解释器必须每次都重新生成机器代码.