41

Just-in-Time-Compiler 和 Interpreter 之间有什么区别,.NET 和 Java JIT 编译器之间有什么区别?

4

8 回答 8

50

我总是发现更抽象的解释有时会有所帮助。假设您想问墨西哥的每个人“你好。你好吗?” (您的源语言)当然,您首先需要将其翻译成西班牙语(该国的母语)。那个翻译应该是“Hola. Como estas?”

如果您懂西班牙语,则无需翻译(本机代码/汇编程序)。你只是问“Hola。Como estas?”

如果你不懂西班牙语,有 3 种方法来处理它。

首先是获取西班牙语词典(一个编译器)并在你走之前查看西班牙语单词是什么。也许你意识到“Hola. Que tal?” 短一个音节(编译器优化)并改用它。这是语言编译;您事先将信息转换为母语。

第二个是当您站在第一个人面前时查找西班牙语词典中的单词然后存储结果(查找单词just-in-time)。这样做的好处是你可以得到一本普通话词典,然后在中国做同样的实验,而不必保留十个翻译短语的便签(不同平台的二进制文件)。

第三个是当你站在每个人面前时查找单词的地方。从本质上讲,您分别为每个人解释单词(您充当口译员)。这里的优点是任何更改都会立即反映在下一个人身上(您可以更改为询问“你好。你的狗是什么颜色的?”而无需飞回家并重新启动 - 您无需重新编译短语)。

  • 预先翻译意味着您可以最快地询问人们(编译);你甚至不需要随身携带字典。
  • 当你看到每个国家的第一个人时翻译几乎和事先翻译一样快,但仍然可以让你去多个国家旅行而不需要回家拿字典,但这意味着你需要随身携带几本字典(独立于平台运行时)。
  • 按需翻译要慢得多,但允许您在不回家的情况下更改单词(源分布式语言)。
于 2014-11-18T19:23:12.437 回答
37

即时编译是在执行之前将非本机代码(例如字节码)转换为本机代码。

来自维基百科:

JIT 建立在运行时环境中的两个早期想法之上:字节码编译和动态编译。它在本机执行之前在运行时转换代码,例如将字节码转换为本机机器代码。

解释器执行程序。它可能有也可能没有抖动。

同样,来自维基百科:

解释器可能是一个程序

  1. 直接执行源代码
  2. 将源代码转换为一些有效的中间表示(代码)并立即执行
  3. 显式执行由编译器生成的存储的预编译代码,该编译器是解释器系统的一部分

标准 Java 和 .NET 发行版都具有 JIT 编译,但标准并不要求它。.NET 和 C# 中的 JIT 编译器当然不同,因为中间字节码不同。不过原理是一样的。

于 2010-03-11T15:23:00.010 回答
21

解释器为每条指令动态生成并执行机器代码指令,而不管它之前是否已经执行过。
JIT 缓存先前已解释为机器代码的指令,并重用那些本机机器代码指令,从而无需重新解释已解释的语句,从而节省时间和资源。

于 2010-03-11T15:25:09.057 回答
9

tl;博士

解释器:一次只执行一条指令

Just-in-time:一次获取一段代码并在执行前编译它。所以有很大的优化空间

于 2017-03-26T05:47:43.760 回答
7

执行引擎是编译器还是解释器的问题可以很简单地通过考虑如果例程执行 1,000 次会发生什么来回答。如果执行引擎中的代码必须检查代码的某些特定表示 1,000 次,则执行引擎是该表示的解释器。如果执行中的代码,执行引擎只需检查代码的特定表示的次数较少(通常,但不一定是一次),它是该表示的编译器或翻译器。请注意,执行引擎接受输入代码并将其转换为更容易检查的其他形式是很常见的。这样的执行引擎会将前一种形式的编译器或翻译器与后一种形式的解释器结合起来。

请注意,解释器很少产生任何形式的机器代码。解释器产生机器代码的唯一时间是当语句应该执行一些实际上无法以任何其他方式完成的操作时。例如,如果在 8080 上运行的 BASIC 解释器遇到指令“OUT 100,5”,它通常会通过将 D3 64 C9 (OUT 64h / RET) 存储到某个固定地址的三个连续字节中来执行该操作,加载 A 5,并呼叫该地址。解释器在技术上可能正在生成机器代码,但如果要执行相同的 OUT 指令 500 次,则解释器每次都必须重新生成机器代码。

于 2011-09-27T16:17:48.757 回答
3

JIT 编译器生成二进制机器代码来翻译块源代码。口译员逐行翻译。

于 2010-03-11T19:41:36.993 回答
1

当第一次引用一个类时,JIT 执行引擎将 Java 编译器生成的包含 JVM 指令集的 .class 文件(主二进制文件)重新编译为包含 HOST 系统指令集的二进制文件。JIT 存储和重用那些从内存中重新编译的二进制文件,从而减少解释时间并从本机代码执行中受益。

另一方面,一个普通的老式 java 解释器一次解释来自类文件的一条 JVM 指令,并针对它调用一个过程。

在此处找到详细比较http://bitshub.blogspot.com/2010/01/Flavors-of-JVM.html

于 2014-02-21T02:32:03.283 回答
0

当您编译 Microsoft.NET 语言时,编译器会生成以 Microsoft 中间语言 (MSIL) 编写的代码。MSIL 是一组可以快速转换为本机代码的指令。

Microsoft.NET 应用程序只有在 MSIL 代码被翻译为本机代码后才能运行。在 .NET Framework 中,中间语言在应用程序或组件运行时“即时”(JIT) 编译为本机代码,而不是在开发时编译应用程序。

更多信息

于 2010-03-11T15:29:10.747 回答