好吧,首先,我不希望在这里发生任何形式的战争或类似的事情。我更大的问题是理论上的问题,将只包括一些示例。

因此,正如我所写,我无法理解解释语言的效率如何。而且自现代以来,我将以Java为例。

让我们回到没有JIT编译器的日子。 Java具有其虚拟机,该虚拟机基本上是其硬件。您编写代码,然后将其编译为字节码,以使虚拟机至少完成一些工作,这没关系。但是考虑到RISC指令集在硬件中的复杂程度,我什至无法想到在软件仿真的硬件上实现它的方法。

我没有编写虚拟机的经验,所以我不知道它在最有效的级别上是如何完成的,但是我想不到的是,比对每条指令进行匹配和测试都比采取适当的措施更有效。您知道,例如:if(instruction=="something") { (do it) } else if(instruction=="something_diffrent"){ (do it) }等。

但这必须非常缓慢。而且,即使有文章说Java在JIT编译器之前就比较慢,他们仍然说Java并不是那么慢。但是为了进行仿真,执行一个字节码指令必须花费许多实际硬件的时钟周期。

而且,甚至整个平台都基于Java。例如,Android。 Android的第一个版本没有JIT编译器。他们被解释了。但是,难道不是Android会非常慢吗?但事实并非如此。我知道,当您从Android库中调用某些API函数时,它们是用机器代码编写的,因此它们非常有效,因此很有帮助。

但是想像一下,您将使用sratch编写自己的游戏引擎,仅使用API​​来显示图像。您将需要执行许多数组复制操作,许多计算,而这些计算在模拟时会非常慢。

现在,我承诺了一些例子。因为我主要使用MCU,所以我找到了Atmel AVR MCU的JVM。 Thay指出8MHZ MCU每秒可以执行20K个Java optcode。但是由于AVR可以在一两个周期内执行大多数指令,因此可以说平均有6000000条指令。这使我们知道,没有JIT编译器的JVM的速度比机器代码慢300倍。那么,为什么没有JIT编译器的Java如此流行呢?这不是太糟糕的性能损失吗?我只是不明白。谢谢。

最佳答案

我们已经有很长一段时间的字节码了。在旧的Apple II上,USCD p系统非常流行,它将Pascal编译为字节码,该字节码将由8位6502解释,其运行频率可能为2 MHz。这些程序运行得相当快。

字节码解释器通常基于跳转表,而不是基于if/then/else语句链。在C或C ++中,这将涉及switch语句。从根本上讲,解释器将具有处理代码数组的等效项,并使用字节码指令中的操作码作为数组的索引。

也可能具有比机器指令更高级别的字节码,因此一个字节码指令将转换为几条(有时是许多条)机器码指令。为特定语言构造的字节码可以很容易地做到这一点,因为它只需要匹配该特定语言的控制和数据结构即可。这延长了解释的开销,并使解释器更有效。

与编译语言相比,解释语言可能会带来一些速度上的损失,但这通常并不重要。许多程序以人工的速度处理输入和输出,这会浪费大量的性能。即使是网络绑定程序,其可用CPU能力也可能远远超过其所需。有些程序可以使用它们可以获得的所有CPU效率,并且出于明显的原因,它们倾向于不使用解释性语言编写。

当然,还有一个问题,就是您因效率低下而得到的收益可能会有所不同,也可能不会有所不同。解释性语言实现往往比编译实现更容易移植,并且实际的字节码通常是可移植的。在语言中放置更高级别的功能会更容易。它使编译步骤变得更短,这意味着执行可以更快地开始。如果出现问题,它可以提供更好的诊断。

10-05 20:48
查看更多