gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-28 18:28:25 24 4
gpt4 key购买 nike

我写了一个小程序'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:我也看到编译后的代码更接近机器。当我们使用解释器时,它会将代码转换为中间代码,中间代码需要进一步转换为机器码。对吗?那么,编译代码比解释代码更接近机器?

最佳答案

问题1:

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

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

问题2:

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

Q3

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

Q4

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

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

关于即使语法错误也会生成 Python 编译文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39476828/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com