楔
有两种运行Python的方法,一种是将Python输入命令行中的交互式环境。另一个是在python xxx.py.中运行脚本文件。尽管该方法是不同的,但输入相同的处理逻辑的最终目标是相同的。
初始化Python后,Pymain_run_file将在py_initialize初始化后执行。
我们在交互式和执行PY脚本时看到了两个不同的功能,但不用担心。最后,您会看到他们必须在一起很长时间并在一起。
互动环境
看看交互式操作的情况,但在此之前先看一下提示。
每次我们进入一行时,开始>>>这是sys.ps1;在输入句子块中,当未输入输入时,它显示了...这是SYS.PS2。它们都支持修改。如果修改了,我们会自己定义它。
交互式环境执行pyrun_interactiveloopflags函数。
在run_mod之前,Python将删除主体中维护的PydictObject对象,并将其作为参数传递给RUN_MOD函数。这种参数关系非常重要。实际上,当虚拟机启动时,代码中的参数D将执行。空格和全局空间。
脚本文件运行方法
然后脚本文件正在运行。
显然,脚本文件和交互之间的执行过程是不同的,但是最后,它们输入了run_mod,并且在主机中维护的pydictObject对象被用作本地名称空间和run_mod中的局部名称空间和全局名称空间。
启动虚拟机
准备工作是准备工作,这是虚拟机真正开始开始的虚拟机。
run_mod接管了来自的AST,然后传递到Pyast_compileObject以创建我们已经非常熟悉的PyCodeObject对象。
关于这个完整的汇编过程,另一个主题是另一个主题。简而言之,扫描仪进行短语分析,将源代码逐一切成令牌,然后解析器对词汇分析的结果进行语法分析。Token生成抽象的语法树(Astract语法树),然后编译AST AST AST编译PyCodeObject对象,最后执行虚拟机。
这是整个过程。至于如何划分单词以及如何建立语法树,这涉及汇编原则。就个人而言,研究Python虚拟机更加困难。如果您有兴趣,可以转到源代码中的解析器目录。如果您可以理解Python的单词和语法树的建立,那么我认为您可以将正则表达式和各种模板语言的正则表达方式交给。
目前,Python做得很好,因此他开始通过RUN_EVAL_CODE_OBJ唤醒虚拟机。
pyeval_evalcode在函数中调用。根据上一个简介,我们知道我们最终将访问pyeval_evalframeex.finally,致电_PYEVAL_EVALFRAMEDEFAULT,然后输入for for Giant Switch for Loop,不断执行字节代码指令,堆栈是参数所在的位置。
因此,整个过程是首先创建一个过程,该过程创建一个线程,设置内置(包括设置__NAME__,构建-in对象,构建 - 函数方法等),设置高速缓存池,然后初始化各种初始化,设置搜索路径。最终的分割,编译和活动虚拟机执行。
执行方法是调用曾经与我们相处的pyeval_evalframeex,并控制python world中无数对象的灭绝。参数f是pyframeObject对象。我们曾经探索很长时间。现在,我们突然回到开头,有一种梦想回到框架对象的感觉。
目前,我们已经看到了Python的骨骼。尽管幕后仍然有很多细节,但至少神秘的面纱已被删除。
概括
当我们进入控制台Python的那一刻,我们确实在其背后做了很多工作。因为Python是一种动态的语言,因此在运行时进行了许多操作。
运行时环境的初始化和虚拟机的开始就是这种情况。接下来,我们将介绍Python的多线程和Gil,被称为所有弊端的来源。
以上是该共享的所有内容。如果您想了解更多信息,请转到公共帐户:Python编程学习圈,每日干货共享
原始:https://juejin.cn/post/7095936851373981709