LOADING

加载过慢请开启缓存 浏览器默认开启

py常用字节码总结

由于内容太多一下信息由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块,deltafinally块的跳转目标。
    • 示例:用于try-finally语句。
  • SETUP_EXCEPT(delta):
    • 作用:设置一个except块,deltaexcept块的跳转目标。
    • 示例:用于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,则表示构建一个简单的切片(只有 startstop,如 a[start:stop])。
    • 如果操作码的参数是 3,则表示构建一个扩展的切片(包含 startstopstep,如 a[start:stop:step])。
  • 栈操作

    • 从栈顶弹出 step(如果有)、stopstart 的值。
    • 将这些值组合成一个切片对象,并将切片对象推入栈顶。

函数操作

创建

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:
    • 作用:弹出栈顶的值并打印。
    • 示例:用于交互式环境中的表达式求值。