Python内核阅读(八): 字节码

Python 2017-08-06

起步

上一章是对pyc(字节码)文件的生成与读取做了一些分析. 本章就是对字节码的内容做分析. python虚拟机就是根据这些字节码来进行一些列的操作. 因此需要定义字节码指令:

[opcode.h]
#define POP_TOP                   1
#define ROT_TWO                   2
#define ROT_THREE                 3
...
#define LOAD_METHOD             160
#define CALL_METHOD             161

在这些字节码指令中, 有一部分是需要参数的, 另一部分没有参数. 作为区分, 有参数的指令编码超过90:

[opcode.h]
#define HAVE_ARGUMENT            90
#define HAS_ARG(op) ((op) >= HAVE_ARGUMENT)

解析pyc文件

python自带工具dis可以解析pyc文件, 将其以转换成指令:

[compile.py]
s = 'python'
l = []
d = {}

[dis_test.py]
import dis
s = open('compile.py').read()

co = compile(s, 'compile.py', 'exec')

dis.dis(co)

可以看到指令:

1         0 LOAD_CONST               0 ('python')
          2 STORE_NAME               0 (s)

2         4 BUILD_LIST               0
          6 STORE_NAME               1 (l)

3         8 BUILD_MAP                0
         10 STORE_NAME               2 (d)
         12 LOAD_CONST               1 (None)
         14 RETURN_VALUE

左边第一列代表指令对应源码中的行号. 第二列代表当前字节码再co_code中的偏移量, 第三列是当前的字节码指令, 最后一列是当前字节码指令的参数.


本文由 hongweipeng 创作,采用 知识共享署名 3.0,可自由转载、引用,但需署名作者且注明文章出处。

如果对您有用,您的支持将鼓励我继续创作!