为什么python在解释之前将源代码编译为字节码?

12 python compiler-construction interpreter bytecode

为什么python在解释之前将源代码编译为字节码?

为什么不直接从源头解释?

Kon*_*lph 33

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

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

  • 甚至我 TRS-80 上的旧 MS BASIC 也使用了一种非常简单的编码方案:只要我输入或编辑一行,BASIC 关键字就会折叠成单个字节。 (2认同)
  • @DavidThornley:许多 1980 年代的计算机使用 MS-basic 的衍生物,将关键字转换为标记,但以文本形式保留数字和变量名称,因此必须计算它们的值或在运行时查找它们。Atari BASIC 进行了更多的处理,构建了一个变量表并用索引替换了它们的名称。它还将数字转换为 BCD 浮点数。只有字符串文字和注释被存储为文本。这样的事情可能让 Atari BASIC 的表现优于其他人,除了每行的数字以二进制形式存储,但 GOTO 目标...... (2认同)
  • ...存储为 BCD 浮点数,因此每个 GOTO 都需要进行 BCD 到二进制的转换。尽管如此,有趣的是 Atari BASIC 的作者将程序转换为解析的表示,而不是简单地用标记替换关键字。 (2认同)

Dav*_*ebb 8

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

因此,如果您多次运行脚本,则只需要解析源代码一次.


Bri*_*ian 7

因为直接从字节码解释更快.一方面,它避免了做lexing的需要.


Ale*_*lli 6

一遍又一遍地重复和解析源代码,而不是只做一次(通常在第一次import),显然是一种愚蠢而毫无意义的浪费.