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

Python措施的执行道理(1)

发布时间:2018-04-14 06:07:16 所属栏目:编程 来源: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

(编辑:湖南网)

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

热点阅读