2009-05-20 107 views

回答

33

几乎没有口译员真的直接解释代码 - 它的效率太低了。几乎所有的解释器都使用一些可以轻松执行的中间表示。此外,可以对此中间代码执行小型优化。

Python还存储了这个代码,这对下次执行代码具有巨大的优势:Python不必再解析代码;解析是编译过程中最慢的部分。因此,字节码表示相当大地减少了执行开销。

+1

即使我的TRS-80上的旧MS BASIC使用了一种非常简单的编码方案:只要我输入或编辑了一行,BASIC关键字就被折叠为单个字节。 – 2009-07-27 17:46:39

+1

@DavidThornley:1980年代的许多计算机都使用MS-Basic的衍生产品,它将关键字转换为记号,但是保留了文本形式的数字和变量名称,因此必须计算它们的值或在运行时查看它们。 Atari BASIC做了更多的处理,建立一个变量表并用索引替换它们的名字。它还将数字转换为BCD浮点数。只有字符串文字和评论被存储为文本。这样的事情可能会让Atari BASIC超越其他,除了每行的编号被存储为二进制,但GOTO的目标...... – supercat 2014-01-29 16:59:52

+1

...被存储为BCD浮点,所以每个GOTO都需要一个BCD到二进制的转换。不过,有趣的是,Atari BASIC的作者将程序转换为解析表示,而不是简单地用关键词替换关键词。 – supercat 2014-01-29 17:01:34

7

因为直接从字节码解释更快。首先,它避免了需要进行练习。

8

因为您可以编译为.pyc一次并从中解释很多次。

因此,如果您多次运行脚本,只会产生一次解析源代码的开销。

6

一遍又一遍地重新解析和分析源代码,而不是仅仅执行一次(通常在第一个import上),显然是一个愚蠢和毫无意义的浪费。

-1

我非常怀疑,原因是性能,尽管这是一个很好的副作用。我会说,认为围绕某种高级汇编语言构建的虚拟机比在某些源代码字符串中查找和替换文本更实用是很自然的。

编辑:

好了,显然,谁没有把在我的岗位-1票不留一个合理的评论,说明知之甚少虚拟机(运行时环境)。

http://channel9.msdn.com/shows/Going+Deep/Expert-to-Expert-Erik-Meijer-and-Lars-Bak-Inside-V8-A-Javascript-Virtual-Machine/

2

虽然有一个小的效率方面是它(可以字节码存储在磁盘上或在存储器中),其主要是工程:它允许分开解释解析。解析器通常是令人讨厌的生物,充满了边缘情况,不得不遵守隐秘的规则,比如只使用适量的预测和解决移位减少问题。相比之下,解释非常简单:它只是一个使用字节码操作码的大开关语句。

相关问题