python - Python 是解释的,还是编译的,或者两者兼而有之?

据我了解:

解释型语言是一种高级语言,由解释器(将高级语言转换为机器代码然后执行的程序)在运行中运行和执行;它一次处理一点程序。

已编译语言是一种高级语言,其代码首先由编译器(将高级语言转换为机器码的程序)转换为机器代码,然后由executor(另一个运行代码的程序)。

如果我的定义有误,请纠正我。

现在回到 Python,我对此感到有些困惑。在任何地方,您都知道 Python 是一种解释型语言,但它被解释为一些中间代码(如字节码或 IL),而 不是 为机器代码。那么哪个程序会执行 IM 代码呢?请帮助我了解如何处理和运行 Python 脚本。

最佳答案

首先,解释/编译不是语言的属性,而是实现的属性。对于大多数语言,如果不是所有的实现都属于一个类别,那么大多数语言的实现都属于一个类别,因此可能会省下几句话来说明该语言也是解释/编译的,但这仍然是一个重要的区别,既因为它有助于理解,又因为有相当多的语言具有两种可用的实现(主要在函数式语言领域,请参阅 Haskell 和 ML)。此外,还有一些 C 解释器和项目试图将 Python 的子集编译为 C 或 C++ 代码(随后编译为机器代码)。

其次,编译不限于提前编译为 native 代码。更一般地说,编译器是将一种编程语言的程序转换为另一种编程语言的程序的程序(可以说,如果应用了重要的转换,您甚至可以拥有具有相同输入和输出语言的编译器)。 JIT 编译器在运行时编译为 native 机器代码,这可以提供非常接近甚至优于提前编译的速度(取决于基准和比较的实现质量)。

但要停止吹毛求疵并回答您要问的问题:实际上(阅读:使用某种流行且成熟的实现),Python 是编译的。未提前编译为机器码(即“编译”受限制和错误,但可惜通用定义),“仅”编译为 bytecode ,但它仍然是具有至少一些好处的编译。例如,语句 a = b.c() 被编译为字节流,当“反汇编”时,它看起来有点像 load 0 (b); load_str 'c';获取属性;调用函数 0;存储 1 (a)。这是一种简化,实际上它的可读性更低而且更底层——你可以尝试使用标准库 dis module看看真正的交易是什么样的。解释这一点比从更高级别的表示中解释要快。

该字节码要么被解释(请注意,在理论和实际性能上,直接解释和首先编译为某种中间表示并解释它之间存在差异),就像引用实现 (CPython) 一样,或者两者都被解释并在运行时编译为优化的机器代码,如 PyPy .

https://stackoverflow.com/questions/6889747/

相关文章:

python - 错误 "Microsoft Visual C++ 14.0 is required

linux - ssh:无法解析主机名 [主机名]:提供节点名或服务名,或未知

c - 将简单的套接字变成 SSL 套接字

linux - 如何测量进程的单独 CPU 核心使用率?

python - 将 Pandas 列转换为 DateTime

linux - 防止 strace 缩写参数?

python - Python 字典是哈希表的一个例子吗?

python - TransactionManagementError "You can' t 在使

python - NumPy 2d 数组的切片,或者如何从 nxn 数组 (n>m) 中提取 mxm

linux - 我们什么时候应该使用互斥锁,什么时候应该使用信号量