到目前为止,我已经设计了大约5种实验性语言及其解释器,用于教育、作为业余爱好和娱乐。
我注意到一件事:仅包含子例程和条件跳转结构的类汇编语言比包含if、while等高级结构的高级语言要慢得多。我同时开发了它们两个,都是解释型语言。我用C++编写了解释器,并尝试将代码执行部分优化为最快。
我的假设:几乎在所有情况下,解释型语言的性能随着它们的级别(高/低)而提高。
- 我的观点基本正确吗?(如果不是,为什么?)
编辑:我在这里甚至没有一次提到“编译”,这是关于解释型与解释型的比较!
到目前为止,我已经设计了大约5种实验性语言及其解释器,用于教育、作为业余爱好和娱乐。
我注意到一件事:仅包含子例程和条件跳转结构的类汇编语言比包含if、while等高级结构的高级语言要慢得多。我同时开发了它们两个,都是解释型语言。我用C++编写了解释器,并尝试将代码执行部分优化为最快。
我的假设:几乎在所有情况下,解释型语言的性能随着它们的级别(高/低)而提高。
编辑:我在这里甚至没有一次提到“编译”,这是关于解释型与解释型的比较!
在这两种情况下,您都需要解释代码。我想,在高级语言中,您需要更少的指令来完成相同的任务,因此您会花费更少的时间解释指令并且可以更多地做有用的事情。
最终,在您的语言中解析一行文本需要的时间大致相同,无论我们讨论汇编语言还是下一代语言(TNBL)。这在字面上并不是真的,但在图灵式的大O符号表示法下是真的。
如果确定这意味着需要(再次,“大致”)相同的时间:
mov $3, $4, $5
像这样:
print "foo"
如果我们想象用两种语言写一个Hello World程序,那么汇编解释器将不得不解析一个更复杂的程序。比如说,有n行代码,这意味着与TNBL Hello World相比,基本开销增加了n倍。
此外,你还需要在简单语言中执行所有模拟寄存器、操作等行为的代码。这是一项很大的工作。在TNBL中,解释码和宿主语言之间几乎是一对一的映射。这意味着从语义到执行的开销大大降低。
我相信你会看到一些Java程序员对这个论点提出异议,但我要指出,Java具有一些优势:一种中间字节码,试图在执行代码之前将代码尽可能接近硬件,并且投入了成千上万的人年来开发该语言的编译时和运行时优化。它们与一门业余语言完全不同。=]
显然,这将取决于您如何实现不同的语言。
我猜想,在低级别解释语言中执行相同操作需要解释更多指令,并且必须解释每个低级别指令而不是较少的高级语句,因此会有开销。
runMyEntireProgramNatively()
,那么它比有更多命令的解释性语言更快。每个命令所做的越少,解释所花费的时间与实际执行任务的时间之比就越大。如何进行公正的比较?
我假设您不计算解析速度,并且我假设您正在生成中间字节码指令集,这就是您要解释的内容。
假设您有一个“基准测试”,它是一个循环,用于对数组元素求和。如果您的高级语言具有特殊的字节码指令,以便在高级语言中,有更少的字节码需要解释,那么这就可以解释为什么它更快。
假设两者实现方式大致相同,低级语言未经优化,高级语言未扩展到较低级别的中间代码 - '可能'。
在这种情况下,高级语言将具有将更多编译(更快)的代码压缩到每个指令中的优势。
但实际上,低级解释语言应该能够减少每个指令的开销,并且通常更容易实现JIT编译。最终,每种语言的实现质量将决定它们如何相互比较。
我会说,实现更快的高级语言是更容易的。(根据我的有限经验)