65. 反汇编 Python 程序
到目前为止,我们已经生成了 CodeObject 对象,Python 内置了 dis 模块可以获得可阅读的汇编代码。52 节已经对 dis 模块的使用做了演示: 上面的代码保存在 test.py, 用 python3 运 …
阅读全文到目前为止,我们已经生成了 CodeObject 对象,Python 内置了 dis 模块可以获得可阅读的汇编代码。52 节已经对 dis 模块的使用做了演示: 上面的代码保存在 test.py, 用 python3 运 …
阅读全文终于,解决了变量的作用域问题,AST 中的信息也被整理妥当,下面让我们进入正题,生成 CodeObject。 再看 CodeObject 的结构 构建 CodeObject 的过程,实际上对应着低级语言(如 C、C++) …
阅读全文注:之前打算直接研究 Python 的命名空间实现,但后来发现目前局限在具体命名空间内的作用域问题更合适,对研究主题稍作调整。 Python 首先将 Python 源码转换为 AST,然后在 run mod PyAST …
阅读全文我们已经找到了一些特定的语句,它们会调用 symtable enter block 函数,创建新的 Symbol Table Entry: FunctionDef kind,函数定义语句; ClassDef kind,类 …
阅读全文前面说到 CodeObject 的结构,其中忽略了一个重要的问题:CodeObject 中记录了 names、contants 之类的信息。根据我们使用 Python 的经验来说,不可能整个 Python 程序的所有名称 …
阅读全文前面已经对 AST 的构建、查看、修改比较理解了,AST 可以认为是 Python 源码的另一种表示,它们具备一对一的对照关系,甚至只要提供 AST,我们可以通过 astunparse 之类的库直接从 AST 完美的还原 …
阅读全文Python 已经内置了针对 AST 的工具集:ast,可以在 Python 中完成与底层同样效果的工作。我们不仅可以通过 ast 库将任意代码编译为 AST 结构,而且对应的 AST 对象也可以被内置的 compile …
阅读全文在 Python 的底层实现中已经包含了源码到 AST 到 CodeObject 的转换过程,实际上 Python 也提供了一组工具,帮助我们直接控制 AST,如果熟练掌握的话,可以实现一些很有意思的魔法。 从源码到 …
阅读全文现在我们至少有这样的认识,ByteCode 是 VM 唯一直接支持的运算表示,Python 源码的复杂逻辑,最终需要转换为 Bytecode。而 Bytecode 又是如此简单,从 Python 源码到 Bytecode …
阅读全文一行简单的 Python 代码 print("hello world.") 被转换为 ByteCode,第一条指令是: 0 是 “print” 在 names 中的索引。这条指令将 print 函数对象压入 VM 执行栈 …
阅读全文