为什么 Python 编译器在 exit() 后不忽略语法错误?



如果运行Python代码,然后调用exit(),它将退出程序,并且以下代码将不会运行。但我在程序中添加了exit(),在出现语法错误后,程序崩溃了。我想知道为什么Python编译器在运行之前没有优化我的代码。我尝试过这个问题,但它忽略了它们,比如index out of range等等。那么,为什么下面的代码不起作用,而SyntaxError发生了呢?

print("Hi")
exit()
if 

它不能精确地编译您的程序,因为它是一个编译器(稍后将解释为字节码(。当它看到exit()时,它不会停止解析,这与shell一次读取和解释一行shell脚本不同。(这不是"优化",BTW(。

Python将其编译为字节码,如果达到程序中的该点,则字节码将调用exit。即使是无法访问的代码也必须在语法上有效,这样整个文件才能编译。但由于它从未实际执行过,因此不会导致任何运行时错误。

这不是一个任意的过程。C编译器工作得更聪明,C编译器如何检测它?

例如,如果使用C运行while 1程序,则由于逻辑原因,该程序不会运行。但是python为什么不做同样的事情呢?

这不是真的

C编译器会因无法访问的块(如int foo(){ if(0) if if; }(中的语法错误而阻塞。此外,while 1不是有效的C语法。

https://godbolt.org/z/cP83Y866b.只有#if 0预处理器的内容或注释可以向编译器隐藏内容,因此它不必是有效的语法和语法。

语法和语法需要在整个文件中有效,才能解析为编译器可以编译的内容

在C和C++中,不可访问的代码(未注释掉(甚至必须在类型匹配方面有效,例如,如果TintT x = y;不会编译,但y的类型是char*。这在语法上是有效的,但";形成不良";。Per-cppreference:在模板外,将完全检查丢弃的语句。if constexpr不能替代#if预处理指令

但在模板中,它可以隐藏一些东西。https://godbolt.org/z/frTcbMb3T

template <typename T>  // being a template function makes if constexpr special
void foo(int x) {
if constexpr (false) {
int x = "hi";    // ill-formed, type mismatch.  But still valid *syntax*
}
#if 1           // 0 would truly ignore all text until the closing #endif
if constexpr (false) {
//      int x = = 2;  // syntax error if uncommented
}
#endif
}

最新更新