当人们说CPython是用C语言编写的时,这意味着什么?

4
据我所知,CPython程序被编译成中间字节码,由虚拟机执行。那么,如果没有预先知道CPython是用C语言编写的,如何识别它呢?两者之间是否存在某些共同的DNA可以匹配以识别它们?

2
我认为这是一个真诚的,虽然有些困惑的问题。如果你想要点踩,那就点吧,但我认为它不应该被关闭。 - Joe
2
考虑到一本关于如何阅读(即“解释”)英文文本的书可以用不同于英语的语言,比如法语来写。同样地,Python解释器,它知道如何解释Python语言中的文本,是用另一种语言C编写的。就像你可以有多本(用不同语言写的!)关于如何阅读英语的书一样,你也可以有能够解释用不同语言编写的Python程序的程序。C、Pascal - 甚至是Python本身。 - Frerich Raabe
你之前不知道Python是用C语言编写的。但是Python是开源的,所以你可以下载它,查看它,并发现它是用C语言编写的。 - nos
2
@Joe 我认为这是离题了,因为它表明 OP 缺乏所问问题的必要最基本的理解 - 在这种情况下,关于编程语言和程序执行的基础知识,例如编译语言和解释语言之间的区别。我不认为任何答案能够合理地消除他对此的困惑,可能需要一本入门书或编程课程。因此,无论问题是否真实,我认为其范围不适合本站点... - l4mpi
我认为知识是一个连续体,没有特定的截止点。我喜欢尝试在这个范围内帮助人们。这是一个困惑的问题,但有一个简单、正确的答案。我不认为有什么问题。 - Joe
3个回答

19

解释器是用C语言编写的。

它将Python代码编译成字节码,然后通过评估循环来解释该字节码以运行您的代码。

您可以通过查看其源代码来确定Python是用什么语言编写的。例如,请参阅评估循环源代码

请注意,Python.org实现只是Python实现之一。我们称其为CPython,因为它是用C实现的。还有其他实现,使用其他语言编写。Jython是用Java编写的,IronPython是用C#编写的,然后还有PyPy,它是用Python(子集)编写的,并且比CPython运行许多任务更快


1
@AnishShah:不要混淆语言解释器的实现和语言本身。如果一个C编译器是用Fortran编写的,这是否意味着你可以在你的C代码中使用Fortran?当然不行! - Martijn Pieters
1
@AnishShah:你可以使用C扩展来扩展CPython,参见C API文档。你也可以使用ctypes模块访问DLL或共享对象库,从而访问许多常见的C实现库。 - Martijn Pieters
你能否发布一些文章链接,让我更好地了解语言解释器的实现? - Anish Shah
4
您的浏览器是用C语言编写的。一个"C命令"能在其中运行吗? - Elazar
不是的,这正是我问问题并接受了用户回答的原因。 - Anish Shah
显示剩余3条评论

13

Python并不是用C编写的。可以说,Python是使用BNF编写的奇特英语方言。

然而,以下所有陈述都是正确的:

  1. Python是一种语言,包括语言规范和一堆标准模块
  2. Python源代码被编译为字节码表示
  3. 理论上,这个字节码可以直接由一个经过适当设计的处理器执行,但我不知道是否真的存在这样的处理器
  4. 在没有本地理解字节码的处理器的情况下,必须使用一些其他程序将字节码转换为硬件处理器可以理解的东西
  5. 这个运行时设施的一个真实实现是CPython
  6. CPython本身是用C编写的,但是...
    1. C是一种语言,包括语言规范和一堆标准库
    2. C源代码被编译成某个字节码格式(通常是平台特定的东西)
    3. 这种平台特定格式通常是某个处理器的本机指令集(在这种情况下,它可能被称为“目标代码”或“机器代码”)
    4. 这种本机字节码不保留任何神奇的C特性:它只是指令。处理器执行这些字节码时,编译语言并不重要。
    5. 因此,翻译Python字节码的CPython可执行文件是一系列指令,直接在处理器上执行。
    6. 因此,您有:Python字节码被机器代码解释,再由硬件处理器解释。
  7. Jython是相同的Python运行时设施的另一个实现
  8. Jython是用Java编写的,但是...
    1. Java是一种语言,包括规范、标准库等等
    2. Java源代码被编译成不同的字节码
    3. Java字节码也可以在适当的硬件上执行,或者通过某个运行时设施执行
    4. 提供此功能的Java运行时环境可能也是用C编写的
    5. 因此,您有:Python字节码被Java字节码解释,再由机器代码解释,最终由硬件处理器解释。

您可以无限地添加更多的层次:考虑到您的“硬件处理器”实际上可能是软件仿真,或者硬件处理器可能具有将其“本地”指令集解码为另一种内部字节码的前端。

所有这些层次都是通过它们所执行的操作(根据某些规范执行或解释指令)来定义的,而不是它们的实现方式。

哦,我跳过了编译步骤。 C编译器通常是用C编写的(使任何语言达到能够自我编译的阶段通常很重要),但它也可以用Python或Java编写。同样,编译器的定义是通过它的功能(根据语言规范将某些源语言转换为某些输出,例如字节码),而不是它的实现方式。


谢谢!这对于理解高级语言的工作方式有很大帮助 :) - Anish Shah

2

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接