Python是解释的还是编译的,还是两者都有?

2024-03-29 07:33:45 发布

您现在位置:Python中文网/ 问答频道 /正文

据我了解:

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

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

如果我的定义错误,请纠正我

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


Tags: 代码程序脚本机器语言字节编译器定义
3条回答

CPU实际上只能理解机器代码。对于解释程序,解释器的最终目标是将程序代码“解释”为机器代码。然而,现代解释语言通常不会直接解释人类代码,因为它效率太低

Python解释器首先读取人类代码并将其优化为一些中间代码,然后再将其解释为机器代码。这就是为什么你总是需要另一个程序来运行Python脚本,不像C++中的那样,你可以直接运行编译后的代码。例如,c:\Python27\python.exe/usr/bin/python

答案取决于所使用的python实现。如果您使用的是CPython(python的标准实现)或Jython(旨在与java编程语言集成),则首先将其翻译为字节码,具体取决于您使用的python实现,此字节码被定向到相应的虚拟机进行解释PVM(Python虚拟机)用于CPython,JVM(Java虚拟机)用于Jython

但是假设您使用的是另一个标准的CPython实现。它将使用一个即时编译器

首先,解释/编译不是语言的属性,而是实现的属性。对于大多数语言来说,大多数(如果不是所有的话)实现都属于一个类别,因此可以省去几个词,说该语言也被解释/编译了,但这仍然是一个重要的区别,因为它有助于理解,而且有相当多的语言具有这两种类型的可用实现(主要是在函数语言领域中,参见Haskell和ML)。此外,还有C编译器和项目试图将Python的子集编译成C或C++代码(随后是机器代码)。

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

但是,为了停止挑剔并回答您想要问的问题:实际上(阅读:使用一个比较流行和成熟的实现),Python是编译的。没有提前编译成机器代码(即,根据受限和错误的,但很遗憾的是,常见的定义是“编译”),“仅”编译成bytecode,但它仍然是编译,至少有一些好处。例如,语句a = b.c()被编译成一个字节流,当“反汇编”时,它看起来有点像load 0 (b); load_str 'c'; get_attr; call_function 0; store 1 (a)。这是一种简化,实际上可读性较低,层次较低-您可以使用标准库^{} module看看真正的交易是什么样子的。解释这件事比从更高层次的代表那里解释要快

该字节码要么被解释(请注意,直接解释,要么首先编译为某种中间表示形式,然后再进行解释,两者在理论和实际性能上都有区别),就像参考实现(CPython)一样,或在运行时解释并编译为优化的机器代码,如PyPy

相关问题 更多 >