19 | Python编译器(三):运行时机制
该思维导图由 AI 生成,仅供参考
理解字节码的执行过程
- 深入了解
- 翻译
- 解释
- 总结
本文深入探讨了Python的运行时机制和对象设计,重点讨论了字节码的执行过程和Python对象的设计。通过GDB跟踪执行示例程序,详细解读了LOAD_CONST和STORE_NAME指令的执行过程,揭示了Python程序中的任何符号都是对象的特点。此外,文章介绍了Python对象的设计思路,包括基于堆的内存申请、基于引用计数的垃圾收集机制以及对象的唯一ID。通过对Python对象的设计特点的阐述,读者可以深入了解Python的类型系统设计。文章还介绍了Python的类型系统设计,每个PyObject对象都有一个类型信息,保存类型信息的数据结构是PyTypeObject。PyTypeObject本身也是一个PyObject,包含了对一个类型的各种描述信息,也包含了一些函数的指针,用于实现各种标准操作。Python的类型系统设计相当精巧,为Python语言的很多优点提供了基础支持。整体而言,本文通过深入浅出的方式,为读者呈现了Python运行时机制和对象设计的核心要点,为进一步深入学习Python编译器提供了重要的基础知识。
《编译原理实战课》,新⼈⾸单¥59
全部留言(4)
- 最新
- 精选
- xiaobang请问pypy内部也有类似的pytype结构吗
作者回复: 你比较喜欢PyPy?这很好。PyPy这个项目有很多创新思维,很有启发性。如果把PyPy研究透,能够大大促进对编译工作的实质的理解。 回答一下你的问题:PyPy做编译的思路,跟CPython是不同的。CPython更多是解释执行,类型信息是在运行时动态根据py_type字段去查找,然后再基于类型信息去执行正确的操作。所有这些动作都是运行时去做的,所以开销很大。 而PyPy更像是v8编译器、Julia编译器。它会在编译时进行类型推理,从而确定出每个变量的类型,并确定出正确的操作。所以,它不需要这么个py_type字段,用来在运行时做类型的查找。也因此,PyPy编译出来的对象,对象头里顶多有为了垃圾收集而保留的引用计数的字段。 这里其实有个隐藏的问题:并不是所有类型信息都是可以在编译期推理出来的,所以肯定也需要运行时的分派机制(runtime dispatch),这跟Java、C++语言都是一样的。我们本课程讲到面向对象语言的实现的时候,会提到这个知识点。 对PyPy实现机制的理解,可以参考这篇论文:PyPy’s Approach to Virtual Machine Constructionhttps://citeseerx.ist.psu.edu/viewdoc/download?doi=10.1.1.207.4675&rep=rep1&type=pdf 在学习了本课程多个编译器以后,你可以把不同编译器对比着来理解。对于Python语言而言,因为存在多个编译器,每个编译器的实现思路又迥然不同,所以就更有助于开拓思维。
2020-09-184 - 维李设论python也是万物皆对象?堆那里跟js有点儿像啊,比js的能力更多了,是不是解释性脚本语言都是这个特点?
作者回复: 解释型的语言是一个很宽泛的划分,其实都是解释性的语言的话,其实现机制也会有很大的不同。 首先,解释型语言并不是不编译,它其实也有一个编译过程,就像CPython会编译成字节码。 但每种语言的编译程度可能会不同。比如,同样是Python语言的编译器,PyPy就会进行类型推理,从而得到执行符合该数据类型的动作,并避免或减少在解释执行时才去查询对象的类型。这样的话,对象的内存结构也会有不同的设计。
2020-08-221 - coconut你可以注意到,我在图 1 中标出了每个字段所占内存的大小,总共是 28 个字节 这里没看懂,图上标的不是32个字节么?
作者回复: 非常感谢,你挑出了一个内容不一致的地方。 这里ob_digit应该是4个字节的32位整数的数组。
2021-01-14 - 飞翔python编译过程中会调到python的代码,pgen用来生成c语言的代码,那这个原始的Python编译器是用什么实现的?也就是第一个的Python编译器是怎么出来的?2020-07-171