Python源码剖析-深度探索动态语言核心技术
内容简介
为了更好地利用python语言,无论是python本身还是和C/C++配合使用,深刻理解python的运行原理都是非常重要的,本文以CPython源码为研究对象,深入剖析Python的实现。主要包含:
- Python内建对象
- Python虚拟机
- Python高级特性
本文参考: Python源码剖析一书
学习建议:唯有亲身尝试,才能深解其中三昧。 在真实的源码和文章的描述相比较揣摩,动手捣鼓捣鼓Python的源码,用真实的输出来验证文章描述和自己的理解。
Python 总体架构
首先我们应该了解python的整体架构,对python 有个宏观的认识。
Python整体架构分为三部分,如下图:
- 左边是python提供的大量模块,库,以及用户自定义模块
- 右边是python的运行时环境,包括对象/类型系统, 内存分配器, 运行时状态信息。
- 中间部分为解释器(虚拟机), 包括词法分析,语法分析,编译器与 (虚拟机Code Evauator)
Python源代码的组织
获取源码网站: 源码网站
解压后我们将看到目录结构:
- Includes : 该目录包含了python提供的所有头文件,我们如果用c、c++编写自定义模块扩展python,就需要用到这里提供的头文件
- Lib:包含了python自带的所有标准库, lib 中的库都是用python编写而成
- Modules: 该模块包含了所有用C语言编写的模块, 比如random,cstringIO等,其中模块都是那些对速度要求非常严格的模块, (对速度没有严格要求的放在了lib中)
- Parser: 包含了python解释器中的词法分析Scanner和语法分析 Parser部分
- Objects: 改目录中包含了所有Python的内建对象,包括整数,list, dict等, 同时包含了Python在运行时需要的所有的内部使用对象的实现。
- Python:是Python解释器的 Compiler 和执行引擎部分,是其运行的核心所在。
第一部分:Python内建对象
第1章:Python对象初探
我们熟知在面向对象理论中的 “类” 和 “对象” 这两个概念在python中都是使用Python内对象来实现的,也可以理解为一切都是对象, 于是我们将会带着一些疑问进入本章~
- 对象在python内部是如何表示的? (在C的层面,是个什么模样)
- C不是一个面向对象的语言,那么python的对象机制又是如何实现的呢?
额外一些有意思的相关知识:
- 在Python中,对象是C中结构体在堆上申请的一块内存,因此对象不能被静态初始化,也不能在栈上生存,例外是(Python的类型对象type,都是被静态初始化的 ~)
- 在Python中,一个对象一旦被创建,其内存大小就是不变的了,于是python在对象内维护一个指向一块可变大小的内存区域的指针来容纳可变长度数据的对象,当然这也是因为遵循这样的规则是的通过指针维护对象的工作变得简单。(struct _typeobject *ob_type)
1.1 Python内的对象
1.1.1 对象的基石-----PyObject
所有的对象都拥有一些相同的内容, 这些内容就在PyObject中定义, PyObject是整个Python对象体系的核