Python 而不是被解释显示编译行为

Python instead of being interpreted shows compiled behaviour

我读到 python 是一种脚本语言,它的执行引擎由解释器组成,逐行执行每一行代码。
我有一个简单的 python代码为-

print("1")
print("2")
print("3")
print("4)

这里第 4 行 print("4) 包含一个错误(缺少结尾引号)。当我 运行 这个程序然后简单地得到一个错误,告诉我第 4 行中的语法错误。

我的问题是,由于 python 被解释而不是编译,那么输出不应该是

1
2
3
Syntax error in line 4

但它直接给我一条错误消息,第 1、2 和 3 行没有任何输出,就像 Java、C 和 C++ 等任何其他编译语言一样
我是 python,请解释。

重要的是要认识到 Python 代码首先被编译成称为字节码的中间形式。该字节码随后由 Python 解释器执行。它类似于 Java 的 compilation/execution 循环,如果你熟悉的话,虽然 Python 可以立即执行编译后的代码。字节码不等同于硬件可以直接执行的机器码,它是更高层次的。

在Python中,编译单元是模块,它通常对应于整个文件,而不是单个语句。

因此您的示例中的第 4 行将与前面的行一起编译,并且第 4 行中的语法错误阻止执行开始。

你可以通过反汇编一个函数来感受一下字节码是什么样子的:

import dis

def f():
    print("1")
    print("2")
    print("3")

dis.dis(f)

输出

  2           0 LOAD_CONST               1 ('1')
              3 PRINT_ITEM          
              4 PRINT_NEWLINE       

  3           5 LOAD_CONST               2 ('2')
              8 PRINT_ITEM          
              9 PRINT_NEWLINE       

  4          10 LOAD_CONST               3 ('3')
             13 PRINT_ITEM          
             14 PRINT_NEWLINE       
             15 LOAD_CONST               0 (None)
             18 RETURN_VALUE