4

据我所知,CPython 程序被编译成中间字节码,由虚拟机执行。那么如何在事先不知道 CPython 是用 C 语言编写的情况下进行识别。两者是否有一些共同的 DNA 可以匹配来识别呢?

4

3 回答 3

18

解释器是用 C 编写的。

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

您可以通过查看 Python 的源代码来识别它是用什么编写的。例如,请参阅评估循环的源代码

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

于 2013-07-01T09:09:34.523 回答
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 编写。同样,编译器是由它所做的定义(根据语言规范将一些源语言转换为一些输出,例如字节码),而不是它是如何实现的。

于 2013-07-01T09:58:36.477 回答
2

我在这里很好地理解了我最初的疑问:http: //amitsaha.github.io/site/notes/articles/c_python_compiler_interpreter.html

于 2013-07-01T10:30:39.150 回答