根据我的理解:
解释型语言是一种高级语言,由解释器(将高级语言转换为机器代码并执行的程序)运行并执行;它每次处理一点点程序。
编译语言是一种高级语言,其代码首先由编译器(将高级语言转换为机器代码的程序)转换为机器代码,然后由执行器(另一个运行代码的程序)执行。
如果我的定义错了,请指正。
现在回到Python,我对此有点困惑。你知道Python是一种解释性语言,但它被解释为一些中间代码(如字节码或IL),而不是机器代码。那么,哪个程序执行IM代码呢?请帮助我了解Python脚本是如何处理和运行的。
Python(解释器)被编译。
证明:它甚至不会编译你的代码,如果它包含语法错误。
示例1:
print("This should print")
a = 9/0
输出:
This should print
Traceback (most recent call last):
File "p.py", line 2, in <module>
a = 9/0
ZeroDivisionError: integer division or modulo by zero
代码编译成功。第一行执行(打印),第二行抛出ZeroDivisionError(运行时错误)。
示例2:
print("This should not print")
/0
输出:
File "p.py", line 2
/0
^
SyntaxError: invalid syntax
结论:如果代码文件包含SyntaxError,编译失败时什么都不会执行。
这真的取决于所使用的语言的实现!不过,在任何实现中都有一个常见的步骤:您的代码首先被编译(翻译)为中间代码——介于您的代码和机器(二进制)代码之间的东西——称为字节码(存储在.pyc文件中)。注意,这是一个一次性步骤,除非修改代码,否则不会重复。
这个字节码在每次运行程序时都会被执行。怎么做?当我们运行程序时,这个字节码(在.pyc文件中)作为输入传递给虚拟机(VM)1——允许我们的程序被执行的运行时引擎——由虚拟机执行。
根据语言实现,VM将解释字节码(在CPython2实现的情况下)或JIT-compile3字节码(在PyPy4实现的情况下)。
注:
计算机系统的模拟
2字节码解释器;该语言的参考实现,用C和Python编写,使用最广泛
在程序执行期间(在运行时)进行的3个编译
4字节码JIT编译器;CPython的替代实现,用RPython (Restricted Python)编写——通常比CPython运行得更快