【问题标题】:Python compiled file generated even though wrong syntax即使语法错误也会生成 Python 编译文件
【发布时间】:2016-09-13 18:32:14
【问题描述】:

我写了一个小程序'test1.py'

print abc
print 'the above is invalid'

现在我写了一个不同的python程序'test2.py'

import test1
print 'this line will not get executed'

Q1:令我惊讶的是,我可以看到 test1.pyc 文件已成功生成。为什么? 由于 test1.py 在第一行包含无效语句,为什么会生成 test1.pyc 文件?编译器到底检查了什么(是语法还是其他什么?)。我很困惑。请澄清。

Q2:我还看到编译后的python文件会被进一步解释,是真的吗?

Q3:编译器将程序整体转换为机器码。这不需要通过解释器进一步解释吗?这是真的吗?如果是这样,那问题2呢?

Q4:我还读到编译后的代码更接近机器。当我们使用解释器时,它将代码转换为中间代码,需要进一步转换为机器代码。对吗?那么,编译代码比解释代码更接近机器?

【问题讨论】:

    标签: python python-2.7 compilation


    【解决方案1】:

    第一季度:

    两个文件都不包含任何语法错误。因此,模块 test1 可以成功地编译成解释器可以读取的指令。然而,*编译没有代码内省,可以提前确定变量是否在任何给定点定义。

    *我更喜欢将这种转换视为翻译而不是编译,因为它在很大程度上根本不会改变代码结构,而是将其翻译成更易于解释器阅读的指令。编译意味着代码检查超出了简单的语法检查。 (谷歌翻译通常会给出一些语法正确的东西,但它可能有意义也可能没有任何意义。

    第二季度:

    python 解释器理解所谓的bytecode。从功能上讲,它是一个用 c 编写的程序,它采用 *compiled 代码并在机器上执行它。对于要在其上运行代码的每种硬件变体,都会编译该程序的一个版本(特别是 ceval.c)以与该硬件(无论是 x86、arm、mips 等)一起使用,并解释字节码无论您运行什么硬件,这都是一样的。这就是允许 python(和许多其他解释语言)跨平台的原因

    第三季度

    不,这不是真的。 *编译的python代码通过相同的解释器正常代码运行。 *compiled python 代码的好处在于模块的加载时间。在执行任何 python 代码之前,它会被转换为字节码,然后发送到解释器。每次使用脚本都会这样做,但是当 python 将脚本作为模块导入时,它会保存已经解析的字节码的副本,以便下次省去麻烦。

    第四季度

    您在这里的困惑可能是由于 python *编译文件的命名约定不佳。它们并没有真正编译成机器指令,因此它们必须由程序而不是硬件本身来执行。真正的编译器是翻译和优化代码(c、c++、fortran 等)并按制造商指定的实际二进制硬件指令的程序。

    我已尽力猜出您对什么感到困惑,但如果您还有其他问题,请随时提问..

    【讨论】:

      猜你喜欢
      • 2019-07-04
      • 1970-01-01
      • 2020-06-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-12-08
      • 2013-07-16
      • 1970-01-01
      相关资源
      最近更新 更多