python解释器如何在下面的代码中逐行解释运行代码?

How does python interpreter run the code line by line in the following code?

我读到解释器 运行 逐行执行代码并同时报告错误(如果有)并停止进一步执行。 所以在 python 中,考虑文件 ex1.py,

print "Hello world"
12variable = 'bye'
print 12variable

现在根据解释器的工作,解释器会 运行 第一行,即先打印 hello world,然后在下一行显示语法错误(逐行工作)。因此预期的输出是:

Hello world
12variable = 'bye'
         ^
SyntaxError: invalid syntax

但实际输出是-

12variable = 'bye'
         ^
SyntaxError: invalid syntax

为什么一开始不打印 Hello World

因为你对解释器的理解有误。虽然您所描述的行为可能会发生在一部分错误中,但对于许多(大多数?)错误来说并不常见。

如果解释器可以构建它认为有效的程序,但在 运行 时出现错误,那么您所描述的就会发生。

由于您所指的情况是一个语法错误,它阻止了有效程序的构建,因此行为如您所见。

Python 是一种完全解释的语言,这是一个神话。当 CPython 运行一个脚本时,源代码被解析(这是它会捕获语法错误的地方),并在执行任何东西之前编译成字节码(有时它们作为 .pyc 文件缓存在你的目录中) .在这方面 Python 与 Java 或 C# 并没有根本不同,除了它不会花太多时间做任何优化,我相信字节码一次解释一条指令,而不是被 JIT 编译成机器代码(除非你使用 PyPy 之类的东西)。

这取决于您如何运行 Python 翻译。如果你给它一个完整的源文件,它会首先解析整个文件并将其转换为字节码,然后再执行任何指令。但是如果你一行一行地喂它,它会解析并执行代码 bloc by bloc:

  • python script.py : 解析完整文件
  • python < script.py : 由 bloc
  • 解析执行

后者通常是您以交互方式或通过 GUI shell 使用它的方式,例如 idle

我是这样理解的:

Python 运行逐行代码之后是字节码状态。

这个东西和编译(在其他语言如 C++ 中)之间的区别是你每次 运行 脚本时都必须执行这个解释过程。

Python 解释器在您每次 运行 脚本时解释代码。

在C++中,你编译程序,除非你想改变系统,否则你不需要重新编译就可以执行它。

第 1 步:

解释器读取 python 代码或指令。然后它验证指令格式是否正确,即检查每一行的语法。如果遇到错误,它会立即停止翻译并显示错误消息。

第 2 步:

如果没有错误,即如果 python 指令或代码格式正确,则解释器将其翻译成一种称为“字节码”的中间语言的等效形式。因此,在成功之后执行Python个脚本或代码,完全翻译成字节码。

第 3 步:

字节码被发送到Python虚拟机(PVM)。在这里,字节码再次在PVM上执行。如果在此执行期间发生错误,则执行将停止并显示一条错误消息。 因此,在您的情况下, "invalid syntax" 错误是由于第 1 步而引发的。但是,实际的打印功能在第 3 步执行。第 3 步仅在第 1 步之后出现...我想现在明白了。