即使语法错误,也会生成Python编译文件

时间:2016-09-13 18:32:14

标签: python python-2.7 compilation

我写了一个小程序'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呢?

第四季:我还读到编译后的代码离机器越来越近了。当我们使用解释器时,它将代码转换为中间代码,需要进一步转换为机器代码。这是正确的吗?那么,编译后的代码比解释代码更接近机器?

1 个答案:

答案 0 :(得分:1)

Q1:

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

*我喜欢将这种转换更多地视为翻译而不是编译,因为它根本不会改变代码结构,而是将其转换为更容易让解释器读取的指令。编译意味着代码检查不仅仅是简单的语法检查。 (谷歌翻译通常会给出一些语法正确的东西,但它可能有或没有任何意义。

Q2:

python解释器理解所谓的bytecode。它在功能上是用c编写的程序,它接受*编译代码并在机器上执行它。对于要运行代码的硬件的每个变体,编译该程序的一个版本(特别是ceval.c)以使用该硬件(无论是x86,arm,mips等...),并解释字节码无论你运行什么硬件,都是一样的。这使得python(和许多其他解释语言)成为跨平台的

Q3

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

Q4

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

我尽我所能猜到你对此感到困惑,但如果你有任何其他问题可以随意提问..