千家信息网

如何理解Python虚拟机中的Python运行环境

发表于:2026-11-03 作者:千家信息网编辑
千家信息网最后更新 2026年11月03日,今天就跟大家聊聊有关如何理解Python虚拟机中的Python运行环境,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。其实Python运行环境是
千家信息网最后更新 2026年11月03日如何理解Python虚拟机中的Python运行环境

今天就跟大家聊聊有关如何理解Python虚拟机中的Python运行环境,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。

其实Python运行环境是一个全局性的概念,而执行环境实际就是一个栈帧,是Code Block对应的概念,两者之间存在着本质上的区别,在以后的运行操作过程中就可以了解到他们呢两者之间的不同。

运行时环境的初始化过程非常地复杂,后面将用单独的一章来剖析,这里假设初始化的动作已经完成,我们已经站在了Python虚拟机的门槛外,只需要轻轻推动一下***张骨牌,整个执行过程就像多米诺骨牌一样,一环扣一环地展开。

这个推动***张骨牌的地方在一个名叫PyEval_EvalFramEx的函数中,这个函数实际上就是Python的虚拟机的具体实现,它是一个非常巨大的函数,因此我们在列出其中的源代码时和以前有些不同。

PyEval_EvalFrameEx首先会初始化一些变量,其中PyFrameObject对象中的PyCodeObject对象包含的重要信息都被照顾到了。当然,另一个重要的动作就是初始化了堆栈的栈顶指针,使其指向f->f_stacktop:

[PyEval_EvalFrameEx in ceval.c]           co = f->f_code;       names = co->co_names;       coconsts = co->co_consts;       ffastlocals = f->f_localsplus;       ffreevars = f->f_localsplus + co->co_nlocals;       first_instr = (unsigned char*)PyString_AS_STRING(co->co_code);       next_instr = first_instr + f->f_lasti + 1;       stack_pointer = f->f_stacktop;       f->f_stacktop = NULL;   /* remains NULL unless yield suspends frame */

前面我们说过,在PyCodeObject对象的co_code域中保存着字节码指令和字节码指令的参数,Python虚拟机执行字节码指令序列的过程就是从头到尾遍历整个co_code、依次执行字节码指令的过程。

在Python运行环境的虚拟机中,利用3个变量来完成整个遍历过程。co_code实际上是一个PyStringObject对象,而其中的字符数组才是真正有意义的东西。这也就是说,整个字节码指令序列实际上就是一个在C中普普通通的字符数组。因此,遍历过程中所使用的这3个变量都是char*类型的变量:first_instr永远指向字节码指令序列的开始位置;

next_instr永远指向下一条待执行的字节码指令的位置;f_lasti指向上一条已经执行过的字节码指令的位置。展示了这3个变量在遍历中某时刻的情形:

[ceval.c]   /* Interpreter main loop */   PyObject* PyEval_EvalFrameEx(PyFrameObject *f, int throwflag)   {       ……       why = WHY_NOT;       ……       for (;;) {       ……       fast_next_opcode:           f->f_lasti = INSTR_OFFSET();           //获得字节码指令           opcode = NEXTOP();           oparg = 0;           //如果指令需要参数,获得指令参数           if (HAS_ARG(opcode))               oparg = NEXTARG();      dispatch_opcode:           switch (opcode) {           case NOP:               goto fast_next_opcode;           case LOAD_FAST:               ……           }   }

那么这个一步一步的动作是如何完成的呢,我们来看一看Python运行环境执行字节码指令的整体架构,其实就是一个for循环加上一个巨大的switch/case结构,熟悉Windows SDK编程的朋友可以想象一下Windows下那个巨大的消息循环,就是那样的结构。在对PyCodeObject对象的分析中我们说过,Python的字节码有的是带参数的,有的是没有参数的,而判断是否带参字节码是通过HAS_ARG这个宏实现的。

注意,对不同的字节码指令,由于存在是否需要指令参数的区别,所以next_instr的位移可能是不同的。但是无论如何,next_instr总是指向Python下一条要执行的字节码,这很像x86平台上的那个PC寄存器。

Python在获得了一条字节码指令和其需要的指令参数后,会对字节码指令利用switch进行判断,根据判断的结果选择不同的case语句,每一条字节码指令都会对应一个case语句。在case语句中,就是Python对字节码指令的实现。

在成功执行完一条字节码指令后,Python运行环境的执行流程会跳转到fast_next_opcode处,或者是for循环处,不管如何,Python接下来的动作都是获得下一条字节码指令和指令参数,完成对下一条指令的执行。如此一条一条地遍历co_code中包含的所有字节码指令,最终完成了对Python程序的执行。

看完上述内容,你们对如何理解Python虚拟机中的Python运行环境有进一步的了解吗?如果还想了解更多知识或者相关内容,请关注行业资讯频道,感谢大家的支持。

指令 字节 环境 运行 参数 就是 过程 不同 变量 对象 指向 动作 实际 巨大 位置 内容 函数 实际上 序列 语句 数据库的安全要保护哪些东西 数据库安全各自的含义是什么 生产安全数据库录入 数据库的安全性及管理 数据库安全策略包含哪些 海淀数据库安全审计系统 建立农村房屋安全信息数据库 易用的数据库客户端支持安全管理 连接数据库失败ssl安全错误 数据库的锁怎样保障安全 手冲咖啡和咖啡机区别 重生之互联网科技帝国 互联网科技深圳 互联网科技公司怎么样 互联网科技公司官网 奔汉互联网科技 大白互联网科技 深圳前海聚择互联网科技有限公司 欧洲十大科技互联网公司 互联网对科技的发展 广州市恰铎互联网科技有限公司 中国互联网十大科技股排名 元气玛特互联网科技公司是外包吗 半导体行业属于互联网高科技类吗 山东大美朱楼互联网科技有限公司 世界互联网科技成果奖 版纳互联网科技选哪家 三亚科技创新互联网基地 互联网科技创业计划的风险分析 互联网企业和网络科技有限公司 互联网科技工作委员会 中关村互联网科技集团 科技互联网公司装修 互联网与新科技 伴你行互联网科技有限公司 银川新华互联网科技学校地址 广州慧亚互联网科技怎么样 重庆互联网医院沙龙医盟信息科技 张家口科技产业互联网平台 互联网的科技体现在哪里
0