首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Python是被解释或编译的,还是两者兼而有之?

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

Stack Overflow用户
提问于 2011-07-31 13:31:51
回答 14查看 233.7K关注 0票数 258

据我理解:

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

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

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

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

EN

回答 14

Stack Overflow用户

回答已采纳

发布于 2011-07-31 13:43:23

首先,解释/编译不是语言的属性,而是实现的属性。对于大多数语言来说,大多数(如果不是全部的话)实现都属于一个类别,所以我们可能会节省几个单词,说明语言是被解释/编译的,但它仍然是一个重要的区别,这一方面是因为它有助于理解,另一方面是因为有相当多的语言具有两种可用的实现(主要是函数语言领域的语言,参见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)。这是一种简化,实际上它的可读性更低一些--你可以用标准库模块进行实验,看看真正的交易是什么样子。解释这个比从更高层次的表示法解释要快。

该字节码要么被解释(请注意,在理论和实际性能上,直接解释和第一次编译到某种中间表示并对其进行解释是有区别的),比如引用实现(CPython),或者在运行时解释和编译到优化的机器代码,比如PyPy

票数 317
EN

Stack Overflow用户

发布于 2011-07-31 13:40:52

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

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

票数 58
EN

Stack Overflow用户

发布于 2016-09-06 18:10:20

答案取决于所使用的python的实现。如果您使用的是CPython ( python的标准实现)或Jython (用于与java编程语言集成),则首先将其转换为字节码,并根据您使用的python的实现,将此字节码定向到相应的虚拟机以进行解释。 (Python )用于CPython,( Jython )用于Jython。

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

票数 43
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/6889747

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档