linux codeblocks python,pyc字节码文件 - Python2.7.7源码分析_Linux编程_Linux公社-Linux系统门户网站...

什么是字节码

Python解释器在执行python脚本文件时,对文件中的python源代码进行编译,编译的结果就是byte code(字节码)

python虚拟机执行编译好的字节码,完成程序的运行

python会为导入的模块创建字节码文件

字节码文件的创建过程

当a.py依赖b.py时,如在a.py中import b

python先检查是否有b.pyc文件(字节码文件),如果有,并且修改时间比b.py晚,就直接调用b.pyc

否则编译b.py生成b.pyc,然后加载新生成的字节码文件

字节码对象

每个py文件会包含许多代码块(Code Block)

每个代码块(Code Block)会编译创建一个字节码对象(PyCodeObject)

PyCodeObject 对象本身是嵌套的,根据代码块的结构嵌套

子 PyCodeObject 对象保存在父对象的 co_consts 变量中

代码块 Code Block

# 整个文件是一个代码块 1

# 代码块 2

class TestA(object):

pass

# 代码块 3

class TestB(object):

pass

# 代码块 4

def show():

print 'show ...'

a = TestA()show()

字节码对象的结构

/* 字节码对象 */

typedef struct {

PyObject_HEAD

int co_argcount;        /* Code Block 参数个数 */

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

int co_stacksize;       /* 栈空间 */

int co_flags;       /* CO_..., see below */

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

PyObject *co_consts;    /* 常量列表(子代码块也在这里) */

PyObject *co_names;     /* 字符串符号列表 */

PyObject *co_varnames;  /* 局部变量名 */

PyObject *co_freevars;  /* 闭包所需要的变量 */

PyObject *co_cellvars;      /* 嵌套函数所引用的局部变量名 */

/* The rest doesn't count for hash/cmp */

PyObject *co_filename;  /* py文件路径 */

PyObject *co_name;      /* Code block 的函数名或类名 */

int co_firstlineno;     /* Code block 起始行 */

PyObject *co_lnotab;    /* 字节码指令与源代码的对应关系 */

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

PyObject *co_weakreflist;   /* to support weakrefs to code objects */

} PyCodeObject;

字节码文件的内部实现

字节码对象序列化到硬盘的结果,就是字节码文件。这个过程是一个递归写入的过程。

static void w_object(PyObject *v, WFILE *p){

Py_ssize_t i, n;

p->depth++;

/* ... */

else if (PyCode_Check(v)) {

PyCodeObject *co = (PyCodeObject *)v;

w_byte(TYPE_CODE, p);

w_long(co->co_argcount, p);

w_long(co->co_nlocals, p);

w_long(co->co_stacksize, p);

w_long(co->co_flags, p);

w_object(co->co_code, p);

w_object(co->co_consts, p);

w_object(co->co_names, p);

w_object(co->co_varnames, p);

w_object(co->co_freevars, p);

w_object(co->co_cellvars, p);

w_object(co->co_filename, p);

w_object(co->co_name, p);

w_long(co->co_firstlineno, p);

w_object(co->co_lnotab, p);

}

/* ... */

}

反序列化执行字节码文件

字节码文件在反序列化时创建字节码对象的结构,虚拟机在执行的时候根据字节码对象执行程序功能。0b1331709591d260c1c78e86d0c51c18.png

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值