为什么要看 Python 源码?它的结构长什么样子?

简介: 为什么要看 Python 源码?它的结构长什么样子?

楔子



毫无疑问,Python 已经成为当下最主流的语言之一,如果你只是会用,那么很难和其他人拉开差距。但如果你知道 Python 解释器的底层原理,比如:

  • 列表、字典、生成器等数据结构是怎么实现的;
  • GIL 如何限制多线程只能同时使用一个核;
  • 虚拟机是如何执行字节码的;
  • Python 的垃圾回收又是怎么一回事;
  • ······

那么你在面试的时候一定能让面试官眼前一亮,并且也能写出更好、更优雅的代码,这也是我们为什么要剖析 Python 解释器源码。可 Python 解释器的源码行数有五十多万行,该怎么入手呢?不用担心,本系列就来抽丝剥茧,带你近距离观察 Python 解释器这座宏伟大厦。

注:官方 Python 解释器由 C 语言编写,我们称之为 CPython。想要读懂它,需要有一定的 C 语言基础,当然我也会给出详细的注释。

本系列力求详细、精致,在介绍源码时会给出大量的注释和清晰的图表,并且我不仅仅会介绍源码实现,还会穿插大量的 Python 普通知识。因为 Python 解释器由 C 语言编写,想要读懂它,需要有一定的 C 语言基础。而本系列则确保,不管你 C 语言的水平如何,读了之后都能有所收获。


下载 CPython



接下来登录 Python 官网 www.python.org 下载 CPython。

6a2b8e5f440c0b27271bdcb2e8bce23e.jpg

目前 Python 的最新版本是 3.12.3,我们点击它。当然随着时间的推移,Python 也会进行更新。

a2069b29d7ca790572719764aa860fdc.jpg

再点击 Gzipped source tarball 即可下载指定版本的源码。


CPython 源码结构



压缩包下载下来之后解压,即可得到整个 CPython 工程项目,我们看看它长什么样子?

c94ab99094501682a4a5076aeada9b4d.jpg

解释一下每个目录的作用。

Doc 目录

存储 Python 文档的源文件(.rst),用于编译之后生成官方文档。

Grammar 目录

负责定义 Python 的语法规则。

Include 目录

包含 Python 所有公开的头文件,这些文件定义了 Python 的 C API,在编写扩展模块和嵌入式开发时会用到。

Lib 目录

Python 的标准库,对于那些不影响性能的功能会用 Python 编写,然后放在 Lib 目录下面。

Modules 目录

Python 的内置库,这些库都是用 C 编写的,编译之后会内嵌在解释器里面。我们举个例子:

import random, _random
import re, _sre
import io, _io
import ast, _ast

以 random 为例,它是用来生成随机数的,和性能密切相关。所以它的核心功能由 C 编写,编译之后内嵌在解释器里,模块名为 _random。只不过 Python 又封装了一个 random,在内部会导入 _random,像 re 和 _sre、asyncio 和 _asyncio 都是类似的关系。

Modules 目录里面实现了大量和性能相关的模块,比如 sys、time、gc 等等,我们后续再聊。

Objects 目录

包含 Python 内置数据结构的底层实现,像字典、列表、元组、函数等,底层实现都定义在 Objects 目录中。

Parser 目录

负责 Python 编译器的具体实现,虽然 Python 是解释型语言,但也是要经过编译的。编译的结果为 PyCodeObject 对象,它里面包含了要执行的字节码,编译完之后会交给虚拟机执行。

所以 Python 解释器 = Python 编译器 + Python 虚拟机。

Python 目录

Python 虚拟机的具体实现,字节码的执行、执行环境的管理等都在里面。

Mac 目录

用于 Mac OS X 平台的特定工具和脚本。

Misc 目录

包含各种杂项文件,如配置脚本、工具等。

PC 目录

专为 Windows 平台编写的配置文件和特定扩展。

PCbuild 目录

用于在 Windows 上编译 Python 的项目文件。

Programs 目录

包含 Python 其它可执行文件(如 IDLE)的源代码。

Tools 目录

包含用 Python 编写的各种脚本和工具,帮助开发和维护 Python。

以上就是 CPython 的源码结构,对它有一个基本的认识有助于我们后续的源码学习。


解释器、编译器、虚拟机



介绍源码结构时我们说 Python 解释器 = Python 编译器 + Python 虚拟机,那当解释器执行 py 文件时都经历了哪些过程呢?

435ff33c6adb1c12c31d572afd7d1f79.jpg

Read File、Scanner、Parser、Compiler 都是由 Python 编译器负责的,Code Eval 则由 Python 虚拟机负责。

因此 Python 虽然是解释型语言,但也有编译的过程。源代码会被编译器编译成 PyCodeObject 对象,然后再交给虚拟机来执行。而之所以要存在编译,是为了让虚拟机能更快速地执行,比如在编译阶段常量都会提前分配好,而且还可以尽早检测出语法上的错误。

而 Python 编译器和 Python 虚拟机组合起来,便是 Python 解释器。

0f9ce0ff5bffbbe4467828c9c38a417e.jpg

如果你了解 Java,那么应该知道 Java 也有编译器和虚拟机。只不过 Java 的编译器和虚拟机是分开的,而 Python 则是整合在一起的。

不过在后续介绍 Python 源码的时候,我们暂不涉及 Python 编译器的部分,也就是 Parser 目录里面的代码不做分析,因为涉及到编译原理。而且编译这一过程也不是 Python 语言独有的,任何一门编程语言、当然还有 SQL 都会涉及到编译。所以探究 Python 代码的编译过程没太大意义,我们的重点是 Python 代码的编译结果,以及虚拟机是如何执行的?

当然如果大家对编译过程感兴趣,我们后面也会介绍一下这方面的内容。举个例子,我们来替换掉 Python 的几个关键字。

00b20e07ab0ff13b15f81d99cfc41cd9.png

Python 源码的分词,语法解析等均由 Parser 目录负责

b35c8e2bc05b98bcba6e3abc9420f54b.png

比如 tokenizer.c 负责分词,parser.c 负责语法解析,感兴趣可以看一下,但不建议花太多时间。因为这个过程对深入 Python 没多大用,并且 parser.c 的代码行数多达 4w 多行,读起来也很痛苦。

如果真的对这方面感兴趣,可以后台私信我,有机会我来聊一聊这方面的内容,顺便带大家手搓一个简易版的木兰出来。对,就是之前那个很火的国产编程语言。但目前的话,我们还是把重心放在 Python 代码的编译结果以及虚拟机的执行上面。


小结



本文就说到这里,赶快下载 Python 3.12 源码,来和我一起学习 Python 吧。

相关文章
|
3月前
|
机器学习/深度学习 监控 算法
基于mediapipe深度学习的手势数字识别系统python源码
本内容涵盖手势识别算法的相关资料,包括:1. 算法运行效果预览(无水印完整程序);2. 软件版本与配置环境说明,提供Python运行环境安装步骤;3. 部分核心代码,完整版含中文注释及操作视频;4. 算法理论概述,详解Mediapipe框架在手势识别中的应用。Mediapipe采用模块化设计,包含Calculator Graph、Packet和Subgraph等核心组件,支持实时处理任务,广泛应用于虚拟现实、智能监控等领域。
|
6月前
|
前端开发 JavaScript 关系型数据库
基于Python+Vue开发的商城管理系统源码+运行步骤
基于Python+Vue开发的商城管理系统(前后端分离),这是一项为大学生课程设计作业而开发的项目。该系统旨在帮助大学生学习并掌握Python编程技能,同时锻炼他们的项目设计与开发能力。通过学习基于Python的网上商城管理系统项目,大学生可以在实践中学习和提升自己的能力,为以后的职业发展打下坚实基础。
187 7
|
2月前
|
算法 数据可视化 数据挖掘
基于EM期望最大化算法的GMM参数估计与三维数据分类系统python源码
本内容展示了基于EM算法的高斯混合模型(GMM)聚类实现,包含完整Python代码、运行效果图及理论解析。程序使用三维数据进行演示,涵盖误差计算、模型参数更新、结果可视化等关键步骤,并附有详细注释与操作视频,适合学习EM算法与GMM模型的原理及应用。
|
2月前
|
API 数据安全/隐私保护 开发者
企业微信自动加好友软件,导入手机号批量添加微信好友,python版本源码分享
代码展示了企业微信官方API的合规使用方式,包括获取access_token、查询部门列表和创建用户等功能
|
2月前
|
机器人 API 数据安全/隐私保护
QQ机器人插件源码,自动回复聊天机器人,python源码分享
消息接收处理:通过Flask搭建HTTP服务接收go-cqhttp推送的QQ消息47 智能回复逻辑
|
5月前
|
前端开发 JavaScript 关系型数据库
基于python的租房网站-房屋出租租赁系统(python+django+vue)源码+运行
该项目是基于python/django/vue开发的房屋租赁系统/租房平台,作为本学期的课程作业作品。欢迎大家提出宝贵建议。
156 6
|
5月前
|
前端开发 JavaScript 关系型数据库
基于Python+Vue开发的美容预约管理系统源码+运行
基于Python+Vue开发的美容预约管理系统(前后端分离),这是一项为大学生课程设计作业而开发的项目。该系统旨在帮助大学生学习并掌握Python编程技能,同时锻炼他们的项目设计与开发能力。通过学习基于Python的美容诊所预约管理系统项目,大学生可以在实践中学习和提升自己的能力,为以后的职业发展打下坚实基础。
86 9
|
5月前
|
JavaScript 前端开发 关系型数据库
基于Python+Vue开发的体育场馆预约管理系统源码+运行
本项目为大学生课程设计作业,采用Python和Vue技术构建了一个体育场馆预约管理系统(实现前后端分离)。系统的主要目标在于帮助学生理解和掌握Python编程知识,同时培养其项目规划和开发能力。参与该项目的学习过程,学生能够在实际操作中锻炼技能,为未来的职业发展奠定良好的基础。
127 3
|
5月前
|
前端开发 JavaScript 关系型数据库
基于Python+Vue开发的摄影网上预约管理系统源码+运行
基于Python+Vue开发的摄影网上预约管理系统(前后端分离),影楼婚纱摄影,这是一项为大学生课程设计作业而开发的项目。该系统旨在帮助大学生学习并掌握Python编程技能,同时锻炼他们的项目设计与开发能力。通过学习基于Python的在线摄影预约管理系统项目,大学生可以在实践中学习和提升自己的能力,为以后的职业发展打下坚实基础。
88 8
|
5月前
|
前端开发 JavaScript 关系型数据库
基于Python+Vue开发的民宿客房预订管理系统源码运行
基于Python+Vue开发的民宿客房预订管理系统(前后端分离),这是一项为大学生课程设计作业而开发的项目。该系统旨在帮助大学生学习并掌握Python编程技能,同时锻炼他们的项目设计与开发能力。通过学习基于Python的民宿客房预订管理系统项目,大学生可以在实践中学习和提升自己的能力,为以后的职业发展打下坚实基础。
137 8

推荐镜像

更多