Python常见字节码
Python字节码
虽然python作为解释型语言,但是其也不是直接对源码进行解释
python解释器会将源码处理成字节码后,再借助python解释器运行程序
通过python自带的dis包可以将目标函数转化为字节码
例如:
1 |
|
得到
1 |
|
常见指令
一般指令与一元操作指令
指令 | 作用 |
---|---|
NOP | 无作用,用于占位 |
POP_TOP | 弹出栈顶元素 |
LOAD_CONST | 将读取的值推入栈 |
LOAD_GLOBAL | 将全局变量压入栈 |
STORE_FAST | 将栈顶指令存入对应的局部变量 |
COMPARE_OP | 比较操作符 |
CALL_FUNCTION | 调用函数 |
BUILD_SLICE | 调用切片,跟的参数为切片的值的个数一般上到下为[Val1:Val2:Val3] |
JUMP_ABSOLUTE | 向下跳转几句操作符,变量为跳转偏移量 |
UNARY_POSITIVE | 实现Val1 = +Val1 |
UNARY_NEGATIVE | 实现Val1 = -Val1 |
UNARY_NOT | 实现Val1 = not Val1 |
UNARY_INVERT | 实现Val1 = ~Val1 |
FOR_ITER | for循环 |
GET_ITER | 获取迭代器(一般后面跟循环) |
GET_YIELD_FROM_ITER | 获取yield生成器 |
二元操作指令
指令 | 作用 |
---|---|
BINARY_POWER | 乘方,栈顶为指数 |
BINARY_MULTIPLY | 乘法 |
BINARY_MATRIX_MULTIPLY | 矩阵乘法,3.5引入的新功能 |
BINARY_FLOOR_DIVIDE | 除法,向下取整 |
BINARY_TRUE_DIVIDE | 除法 |
BINARY_MODULO | 取余 |
BINARY_ADD | 加法 |
BINARY_SUBTRACT | 减法 |
BINARY_SUBSCR | 数组取下标,栈顶为下标 |
BINARY_LSHIFT | 左移操作符 |
BINARY_RSHIFT | 右移操作符(除二向下取整) |
BINARY_AND | 按位与 |
BINARY_XOR | 异或 |
BINARY_OR | 按位或 |
STORE_SUBSCR | 列表下标存储,如Val1[Val2] = Val3 |
DELETE_SUBSCR | 列表下标存储,如del Val1[Val2] |
自身操作指令,类似
b += 1
,就是上面有BINARY的指令将BINARY改为INPLACE其他指令见官方文档