交付:一个字节码统计工具

交付:一个字节码统计工具

场景:需要一个小工具,对任何一个 .py 文件报出每个函数的字节码规模。 任务:写 ~/统计.py,用法 python3 统计.py 某文件.py:每个顶层函数一行「函数名 指令条数 局部变量数」,按

阅读更多 →
编译成 .pyc 再跑

编译成 .pyc 再跑

场景:~/程序/程序.py 直接跑会打两行。Python 每次 import 一个模块都会先把它编译成字节码存成 .pyc。 任务:把它编译成 .pyc,把生成的文件放到 ~/构建/程序.pyc;py

阅读更多 →
交一份字节码证据

交一份字节码证据

场景:函数 f 在 ~/程序/程序.py 里。 任务:写 ~/证据.txt,正好三行:「参数个数 …」「局部变量 …」(co_varnames 逗号连、不加空格)「指令条数 …」(dis.get_in

阅读更多 →
栈最深要几格

栈最深要几格

场景:编译器在编译时就算好了每个函数的操作数栈最深要几格(co_stacksize)。说明里指定了一个函数。对照表列了八个数。 任务:看那个函数的 co_stacksize,到对照表里查这个数对应的标

阅读更多 →
哪个函数里有循环

哪个函数里有循环

场景:程序里有五个函数,只有一个里面有循环;循环在字节码里是一条往回跳的指令(JUMP_BACKWARD)。对照表列了八个名字。 任务:只从反汇编结果里找出哪个函数有往回跳,到对照表里查它的名字对应的

阅读更多 →
条件跳转跳到哪

条件跳转跳到哪

场景:函数 f 有一个 if,反汇编之后它变成一条条件跳转指令,后面写着「to N」。对照表列了八个数。 任务:找出那个 N(跳转目标的偏移量),到对照表里查它对应的标记。 可操作范围:只在分给你的这

阅读更多 →
常量表里最大的整数

常量表里最大的整数

场景:函数 f 用到了几个数,也用到了模块级的 LIMIT。对照表列了八个数。 任务:看 f 的代码对象的常量表(f.__code__.co_consts),找出里面最大的那个整数,到对照表里查它对应

阅读更多 →
f 里读了几次局部变量

f 里读了几次局部变量

场景:~/程序/程序.py 里有几个小函数。对照表列了八个数。 任务:反汇编函数 f,数一数 LOAD_FAST(读局部变量)这条指令出现了几次,到对照表里查这个数对应的标记。 可操作范围:只在分给你

阅读更多 →
从 dis 的一行里认东西

从 dis 的一行里认东西

dis 打出来的一行长这样。先在这里练怎么抠出偏移、指令名、操作数和括号里的说明: line = " 28 POP_JUMP_FORWARD_IF_FALSE

阅读更多 →
真机上先看什么

真机上先看什么

拿到一个 .py 文件要读它的字节码,第一步是【0】。

阅读更多 →