首先啊,我只学过C. 其次,我只在大一的时候学过C. 最后,我更爱Rust.
但是我也很喜欢Python。 所以说,自虐吧, CPython源码阅读计划开启:
参考博客:https://www.cnblogs.com/traditional/p/13655426.html
我们可以import调用,但是在Python安装目录里面则是看不到的。像这种底层由C编写、内嵌在解释器里面的模块,以及那些无法使用文本打开的pyd文件,pycharm都会给你做一个抽象,并且把注释给你写好。
Python源码中的Modules目录,这个目录里面存放了大量使用C编写的模块,我们在编译完Python之后就,这些模块就内嵌在解释器里面了。而这些模块都是针对那些性能要求比较高的,而要求不高的则由Python编写,存放在Lib目录下。像我们平时调用random、collections、threading,其实它们背后会调用_random、_collections、_thread。再比如我们使用的re模块,真正用来做正则匹配的逻辑实际上位于 *Modules/_sre.c* 里面而跟编译器相关的一些头文件一般都在Include文件夹下面。核心代码在Include/internal下面的哪些头文件中定义了主要的数据结构,看了一天好不容易捋了捋文件的脉络,太不容易了呜呜呜。
先了解一些基本文件: Include/pytypedefs.h 等量定义了超级一部分的Python模块对象,新的Py打头的结构体优先考虑在这里面寻找
类:
首先看看Python对象的核心PyObject:
// 在pytyprdefs.h 文件中使用typeof做了等价定义,也就是Pyobjects与_object等价
typedef struct _object PyObject;
typedef struct _typeobject PyTypeObject;
//(Include/) object.h
struct _object {
_PyObject_HEAD_EXTRA // 这是一个宏定义的相当于Null或两个,两个(指向前面和后面) PyObject/self结构体的指针
Py_ssize_t ob_refcnt; // 垃圾回收机制的引用计数器,一个有符号整形
PyTypeObject *ob_type; // 类的类型定义
};
// 第一个参数宏的定义:
// 如果定义了说明之前使用过相同的类,参考https://blog.youkuaiyun.com/weixin_42511320/article/details/106037958
// 在Python中创建的所有类都会放进refchain的环(双向链表)中。在只有一个类或没有类的时候不需要前后指针,但是一旦由两个以上的类的时候就要用指针吧这些类连起来
//
#ifdef Py_TRACE_REFS
/* Define pointers to support a doubly-linked list of all live heap objects. */
#define _PyObject_HEAD_EXTRA \
// 定义两个指针,一个指向前一个定义的类,一个指向后一个定义的类(双向链表)
PyObject *_ob_next; \
PyObject *_ob_prev;

本文详细介绍了Python C扩展的源码结构,特别是PyObject和PyTypeObject结构体,探讨了引用计数、类型定义以及C编写的性能关键模块。通过阅读_CPython源码,了解Python内部如何处理对象和类型,包括内存管理、方法实现等核心概念。
最低0.47元/天 解锁文章
1234

被折叠的 条评论
为什么被折叠?



