python解释器究竟实现了什么?

时间:2014-02-12 02:55:50

标签: java python c

我是编程的初学者,并试图从“学习Python由Mark Lutz”学习Python。在“Python解释器介绍”一章中,作者陈述了以下内容:

  

根据您运行的Python的风格,解释器本身可以实现为C程序,一组Java类或其他东西。

我无法理解如何区分Python代码以便在解释器中进行分区(C程序或Java类,如作者所述)。

3 个答案:

答案 0 :(得分:7)

一段Python代码,只是Python代码。作者所说的是有不同的Python解释器 - 所有这些解释器都运行Python代码。这些不同的Python解释器可以是用CJavaC#Python本身编写的程序。它们是在命令行键入python时运行的程序,或从应用程序菜单中选择python。通常它将是CPython:由Python软件基金会制作的语言的参考实现,它是用C语言编写的。

总而言之,这对于学习Python来说绝对不是必需的 - 只需跳过一下,一旦你对语言更熟悉就回到这个问题。

答案 1 :(得分:2)

Python的参考解释器,其他人用作指南,用C语言编写,它的昵称是CPython(不要与Cython混淆,后者不是解释器)。它将Python代码编译为Python字节码并在其虚拟机上运行,​​该虚拟机也用C语言编写。

还有其他口译员。以下是一些最知名的。

  • Jython,用Java编写,将Python编译为Java字节码,并在Java虚拟机上运行。它允许Python代码调用Java代码。不知。
  • IronPython,用C#编写(其中一些显然是由Python编写的),它将Python编译为Microsoft的CLI(如果我错了,请纠正我)字节码,并在相应的虚拟机上运行它。 / LI>
  • PyPy,用RPython(Python的一个更严格的分支)编写,它将Python编译为PyPy字节码(大部分与CPython字节码相同)并在其虚拟机上运行。更多信息:http://doc.pypy.org/en/latest/interpreter.html

理论上和理想情况下,所有严格合法的Python代码都应该在其中任何一个上运行相同。可以把它想象成C的不同编译器:严格合法的C代码将编译到任何编译器上的等效程序

  • 一个编译器允许一些非标准的东西,但不允许另一个(Visual Studio中的void main()是非标准的)。
  • Linux的编译器无法访问windows.h库(就像CPython无法访问Java库一样)。
  • 他们将针对不同的任务使用不同的速度/内存性能。

答案 2 :(得分:1)

听起来你的真正问题是Python解释器如何做它的功能。这是整个大学课程的主题,但这是推动力。

解释器使用称为解析器的专用函数读取Python源代码。这是一个输入处理器,它以上下文无关语法的形式理解Python语言的确切结构。

解析过程检查输入是否符合Python语法规则(这里是语法错误的起源)并生成一个数据结构,该结构以简单数组中表示的非常简单的步骤的形式提炼了Python程序的原始含义字节称为字节码。

输入,解析和字节码生成的完整过程称为编译。是的,从本质上讲,Python有一种简单的编译器。

字节代码基于测试结果,字符串操作,从函数调用和返回,输入,输出以及Python程序执行的所有数百个基本操作,执行非常基本的操作,如算术,测试和跳转到其他字节代码位置,当合并并快速执行时,使程序看起来很强大。

在原始Python源与人类语言相当接近的情况下(好吧,有点......),字节代码与机器语言相当接近:处理器理解为指令的1和0的模式。字节代码是程序运行时写入.pyc文件的代码。

它只需要一个非常小而简单的程序(希望是一个快速的程序)称为字节码解释器(是Python解释器中的解释器)来处理字节代码,以使处理器完成原始工作意图使用Python程序。

当然,如果.pyc文件已经存在并且比相应的源代码更新,则可以跳过编译。

你有它......用几句话写一个大学课程。我已经跳过了大量的细节,并且(一个警告)我写的一些内容仅适用于那里的许多Python实现,但它是理解的开始。

你的书的作者说上面所有的实现语言可能是C或Java(Python的Jython实现)。他遗漏了只有最小的Python核心是用C或Java实现的。剩下的就是Python本身。

如果您有兴趣了解更多,有一些相当不错的,低成本和免费的来源。请参阅示例this article以及没有太多资金尝试Scheme 9 From Empty Space,了解如何实现除Python之外的其他语言的解释器。