加入收藏 | 设为首页 | 会员中心 | 我要投稿 核心网 (https://www.hxwgxz.com/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程 > 正文

Python程序的执行原理(1)

发布时间:2018-04-14 12:09:31 所属栏目:编程 来源:tech.uc.cn
导读:副标题#e# 1. 过程概述 Python先把代码(.py文件)编译成字节码,交给字节码虚拟机,然后虚拟机一条一条执行字节码指令,从而完成程序的执行。 2. 字节码 字节码在Python虚拟机程序里对应的是PyCodeObject对象。 .pyc文件是字节码在磁盘上的表现形式。 3. p

Python虚拟机的原理就是模拟可执行程序再X86机器上的运行,X86的运行时栈帧如下图:

Python程序的执行原理(1)

假如test.py用C语言来实现,会是下面这个样子:

  1. const char *s = “hello”; 
  2.  
  3. void func() { 
  4.     printf(“%sn”, s); 
  5.  
  6. int main() { 
  7.     func(); 
  8.     return 0; 

Python虚拟机的原理就是模拟上述行为。当发生函数调用时,创建新的栈帧,对应Python的实现就是PyFrameObject对象。

7.1 PyFrameObject

  1. typedef struct _frame { 
  2.     PyObject_VAR_HEAD 
  3.     struct _frame *f_back;    /* 调用者的帧 */ 
  4.     PyCodeObject *f_code;     /* 帧对应的字节码对象 */ 
  5.     PyObject *f_builtins;     /* 内置名字空间 */ 
  6.     PyObject *f_globals;      /* 全局名字空间 */ 
  7.     PyObject *f_locals;       /* 本地名字空间 */ 
  8.     PyObject **f_valuestack;  /* 运行时栈底 */ 
  9.     PyObject **f_stacktop;    /* 运行时栈顶 */ 
  10.     ……. 

那么对应Python的运行时栈就是这样子:

Python程序的执行原理(1)

7.2 执行指令

执行test.py的字节码时,会先创建一个栈帧,以下用f表示当前栈帧,执行过程注释如下:

test.py的符号名集合和常量集合

  1. co.co_names   (‘s’, ’func’) 
  2. co.co_consts  (‘hello’, <code object func at 0x2aaeeec57110, file ”test.py”, line 3>, None) 

test.py的指令序列

Python程序的执行原理(1)

上面的CALL_FUNCTION指令执行时,会创建新的栈帧,并执行func的字节码指令,以下用f表示当前栈帧,func的字节码执行过程如下:

func函数的符号名集合和常量集合

  1. func.co_names       (‘s’,) 
  2. func.co_consts      (None,)

func函数的指令序列

Python程序的执行原理(1)

7.3 查看栈帧

如果你想查看当前栈帧,Python提供了sys._getframe()方法可以获取当前栈帧,你只需要在代码里加入代码如下:

  1. def func(): 
  2.     import sys 
  3.     frame = sys._getframe() 
  4.     print frame.f_locals 
  5.     print frame.f_globals 
  6.     print frame.f_back.f_locals 
  7.     #你可以打印frame的各个域 
  8.     print s   

原文链接:http://tech.uc.cn/?p=1932

(编辑:核心网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

热点阅读