文章

随笔

65. 反汇编 Python 程序

到目前为止,我们已经生成了 CodeObject 对象,Python 内置了 dis 模块可以获得可阅读的汇编代码。52 节已经对 dis 模块的使用做了演示: 上面的代码保存在 test.py, 用 python3 运 …

阅读全文
随笔

64. 构建 CodeObject

终于,解决了变量的作用域问题,AST 中的信息也被整理妥当,下面让我们进入正题,生成 CodeObject。 再看 CodeObject 的结构 构建 CodeObject 的过程,实际上对应着低级语言(如 C、C++) …

阅读全文
随笔

63. Python 是如何实现作用域的 (3)

注:之前打算直接研究 Python 的命名空间实现,但后来发现目前局限在具体命名空间内的作用域问题更合适,对研究主题稍作调整。 Python 首先将 Python 源码转换为 AST,然后在 run mod PyAST …

阅读全文
随笔

61. Python 是如何实现作用域的 (1)

前面说到 CodeObject 的结构,其中忽略了一个重要的问题:CodeObject 中记录了 names、contants 之类的信息。根据我们使用 Python 的经验来说,不可能整个 Python 程序的所有名称 …

阅读全文
随笔

60. 为什么 CodeObject 是这样的?

前面已经对 AST 的构建、查看、修改比较理解了,AST 可以认为是 Python 源码的另一种表示,它们具备一对一的对照关系,甚至只要提供 AST,我们可以通过 astunparse 之类的库直接从 AST 完美的还原 …

阅读全文
随笔

59. Hack 抽象语法树

Python 已经内置了针对 AST 的工具集:ast,可以在 Python 中完成与底层同样效果的工作。我们不仅可以通过 ast 库将任意代码编译为 AST 结构,而且对应的 AST 对象也可以被内置的 compile …

阅读全文
随笔

58. 在 Python 中生成 AST

在 Python 的底层实现中已经包含了源码到 AST 到 CodeObject 的转换过程,实际上 Python 也提供了一组工具,帮助我们直接控制 AST,如果熟练掌握的话,可以实现一些很有意思的魔法。 从源码到 …

阅读全文
随笔

57. 从源码到 AST

现在我们至少有这样的认识,ByteCode 是 VM 唯一直接支持的运算表示,Python 源码的复杂逻辑,最终需要转换为 Bytecode。而 Bytecode 又是如此简单,从 Python 源码到 Bytecode …

阅读全文