由于内容太多一下信息由AI辅助整理。
模块操作
- IMPORT_NAME: 导入模块或名称。
- IMPORT_FROM: 从模块中加载特定的名称。
- IMPORT_STAR: 从模块中导入所有名称。
加载和存储操作
- LOAD_CONST(consti): 将常量
co_consts[consti]
推入栈顶。 - LOAD_NAME(namei): 将名称
co_names[namei]
对应的值推入栈顶。 - LOAD_FAST(var_num): 将局部变量
co_varnames[var_num]
推入栈顶。 - STORE_NAME(namei): 将栈顶的值存储到名称
co_names[namei]
。 - STORE_FAST(var_num): 将栈顶的值存储到局部变量
co_varnames[var_num]
。
算术操作
1. 数学运算
这些操作码用于执行基本的数学运算,操作数从栈顶弹出,结果推入栈顶。
BINARY_ADD:
弹出栈顶两个元素,执行加法运算(TOS = TOS1 + TOS
),结果推入栈顶。
示例:a + b
BINARY_SUBTRACT:
弹出栈顶两个元素,执行减法运算(TOS = TOS1 - TOS
),结果推入栈顶。
示例:a - b
BINARY_MULTIPLY:
弹出栈顶两个元素,执行乘法运算(TOS = TOS1 * TOS
),结果推入栈顶。
示例:a * b
BINARY_TRUE_DIVIDE:
弹出栈顶两个元素,执行真除法运算(TOS = TOS1 / TOS
),结果推入栈顶。
示例:a / b
BINARY_FLOOR_DIVIDE:
弹出栈顶两个元素,执行地板除法运算(TOS = TOS1 // TOS
),结果推入栈顶。
示例:a // b
BINARY_MODULO:
弹出栈顶两个元素,执行取模运算(TOS = TOS1 % TOS
),结果推入栈顶。
示例:a % b
BINARY_POWER:
弹出栈顶两个元素,执行幂运算(TOS = TOS1 ** TOS
),结果推入栈顶。
示例:a ** b
2. 位运算
这些操作码用于执行位级别的操作。
BINARY_LSHIFT:
弹出栈顶两个元素,执行左移运算(TOS = TOS1 << TOS
),结果推入栈顶。
示例:a << b
BINARY_RSHIFT:
弹出栈顶两个元素,执行右移运算(TOS = TOS1 >> TOS
),结果推入栈顶。
示例:a >> b
BINARY_AND:
弹出栈顶两个元素,执行按位与运算(TOS = TOS1 & TOS
),结果推入栈顶。
示例:a & b
BINARY_OR:
弹出栈顶两个元素,执行按位或运算(TOS = TOS1 | TOS
),结果推入栈顶。
示例:a | b
BINARY_XOR:
弹出栈顶两个元素,执行按位异或运算(TOS = TOS1 ^ TOS
),结果推入栈顶。
示例:a ^ b
3. 一元运算
这些操作码用于对栈顶的单个元素进行操作。
UNARY_POSITIVE:
对栈顶元素执行正号运算(TOS = +TOS
),结果推入栈顶。
示例:+a
UNARY_NEGATIVE:
对栈顶元素执行负号运算(TOS = -TOS
),结果推入栈顶。
示例:-a
UNARY_NOT:
对栈顶元素执行逻辑非运算(TOS = not TOS
),结果推入栈顶。
示例:not a
UNARY_INVERT:
对栈顶元素执行按位取反运算(TOS = ~TOS
),结果推入栈顶。
示例:~a
4. 增量运算
这些操作码用于就地修改值(in-place operations)。
INPLACE_ADD:
弹出栈顶两个元素,执行就地加法运算(TOS = TOS1 + TOS
),结果推入栈顶。
示例:a += b
INPLACE_SUBTRACT:
弹出栈顶两个元素,执行就地减法运算(TOS = TOS1 - TOS
),结果推入栈顶。
示例:a -= b
INPLACE_MULTIPLY:
弹出栈顶两个元素,执行就地乘法运算(TOS = TOS1 * TOS
),结果推入栈顶。
示例:a *= b
INPLACE_TRUE_DIVIDE:
弹出栈顶两个元素,执行就地真除法运算(TOS = TOS1 / TOS
),结果推入栈顶。
示例:a /= b
INPLACE_FLOOR_DIVIDE:
弹出栈顶两个元素,执行就地地板除法运算(TOS = TOS1 // TOS
),结果推入栈顶。
示例:a //= b
INPLACE_MODULO:
弹出栈顶两个元素,执行就地取模运算(TOS = TOS1 % TOS
),结果推入栈顶。
示例:a %= b
INPLACE_POWER:
弹出栈顶两个元素,执行就地幂运算(TOS = TOS1 ** TOS
),结果推入栈顶。
示例:a **= b
INPLACE_LSHIFT:
弹出栈顶两个元素,执行就地左移运算(TOS = TOS1 << TOS
),结果推入栈顶。
示例:a <<= b
INPLACE_RSHIFT:
弹出栈顶两个元素,执行就地右移运算(TOS = TOS1 >> TOS
),结果推入栈顶。
示例:a >>= b
INPLACE_AND:
弹出栈顶两个元素,执行就地按位与运算(TOS = TOS1 & TOS
),结果推入栈顶。
示例:a &= b
INPLACE_OR:
弹出栈顶两个元素,执行就地按位或运算(TOS = TOS1 | TOS
),结果推入栈顶。
示例:a |= b
INPLACE_XOR:
弹出栈顶两个元素,执行就地按位异或运算(TOS = TOS1 ^ TOS
),结果推入栈顶。
示例:a ^= b
5. 比较运算
- COMPARE_OP(opname):
弹出栈顶两个元素,根据opname
进行比较(如<
,>
,==
,!=
等),将结果(True/False)推入栈顶。
示例:a < b
- IS_OP`: 判断栈顶两个对象是否是同一个对象(is 操作)。
- IS_NOT`: 判断栈顶两个对象是否不是同一个对象(is not 操作)。
控制流
1. 条件判断操作码
这些操作码用于实现条件分支,如if
语句。
- POP_JUMP_IF_FALSE(target):
- 作用:如果栈顶的值为
False
,则跳转到target
指定的字节码位置;否则继续执行。 - 示例:用于
if
语句的条件判断。
- 作用:如果栈顶的值为
- POP_JUMP_IF_TRUE(target):
- 作用:如果栈顶的值为
True
,则跳转到target
指定的字节码位置;否则继续执行。 - 示例:用于
if
语句的条件判断。
- 作用:如果栈顶的值为
- JUMP_IF_FALSE_OR_POP(target):
- 作用:如果栈顶的值为
False
,则跳转到target
;否则弹出栈顶的值并继续执行。 - 示例:用于短路逻辑(如
and
操作)。
- 作用:如果栈顶的值为
- JUMP_IF_TRUE_OR_POP(target):
- 作用:如果栈顶的值为
True
,则跳转到target
;否则弹出栈顶的值并继续执行。 - 示例:用于短路逻辑(如
or
操作)。
- 作用:如果栈顶的值为
2. 循环控制操作码
这些操作码用于控制循环的流程,如for
循环和while
循环。
SETUP_LOOP(delta):
- 作用:设置一个循环块,
delta
是循环结束后的跳转目标。 - 示例:用于
for
循环或while
循环的开始。
- 作用:设置一个循环块,
POP_BLOCK:
- 作用:退出当前循环块,恢复循环之前的栈状态。
- 示例:用于循环结束或
break
语句。
BREAK_LOOP:
- 作用:立即退出当前循环。
- 示例:用于
break
语句。
CONTINUE_LOOP(target):
- 作用:跳转到循环的开始位置,继续下一次迭代。
- 示例:用于
continue
语句。
循环可能会涉及到迭代器如列表之类的,这时候会用到容器操作。
3. 跳转操作码
这些操作码用于实现无条件跳转。
- JUMP_ABSOLUTE(target):
- 作用:无条件跳转到指定的字节码位置。
- 示例:用于循环的重新开始或跳转。
- JUMP_FORWARD(delta):
- 作用:向前跳转
delta
个字节码位置。 - 示例:用于跳过代码块或循环的结束。
- 作用:向前跳转
4. 异常处理操作码
这些操作码用于实现异常处理,如try-except
语句。
- SETUP_FINALLY(delta):
- 作用:设置一个
finally
块,delta
是finally
块的跳转目标。 - 示例:用于
try-finally
语句。
- 作用:设置一个
- SETUP_EXCEPT(delta):
- 作用:设置一个
except
块,delta
是except
块的跳转目标。 - 示例:用于
try-except
语句。
- 作用:设置一个
- RAISE_VARARGS(argc):
- 作用:抛出异常,
argc
指定异常参数的数量。 - 示例:用于
raise
语句。
- 作用:抛出异常,
- WITH_CLEANUP_START:
- 作用:开始清理
with
语句块的资源。 - 示例:用于
with
语句。
- 作用:开始清理
- WITH_CLEANUP_FINISH:
- 作用:结束清理
with
语句块的资源。 - 示例:用于
with
语句。
- 作用:结束清理
容器操作
1. 列表相关操作码
- BUILD_LIST(count): 创建一个包含
count
个元素的新列表。元素从栈顶弹出,列表被推入栈顶。 - LIST_APPEND(i): 将栈顶的元素追加到列表中。
i
是列表在栈中的位置。 - LIST_EXTEND(i): 将栈顶的可迭代对象扩展到列表中。
i
是列表在栈中的位置。 - LIST_TO_TUPLE: 将栈顶的列表转换为元组,并将元组推入栈顶。
- LIST_SUBSCRIPT: 对列表进行下标操作,获取或设置列表中的元素。
2. 元组相关操作码
- BUILD_TUPLE(count): 创建一个包含
count
个元素的新元组。元素从栈顶弹出,元组被推入栈顶。 - TUPLE_SUBSCRIPT: 对元组进行下标操作,获取元组中的元素。
3. 字典相关操作码
- BUILD_MAP(count): 创建一个包含
count
个键值对的新字典。键值对从栈顶弹出,字典被推入栈顶。 - MAP_ADD(i): 将栈顶的键值对添加到字典中。
i
是字典在栈中的位置。 - DICT_UPDATE(i): 将栈顶的字典更新到目标字典中。
i
是目标字典在栈中的位置。 - DICT_MERGE(i): 将栈顶的字典合并到目标字典中。
i
是目标字典在栈中的位置。
4. 集合相关操作码
- BUILD_SET(count): 创建一个包含
count
个元素的新集合。元素从栈顶弹出,集合被推入栈顶。 - SET_ADD(i): 将栈顶的元素添加到集合中。
i
是集合在栈中的位置。 - SET_UPDATE(i): 将栈顶的可迭代对象更新到集合中。
i
是集合在栈中的位置。
5. 通用容器操作码
- CONTAINS_OP: 检查栈顶的元素是否包含在容器中。
- IS_OP: 检查栈顶的两个元素是否是同一个对象。
- GET_ITER: 将栈顶的容器转换为迭代器,并将迭代器推入栈顶。
- FOR_ITER(delta): 从迭代器中获取下一个元素,并将其推入栈顶。如果迭代器耗尽,则跳转到
delta
指定的位置。 - UNPACK_SEQUENCE(count): 将栈顶的序列解包为
count
个元素,并将这些元素推入栈顶。
6. 其他相关操作码
- STORE_SUBSCR: 对容器进行下标赋值操作,将栈顶的值赋给容器的指定下标。
- DELETE_SUBSCR: 删除容器中指定下标的元素。
- BINARY_SUBSCR: 对容器进行下标操作,获取容器中的元素。
7.切片
BUILD_SLICE
功能:根据栈顶的元素构建一个切片对象。
参数:
- 如果操作码的参数是
2
,则表示构建一个简单的切片(只有start
和stop
,如a[start:stop]
)。 - 如果操作码的参数是
3
,则表示构建一个扩展的切片(包含start
、stop
和step
,如a[start:stop:step]
)。
- 如果操作码的参数是
栈操作:
- 从栈顶弹出
step
(如果有)、stop
和start
的值。 - 将这些值组合成一个切片对象,并将切片对象推入栈顶。
- 从栈顶弹出
函数操作
创建
MAKE_FUNCTION(flags):
- 作用:创建一个函数对象。
flags
用于指示函数的特性(如默认参数、闭包等)。
调用
- CALL_FUNCTION(argc):
- 作用:调用一个函数,
argc
指定位置参数的数量。函数和参数从栈顶弹出,返回值推入栈顶。 - 示例:用于普通函数调用,如
func(arg1, arg2)
。
- 作用:调用一个函数,
- CALL_FUNCTION_KW(argc):
- 作用:调用一个函数,
argc
指定位置参数的数量,关键字参数以字典形式传递。函数、参数和关键字字典从栈顶弹出,返回值推入栈顶。 - 示例:用于带关键字参数的函数调用,如
func(arg1, arg2, key=value)
。
- 作用:调用一个函数,
- CALL_FUNCTION_EX(flags):
- 作用:调用一个函数,支持扩展的参数传递方式。
flags
用于指示是否传递关键字参数。 - 示例:用于动态参数传递,如
func(*args, **kwargs)
。
- 作用:调用一个函数,支持扩展的参数传递方式。
- CALL_METHOD(argc):
- 作用:调用一个方法,
argc
指定位置参数的数量。对象、方法和参数从栈顶弹出,返回值推入栈顶。 - 示例:用于对象方法的调用,如
obj.method(arg1, arg2)
。
- 作用:调用一个方法,
返回
- RETURN_VALUE:
- 作用:将栈顶的值作为函数的返回值,并结束函数的执行。
- 示例:用于
return
语句。
加载与存储
1. 局部变量操作码
这些操作码用于访问和修改函数的局部变量。
- LOAD_FAST(var_num):
- 作用:从局部变量表中加载第
var_num
个变量到栈顶。 - 示例:用于访问函数的局部变量。
- 作用:从局部变量表中加载第
- STORE_FAST(var_num):
- 作用:将栈顶的值存储到局部变量表中的第
var_num
个变量。 - 示例:用于赋值给函数的局部变量。
- 作用:将栈顶的值存储到局部变量表中的第
2. 全局变量操作码
这些操作码用于访问和修改全局变量。
- LOAD_GLOBAL(namei):
- 作用:从全局变量表中加载第
namei
个变量到栈顶。 - 示例:用于访问全局变量或内置函数。
- 作用:从全局变量表中加载第
- STORE_GLOBAL(namei):
- 作用:将栈顶的值存储到全局变量表中的第
namei
个变量。 - 示例:用于赋值给全局变量。
- 作用:将栈顶的值存储到全局变量表中的第
3. 名称操作码
这些操作码用于访问和修改当前命名空间中的变量。
- LOAD_NAME(namei):
- 作用:从名称表中加载第
namei
个名称到栈顶。 - 示例:用于访问变量或函数名。
- 作用:从名称表中加载第
- STORE_NAME(namei):
- 作用:将栈顶的值存储到名称表中的第
namei
个名称。 - 示例:用于赋值给变量。
- 作用:将栈顶的值存储到名称表中的第
4. 闭包和自由变量操作码
这些操作码用于访问和修改闭包中的变量。
- LOAD_CLOSURE(i):
- 作用:加载闭包变量。
i
是闭包变量的索引。 - 示例:用于闭包函数的定义。
- 作用:加载闭包变量。
- LOAD_DEREF(i):
- 作用:加载闭包变量或自由变量。
i
是变量的索引。 - 示例:用于访问闭包中的变量。
- 作用:加载闭包变量或自由变量。
- STORE_DEREF(i):
- 作用:将栈顶的值存储到闭包变量或自由变量中。
i
是变量的索引。 - 示例:用于修改闭包中的变量。
- 作用:将栈顶的值存储到闭包变量或自由变量中。
5. 属性操作码
这些操作码用于访问和修改对象的属性。
- LOAD_ATTR(namei):
- 作用:加载对象的属性。对象和属性名从栈顶弹出,属性值推入栈顶。
- 示例:用于访问对象属性,如
obj.attr
。
- STORE_ATTR(namei):
- 作用:将栈顶的值存储到对象的属性中。对象和属性名从栈顶弹出。
- 示例:用于赋值给对象属性,如
obj.attr = value
。
6. 常量操作码
这些操作码用于加载常量。
- LOAD_CONST(consti):
- 作用:将常量表中的第
consti
个常量加载到栈顶。 - 示例:用于加载数字、字符串等常量。
- 作用:将常量表中的第
7. 其他加载操作码
这些操作码用于加载其他类型的数据。
- LOAD_BUILD_CLASS:
- 作用:加载
__build_class__
函数到栈顶,用于类的构建。 - 示例:用于
class
语句。
- 作用:加载
- LOAD_METHOD(namei):
- 作用:加载对象的方法。对象和方法名从栈顶弹出,方法推入栈顶。
- 示例:用于调用对象方法,如
obj.method()
。
堆栈操作
1. 基本堆栈操作码
这些操作码用于直接操作栈顶的数据。
- POP_TOP:
- 作用:弹出栈顶的元素。
- 示例:用于清理栈顶的临时值。
- DUP_TOP:
- 作用:复制栈顶的元素,并将副本推入栈顶。
- 示例:用于需要重复使用栈顶值的场景。
- DUP_TOP_TWO:
- 作用:复制栈顶的两个元素,并将副本按顺序推入栈顶。
- 示例:用于需要重复使用栈顶两个值的场景。
- ROT_TWO:
- 作用:交换栈顶的两个元素。
- 示例:用于交换两个变量的值。
- ROT_THREE:
- 作用:将栈顶的三个元素旋转,使得第三个元素成为栈顶。
- 示例:用于复杂的值交换。
- ROT_FOUR:
- 作用:将栈顶的四个元素旋转,使得第四个元素成为栈顶。
- 示例:用于更复杂的值交换。
- NOP:
- 作用:空操作,不执行任何操作。
- 示例:用于占位或调试。
- PRINT_EXPR:
- 作用:弹出栈顶的值并打印。
- 示例:用于交互式环境中的表达式求值。