作者:IMIser链接:https://www.zhihu.com/question/20005950/answer/1555522938来源:知乎著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
CPython之于Python的作用被误传的太多了,准确的表述为CPython(使用C语言)是Python的一种实现(implementation), 不是解释器 (interpreter)。
其余的实现还有PyPy(使用Python)、Jython(使用Java);
几个概念必须要澄清:
- 实现:来确保语言执行的全流程,包含编译与解释运行,当然具体要不要编译、怎么执行就是各个实现自己的事情。
- 编译(Compile): 将一种代码转换(transform)为另一种代码的过程。不是只有转为机器码才称为编译,你自定义一种编译器把Python转为Python也叫编译。
- 解释执行(Interpreter): 由类似虚拟机的运行时负责执行代码,当然了前提是解释能懂的代码,比如JVM和PVM(CPython使用)能看懂的 字节码(byte code). 与编译执行的区别在 每次解释执行前需要重新读取字节码,以适应动态语言的变化。
- 编译执行:区别于解释执行,编译执行把代码先编译为CPU可以直接运行的代码执行。
好了,根据上述定义,首先来个判断题: “Python是一门解释性的语言,没有编译过程。”
首先需要指明哪种Python的实现,因为不同实现的过程是不一样的,拿CPython距离,他是有编译流程的,CPython会将Python代码先编译为字节码,然后由其运行时解释执行。
所以Python的准确表述为“动态语言”,当然说其为解释性语言也可,因为针对标准实现CPython来讲,他是解释执行的,但不能一定确定Python没有进行编译。
好了,到这里还有其他若干问题,如Python标准库是何种语言,如何跨平台,如何使用各种系统调用。此类种种还是和各种 实现 有关,不同的实现有不同的方式。
关于CPython底层是如何运行Python的,这里有一个很好的介绍性文章:
what is cpython)
作者:Manjaro Linux链接:https://www.zhihu.com/question/20005950/answer/1681696051来源:知乎著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
CPython的github网站github.com
CPython是用C语言实现的跨平台Python解释器。开发者是Python Software Foundation,也就是Python官方,所以它是最广泛使用的Python解释器。CPython是使用字节码的解释器,任何程序源代码在执行之前先要编译成字节码。它还有和几种其它语言(包括C语言)交互的外部函数接口。CPython的全局解释器锁(Global Interpreter Lock,GIL),它使得CPython不能进行并发编程。要做到并发编程,就必须为每一个线程运行一个解释器。如果这样的话,它们之间的通讯就非常困难。
PyPy的gitlab地址foss.heptapod.netPyPy与CPython的不同doc.pypy.org
PyPy是用RPython实现的Python解释器。PyPy是Python开发者为了更好地Hack Python创建的项目。此外,PyPy比CPython更灵活,易于使用和试验,以制定具体的功能在不同情况的实现方法,可以很容易实施。PyPy的目标是,让PyPy比C语言实现的CPython更为容易地适应各个项目和方便裁剪。但是Pypy无法支持官方的C/Python API,导致无法使用例如Numpy,Scipy等重要的第三方库。
两者直接的联系显而易见:都是Python解释器。
两者直接的不同可以参考官方文档,绝对权威。网站如下:
除了PyPy和CPyhton还有下面这几个大兄弟
- MicroPython和CircuitPython,是为微控制器而优化的Python 3变体。
- Stackless Python, 是实现微线程的CPython的重要分叉;它不使用C内存堆栈,因而允许大规模并发程序。PyPy也有无堆栈版本
- Jython,Java实现的Python。Jython可以直接调用Java的各种函数库。
- IronPython,面向.NET和ECMA CLI的Python实现。IronPython能够直接调用.net平台的各种函数库。可以将Python程序编译成.net程序。
至于Python底层是什么语言实现的,如下
- CPython,Python的官方版本,使用C语言实现。
- JPyhton,Python的Java实现。
- IronPython,Python的C#实现,IronPython
- PyPy:Python实现的Python。(Python:我自己实现我自己……)