口译语言:越高越快?

时间:2010-05-05 17:43:14

标签: performance programming-languages language-design interpreter

到目前为止,我为他们设计了大约5种实验语言和口译员,用于教育,作为一种爱好和乐趣。

我注意到的一件事:类似汇编的语言只有子程序和条件跳转作为结构,比if,while等高级语言要慢得多。我同时开发它们,两者都是解释语言。我用C ++编写了解释器,并尝试尽可能快地优化代码执行部分。

我的假设:在几乎所有情况下,解释语言的表现都会随着它们的水平(高/低)而上升。

  • 我基本上是对的吗? (如果不是,为什么?)

编辑:我在这里没有提到编译这个词,甚至一次,它是解释与解释的对比!

9 个答案:

答案 0 :(得分:30)

在这两种情况下,您都在处理代码。我认为在更高级别的语言中,你有更少的指令来完成相同的任务,因此你花费更少的时间来解释指令,花更多的时间做一些有用的事情。

答案 1 :(得分:12)

最后,无论我们谈论的是装配还是下一件大事语言(TNBL),用您的语言解析一行文本的时间大致相同。从字面意义上讲,情况并非如此,但在Turing-esque,Big-O-Notation中也是如此。

如果需要(再次,“大致”)相同的时间来确定这意味着什么:

mov $3, $4, $5

这样:

print "foo"

...然后让我们想象用我们的两种语言编写Hello World。汇编解释器将有一个更复杂的程序来解析。比方说, n 行很长,这是 n 行的次数与TNBL Hello Wolrld一样多。所以你最基本的开销是 n 次。

最重要的是,您拥有以简单语言执行的所有代码,这些语言模拟了寄存器,操作等的行为。这是很多工作。在TNBL中,解释代码的语义与您可以在宿主语言中执行的操作之间几乎存在一对一的映射。这意味着从语义到执行的开销大大减少。

我相信你会看到一些不喜欢这篇论文的Java程序员,但我要指出Java有一些优点:一个中间字节码试图让代码接近于在执行它之前尽可能使用硬件,并且数千人工作时间沉没于开发该语言的编译时和运行时优化。他们几乎不会使用业余爱好者的语言。 =]

答案 2 :(得分:4)

当然,现实情况稍微复杂一些。随着语言,口译员和编译器变得越来越复杂,机器出现了新的机会来优化性能。此外,任何给定程序的性能在很大程度上取决于程序员编写的代码的质量。

此外,性能会以不同方式影响不同类型的程序。例如,业务线应用程序几乎总是将大部分速度从数据库中查找数据并通过网络发送,而游戏程序员必须处理完全不同的性能概念,即视频卡帧率。

因此,性能图片并不像看起来那么简单。

答案 3 :(得分:1)

嗯,很明显,这取决于你如何实现不同的语言。

我猜想需要解释更多指令以在较低级别的解释语言中执行相同的操作,并且必须解释每个低级别指令而不是更少的更高级别语句。 / p>

答案 4 :(得分:1)

我说你差不多一半。如果你绘制了解释速度,X轴上的语言水平和Y轴上的执行速度,你会得到一个“浴缸”曲线 - 解释一个极低级别的语言可以非常快,并解释一个非常高的级别语言可以非常快。在两者之间,解释速度要慢得多。

鉴于极高级别的输入语言(例如,APL),您可以获得最小的解释开销,因为您可以基于解析相对较少的输入代码来完成大量工作。

在相反的极端,你可以获得相当不错的速度,因为使用足够低级别的语言,解释变得几乎无足轻重。 Forth实现的内部解释器就是一个很好的例子。这些通常代表一个非常紧凑的给定程序,这往往是非常缓存友好的,所以至少在理论上你可以像纯机器代码一样快(甚至更快)执行。

最初的意图是,大多数JVM,.NET“托管”环境,Smalltalk字节码解释器等都适合后一种情况。正如大多数试图开发它们的人很快发现的那样,很难将解释开销保持在足够低的水平以实现这一目标。 hard 我所知道的每一个都适合这个类的内部循环用汇编语言手工编写,通常由好的汇编语言程序员编写。我几乎可以说,如果你尝试使用更高级别的语言(甚至是C语言),它会更慢,而且可能非常显着(当你为每个输入指令,即使内循环中的一条额外指令几乎肯定会导致可测量的速度惩罚。)

答案 5 :(得分:1)

如果你有一个带有一个命令的解释语言:runMyEntireProgramNatively(),它会比带有更多命令的解释语言更快。每个命令越少,解释花费的时间与实际操作的比例就越大。

答案 6 :(得分:0)

摘要:基准测试很难。你无法从轶事中概括出来。

这不是证据支持的规则。

您如何设置实验,从中得出“更高=更快”的结论?您是否有相同算法和测试集的示例实现,允许您客观地测量一种解释语言与另一种解释语言?

如果您只是创建一些小型基准测试,那么您从很少的数据点得出结论的可能性非常高。

例如,如果一种解释语言有quicksort运算符,您可能会认为“啊哈!更快!”而不是你必须手动实现排序的语言。但是,quicksort的最坏情况是O(n ^ 2)。如果我将更高级别的操作作为最坏情况数据集的示例,那么不同的手工实现的merge sort将会击败它。

答案 7 :(得分:0)

你如何进行公平的比较?

我假设您没有计算解析速度,我假设您正在生成一个中间字节码指令集,这就是您所解释的。

假设您有一个“基准”,它是一个对数组元素求和的循环。如果您的高级语言具有特殊的字节代码指令,那么在更高级别的语言中,要解释的字节代码更少,这就解释了为什么它更快。

答案 8 :(得分:0)

假设两者都以大致相同的方式实现,低级语言未经优化,高级语言未扩展到较低级别的中间代码 - “可能”。

在这种情况下,高级语言将具有为每条指令填充更多编译(更快)代码的优势。

在实践中,低级解释语言应该能够减少每条指令的开销,并且通常可以更直接地实现JIT编译。每个实施的程度最终将决定它们如何相互叠加。

我会说更容易来实现更快的高级语言。 (以我有限的经验)