零、绪论:特别鸣谢下文博客,自己博客是对这篇博客的学习笔记:

一、三种文件:

1、pyc文件:py文件编译后的二进制文件。

2、pyo文件:优化后的py编译的文件。

3、pyd文件:其他语言编程的py库。

二、python编译的过程:

python不单纯是一种解释性语言,也需要编译,需要编译成字节码。然后模仿可执行文件的入栈出栈调用顺序执行。pyc文件中保存这编译而成的字节码,PVM从PyCodeObject读取字节码一条一条执行。PyCodeObject保存字节码以及进程上下文信息。pyc文件在import事后创建PyCodeObject对象,一般是由py_compile模块操作的。直接执行py文件不会生成pyc,但是可以通过python -m xxx.py生成pyc文件。

从整体上看:OS中执行程序离不开两个概念:进程和线程。python中模拟了这两个概念,模拟进程和线程的分别是PyInterpreterState和PyTreadState。即:每个PyThreadState都对应着一个帧栈,python虚拟机在多个线程上切换。当python虚拟机开始执行时,它会先进行一些初始化操作,最后进入PyEval_EvalFramEx函数,它的作用是不断读取编译好的字节码,并一条一条执行,类似CPU执行指令的过程。函数内部主要是一个switch结构,根据字节码的不同执行不同的代码。

三、PyCodeObject的结构:

1 typedef struct{2 PyObject_HEAD3 int co_argcount; /*位置参数个数*/

4 int co_nlocals; /*局部变量个数*/

5 int co_stacksize; /*栈大小*/

6 intco_flags;7 PyObject *co_code; /*字节码指令序列*/

8 PyObject *co_consts; /*所有常量集合*/

9 PyObject *co_names; /*所有符号名称集合*/

10 PyObject *co_varnames; /*局部变量名称集合*/

11 PyObject *co_freevars; /*闭包用的变量名集合*/

12 PyObject *co_cellvars; /*内部嵌套函数引用的变量名集合*/

13 /*The rest doesn’t count for hash/cmp*/

14 PyObject *co_filename; /*代码所在文件名*/

15 PyObject *co_name; /*模块名|函数名|类名*/

16 int co_firstlineno; /*代码块在文件中的起始行号*/

17 PyObject *co_lnotab; /*字节码指令和行号的对应关系*/

18 void *co_zombieframe; /*for optimization only (see frameobject.c)*/

19 } PyCodeObject;

引用的C语言的PyCodeObject的结构体

四、执行过程:

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

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

const char *s = “hello”;

void func() {

printf(“%s\n”, s);

}

int main() {

func();

return 0;

}

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

PyFrameObject对象创建程序运行时的动态信息,即执行环境,相关源码大致如下:

typedef struct _frame{

PyObject_VAR_HEAD //"运行时栈"的大小是不确定的

struct _frame *f_back; //执行环境链上的前一个frame,很多个PyFrameObject连接起来形成执行环境链表

PyCodeObject *f_code; //PyCodeObject 对象,这个frame就是这个PyCodeObject对象的上下文环境

PyObject *f_builtins; //builtin名字空间

PyObject *f_globals; //global名字空间

PyObject *f_locals; //local名字空间

PyObject **f_valuestack; //"运行时栈"的栈底位置

PyObject **f_stacktop; //"运行时栈"的栈顶位置

//...

int f_lasti; //上一条字节码指令在f_code中的偏移位置

int f_lineno; //当前字节码对应的源代码行

//...

//动态内存,维护(局部变量+cell对象集合+free对象集合+运行时栈)所需要的空间

PyObject *f_localsplus[1];

} PyFrameObject;

python虚拟机原理_pvm虚拟机基本原理相关推荐

  1. java虚拟机原理(java虚拟机的基本结构)

    虚拟机的分类 虚拟机大体上分为系统虚拟机和程序虚拟机: 如:大名鼎鼎的VMware就属于系统虚拟机,VMware是完全对物理计算机的仿真,提供一个可以运行完整操作系统的软件平台: 程序虚拟机的代表就是 ...

  2. php和python和java-Java、Python与PHP的虚拟机异同

    Java.Python与PHP的虚拟机异同 Java-JVM 定义 JDK(Java Development Kit) 是 Java 语言的软件开发工具包(SDK).JDK 物理存在,是 progra ...

  3. python虚拟机下载_虚拟机 python

    广告关闭 腾讯云11.11云上盛惠 ,精选热门产品助力上云,云服务器首年88元起,买的越多返的越多,最高返5000元! 打开文件--打开bashrc--加入#addexportvirtualenvwr ...

  4. 《Java虚拟机原理图解》5. JVM类加载器机制与类加载过程

    参考网址:http://blog.csdn.net/luanlouis/article/details/50529868 0.前言 读完本文,你将了解到: 一.为什么说Jabalpur语言是跨平台的 ...

  5. 【Java 虚拟机原理】Class 字节码二进制文件分析 七 ( 局部变量表分析 )

    文章目录 前言 一.编译生成带局部变量表的字节码文件 二.局部变量表 前言 上一篇博客 [Java 虚拟机原理]Class 字节码二进制文件分析 二 ( 常量池位置 | 常量池结构 | tag | i ...

  6. 【Java 虚拟机原理】Class 字节码二进制文件分析 六 ( 属性类型 | Code 属性 | 属性名称索引 | 属性长度 | 操作数栈最大深度 | 局部变量存储空间 | 字节码长度 )

    文章目录 前言 一.属性类型 二.Code 属性表数据结构 三.属性名称索引 四.属性长度 五.操作数栈最大深度 六.局部变量存储空间 七.字节码长度 八.存储字节码指令的一系列字节流 前言 上一篇博 ...

  7. 【Java 虚拟机原理】Class 字节码二进制文件分析 五 ( 方法计数器 | 方法表 | 访问标志 | 方法名称索引 | 方法返回值类型 | 方法属性数量 | 方法属性表 )

    文章目录 前言 一.方法表结构 二.方法计数器 三.方法表数据解析 ( init 构造方法 ) 1.方法访问标志 2.方法名称索引 3.方法返回类型 4.方法属性数量 前言 上一篇博客 [Java 虚 ...

  8. 【Java 虚拟机原理】Class 字节码二进制文件分析 四 ( 字段表数据结构 | 字段表详细分析 | 访问标志 | 字段名称 | 字段描述符 | 属性项目 )

    文章目录 前言 一.字段表总数据结构 二.访问标志 三.字段名称 四.字段描述符 五.属性项目数 前言 上一篇博客 [Java 虚拟机原理]Class 字节码二进制文件分析 三 ( 访问和修饰标志 | ...

  9. 【Java 虚拟机原理】Class 字节码二进制文件分析 三 ( 访问和修饰标志 | 类索引 | 父类索引 | 接口计数器 | 接口表 | 字段计数器 | 字段表 )

    文章目录 前言 一.访问和修饰标志 二.类索引 三.父类索引 四.接口计数器 五.接口表 六.字段计数器 七.字段表 前言 上一篇博客 [Java 虚拟机原理]Class 字节码二进制文件分析 二 ( ...

最新文章

  1. SQL删除重复数据方法
  2. 干货:排名前 16 的 Java 工具类!
  3. 如何制作快速加载的HTML页面
  4. python中的内部函数和闭包函数
  5. 出现“ORA-28000:the account is locked”的解决办法
  6. chrome/chromium浏览器的Enter passwod to unlock your login keyring
  7. ARM(IMX6U)裸机之I.MX6ULL硬件启动方式的选择
  8. Python数据结构:序列(列表[]、元组())与映射(字典{})语法总结
  9. 为tornado自定义session
  10. Java的常用Swing外观类总结
  11. mysql认证 成都考点_CKA概述、考试形式、考试地址、考纲占比等
  12. 样条插值 spline interpolation matlab c++实现
  13. [转载]般若波罗蜜多心经
  14. Visual Studio 2017 智能提示英文怎么切换成中文?
  15. 时光里,我们都是赶路人
  16. 间歇性需求预测之Croston‘s method
  17. 网页如何与小程序交互通信
  18. Spring+Hibernate配置文件-applicationContext.xml设置
  19. 2023最新SSM计算机毕业设计选题大全(附源码+LW)之java大学生生活助手h546s
  20. linux服务器怎么安装vbox,在Linux服务器上使用Vbox安装虚拟机

热门文章

  1. eclipse安装及使用
  2. android手机8g内存够用嘛,安卓旗舰机8GB运行内存到底够不够用?有必要上12GB吗?...
  3. 冯诺依曼体系结构与操作系统的概念及理解
  4. 通信算法之149:EVM测量
  5. 什么是线程同步和线程异步?
  6. 使用weinre调试手机页面
  7. 分析IBinder体系中getService的流程
  8. Binder Java层实现(一):IBinder/IInterface/Binder/Stub
  9. 当程序员转行去做销售
  10. Ironic console