12.0 序 函数是任何一门编程语言都具备的基本元素,它可以将多个动作组合起来,一个函数代表了一系列的动作.当然在调用函数时,会干什么来着.对,要在运行时栈中创建栈帧,用于函数的执行. 在python中,PyFrameObject对象就是一个对栈帧的模拟,所以我们即将也会看到,python虚拟机在执行函数调用时会动态地创建新的PyFrameObject对象.随着函数调用链的增长,这些PyFrameObject对象之间也会形成一条PyFrameObject对象链,这条链就是对象x86平台上运行时栈…
9.0 序 下面我们就来剖析python运行字节码的原理,我们知道python虚拟机是python的核心,在源代码被编译成字节码序列之后,就将有python的虚拟机接手整个工作.python虚拟机会从编译得到的PyCodeObject对象中一次读取每一条字节码指令,并在当前的上下文中去执行,最终执行完所有的字节码. 9.1 python虚拟机的执行环境 python的虚拟机实际上是在模拟操作系统运行可执行文件的过程,我们先来看看在一台普通的x86的机器上,可执行文件是以什么方式运行的.在这里主要…
本系列是以陈儒先生的<python源码剖析>为学习素材,所记录的学习内容.不同的是陈儒先生的<python源码剖析>所剖析的是python2.5,本系列对应的是python3.7,所以某些地方会和原著有出入,另外我在介绍的过程中会穿插大量的python代码,不仅仅是介绍如何实现的,还会使用python实际地对我们的结论进行演示.下面就开始吧.不过在开始分析python的实现之前,我们有很多的准备工作要做.比如,首先应该了解一下python的整体架构,来对python的实现有一个宏观…
13.0 序 这一章我们就来看看python中类是怎么实现的,我们知道C不是一个面向对象语言,而python却是一个面向对象的语言,那么在python的底层,是如何使用C来支持python实现面向对象的功能呢?带着这些疑问,我们下面开始剖析python中类的实现机制.另外,在python2中存在着经典类(classic class)和新式类(new style class),但是到Python3中,经典类已经消失了.并且python2官网都快不维护了,因此我们这一章只会介绍新式类. 13.1 p…
11.0 序 在上一章中,我们剖析了python虚拟机中的一般表达式的实现.在剖析一遍表达式是我们的流程都是从上往下顺序执行的,在执行的过程中没有任何变化.但是显然这是不够的,因为怎么能没有流程控制呢.下面我们来看看python所提供的流程控制手段,其中也包括异常检测机制. 11.1 python虚拟机中的if控制流 11.1.1 if字节码 if算是最简单也是最常用的控制流语句,我们看看它的字节码是怎么样的呢? a = 1 if a > 10: print("a > 10"…
8.0 序 我们日常会写各种各样的python脚本,在运行的时候只需要输入python xxx.py程序就执行了.那么问题就来了,一个py文件是如何被python变成一系列的机器指令并执行的呢? 8.1 python程序的执行过程 python的执行原理可以用两个词来囊括:虚拟机.字节码 首先在python中有一个非常关键的东西,这个东西被称为解释器(interpreter),当我们在命令行中输入python时,就是为了激活这个解释器.当然如果后面还跟上了py文件,那么解释器会立刻被激活,然后执…
1.0 序 对象是python中最核心的一个概念,在python的世界中,一切都是对象,整数.字符串.甚至类型.整数类型.字符串类型,都是对象.换句话说,python中面向对象的理念观测的非常彻底,面向对象理论中的"类"和"对象"在python中都是通过某个对象实现的. 在python中,已经预先定义了一些类型对象,比如int类型.str类型.dict类型等,这些我们称之为内建类型对象,这些类型对象实现了面向对象中"类"的概念:这些内建对象实例化…
10.0 序 上一章中,我们通过PyEval_EvalFrameEx看到了python虚拟机的整体框架,那么这一章我们将深入到PyEval_EvalFrameEx的各个细节当中,深入剖析python的虚拟机,在本章中我们将剖析python虚拟机是如何完成对一般表达式的执行的.这里的一般表达式包括最基本的对象创建语句.打印语句等等.至于if.while等表达式,我们将其归类于控制流语句,对于python中控制流的剖析,我们将留到下一章. 10.1 简单内建对象的创建 # a.py i = 1 s…
7.0 序 集合和字典一样,都是性能非常高效的数据结构,性能高效的原因就在于底层使用了哈希表.因此集合和字典的原理本质上是一样的,都是把值映射成索引,通过索引去查找. 7.1 PySetObject 哈希表我们在字典那一章已经介绍过了,因此直接看set在cpython中的实现. //python中的集合的每一个元素,是通过setentry这个结构体来存储的 typedef struct { PyObject *key; // 元素的指针 Py_hash_t hash; // 元素的哈希值 } s…
4.0 序 python中的list对象,底层对应的则是PyListObject.如果你熟悉C++,那么会很容易和C++中的list联系起来.但实际上,这个C++中的list大相径庭,反而和STL中的vector比较类似 4.1 PyListObject对象 我们知道python里面的list对象是支持对元素进行增删改查等操作的,list对象里面存储的,底层无一例外都是PyObject * 指针.所以实际上我们可以这样看待python底层的PyListObject:vector<PyObject…