首先,解释/编译不是语言的属性,而是实现的属性。对于大多数语言,大多数(如果不是全部)实现都归为一类,因此可以省去几个词来说明该语言也经过解释/编译,但这仍然是一个重要的区别,这既因为它有助于理解,又因为有相当多种语言具有两种可用的实现(主要在功能语言领域,请参见Haskell和ML)。另外,有些C解释器和项目试图将Python的子集编译为C或C
++代码(然后编译为机器代码)。
其次,编译不限于提前编译为本机代码。更一般而言,编译器是一种将一种编程语言的程序转换为另一种编程语言的程序的程序(可以说,如果应用了重要的转换,甚至可以使编译器使用相同的输入和输出语言)。而且,JIT编译器可以
在运行时 编译为本地机器代码,其速度可以非常接近甚至优于提前编译(取决于基准和所比较实现的质量)。
但是,为了避免挑剔并回答您要问的问题:实际上(阅读:使用一种流行且成熟的实现),Python被 编译了
。不会提前编译为机器代码(即受限制和错误的“编译”,但是很常见的定义),“仅”编译为字节码,但是它仍然具有至少一些优点。例如,该语句
a= b.c()被编译为字节流,当“反汇编”时,它看起来像
load 0 (b); load_str 'c'; get_attr;call_function 0; store 1 (a)。这是一个简化,实际上它的可读性较低,而底层则更高级-
您可以尝试使用标准库
dis模块,看看真正的交易是什么样子。
就像参考实现(CPython)一样,该字节码也可以被解释(请注意,直接解释和首先编译为某种中间表示并进行解释之间,在理论上和实际性能上都有区别),或者在解释和编译为与PyPy一样,在运行时优化了机器代码。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)