Python运行时实际上是如何工作的?


26

我在理解a的概念时遇到了一些问题runtime library,尤其是Python 的概念。所以我写了一些hello world python程序,打算执行它,所以我写了python ./hello_world.py

在我按下Enter键和在CPU上执行python代码所生成的机器代码之间,要执行什么步骤?以及这与Python运行时系统和/或库有什么关系?


这两个线程对Python运行时提供了很好的见解-Python 是解释的还是编译的,或两者兼而有之?是否解释了Python(例如Javascript或PHP)?。运行时和运行时库是不一样的。将其映射到我所知道的.NET世界-公共语言运行库(CLR)和框架/基类库(FCL / BCL)不同的。
RBT

Answers:


33

对于各种各样的东西,所有严肃的现代编程语言都有一些共同的概念。其中两个是上述问题的答案的核心。

在我按下Enter键和在CPU上执行python代码所生成的机器代码之间,要执行什么步骤?

代码被解析,分析,并输入到解释器中。这都是关于计算机科学的一个非常重要的领域,即编译器理论。编译器是一种将代码从一种语言(您的源代码)翻译成另一种语言(通常是机器代码,尽管确实存在从一种高级语言翻译成另一种语言的“编译器”)的程序。这是一个非常庞大的主题,您可能需要花费数年的时间进行研究,但这是基本版本:

编译器以解析器开始,解析器是一个例程,该例程读取您的源代码,并将该语言的语法规则应用于该语法,以确定其是否对有效的Python(就您而言)代码有意义。如果不是,则解析器将抛出错误,编译器将退出紧急状态,但如果确实失败,则解析器将输出所谓的抽象语法树,简称AST。AST是一种树数据结构,其节点每个都包含语法元素。例如,如果你说x = 5,你可以用最终BinaryExpression与节点operator的价值=,一个Left价值ReferenceExpression(x)Right价值IntegerLiteralExpression(5)。您的整个程序可以由像这样的一棵大树表示。

解析器生成AST之后,第二阶段就是语义分析。用简单的英语来说,这意味着“弄清楚此AST的含义”。它会检查AST以确定您是否做了非法的操作,即使它是有效的解析(例如,尝试使用3个参数调用1参数的函数),如果这样做,则会引发错误。否则,它将分析AST并对其进行编辑,以使机器更易于理解。

第三阶段是代码生成。全面分析,简化且有效的AST之后,您可以将其输入到生成器中,生成器将遍历AST并以输出语言生成代码。这是您的成品。

在Python中,它使用解释器而不是编译器。解释器的工作方式与编译器完全相同,但有一个区别:解释器代替代码生成,而是将输出加载到内存中并直接在系统上执行。(如何发生这种情况的确切细节在不同的语言和不同的解释器之间可能会有很大差异。)

以及这与Python运行时系统和/或库有什么关系?

除了最简单的语言外,所有语言都带有一组预定义的功能,这些功能对很大一部分用户来说很重要,并且由于某种原因或其他原因,用户很难自行实现。他们的代码可以调用这些函数,而无需任何第三方库。(例如,在Python中,您有print,它将输出发送到stdout。祝您好运,自己实现!)这组函数通常收集在一个共享库中,代码可以在运行时调用此库,这就是众所周知的原因作为语言运行库,或者简称为“运行库”。


因此,我的代码被馈送到另一个程序(Python运行时系统),该程序完成所有工作并在我的代码结束时(当然,在清除之后)完成?
hgiesel

@hgiesel我相信在Python的情况下,解释器是运行时的一部分。并非每种语言都如此。当然,但这在解释语言中相当普遍。
梅森惠勒

5

标准的Python实现是字节码虚拟机。这意味着机器代码(来自处理器操作码集中的操作码)不是从程序中生成的。仅当VM解释字节码时,才从已编译到虚拟机中的操作码中选择操作码。

首先,如何将程序转换为字节码是一个稍有不同的问题,但简短的答案是“通过编译,就像其他任何向下语言的翻译一样”。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.