[ 绝对原创,谢绝转载]
注意 :第一部分Python总体架构采用了网络文档《The Architecture of Python》,这是网络上唯一可见的以剖析Python实现为己任的文档。可惜是作为一门课程的作业的结果,太简略了,有点“食之无味,弃之可惜”的感觉。这里借用其介绍Python总体架构的部分,比较简略,以后我会再充实。
Python源码剖析
——编译Python
本文作者: Robert Chen(search.pythoner@gmail.com)
1. Python总体架构
在最高的层次上,Python的整体架构可以分为四个主要的部分,整个架构如图1所示。在左边,是Python提供的大量的模块,库以及用户自定义的模块。比如在执行import os时,这个os就是Python内建的模块,当然用户还可以通过自定义模块来扩展Python系统。在本系列文章中,我们不会对这一部分进行过多的考察。
在图的右边,是Python的运行时环境,包括对象/类型系统(Object/Type structures),内存分配器(Memory Allocator)和运行时状态(Current State of Python)。运行时状态维护了解释器在执行字节码时在不同的状态之间切换的动作,我们可以将它视为一个巨大而复杂的有穷状态机。内存分配器则全权负责Python中创建对象时对内存的申请工作,实际上它就是Python运行时与C中malloc的一层接口。而对象/类型系统则包含了Python中存在的各种内建对象,比如整数,list和dict等等
在中间的部分,可以看到Python的核心,解释器(interpreter)。在解释器中,箭头的方向指示了Python运行时的数据流方向。其中Scanner对应词法分析,将文件输入的Python源代码或从命令行输入的一行行Python代码切分为一个一个的token;Parser对应语法分析部分,在Scanner的分析结果上进行语法分析,建立抽象语法树(AST);Compiler是根据建立的AST生成指令集合——Python字节码(byte code),就像Java编译器和C#编译器所做的那样;最后由Code Evaluator来解释并执行这些字节码。因此,Code Evaluator又可以被称为执行引擎。
图中,在Interpreter与右边的对象/类型系统,内存分配器之间的箭头表示“使用”关系;而与运行时状态之间的箭头表示修改关系,即Python在执行的过程中会不断地修改当前解释器所处的状态,在不同的状态之间切换。
2. Python源代码的组织
中国有句老话,巧妇难为无米之炊。要分析Python源码,首先当然要获得Python源码。Python源码可以从Python的官方网站http://www.python.org自由下载。当前Python的最新版本是2.4.2,在本书中,我采用的是Python2.4.1:
|
|
下载了Python的源代码压缩包并解压后,可以看到如图3所示的目录结构。 Include :该目录下包含了Python提供的所有头文件,如果用户需要自己用C或C++来编写自定义模块扩展Python,那么就需要用到这里提供的头文件。 Lib :该目录包含了Python自带的所有标准库,Lib中的库都是用Python语言编写的。 Modules :该文件夹中包含了所有用C语言编写的模块,比如ramdom,cStringIO等,Modules中的模块是那些对速度要求非常严格的模块。而有一些对速度没有太严格要求的模块,比如os,就是用Python编写,并且放在Lib目录下。 Parser :Parser目录中包含了Python解释器中的Scanner和Parser部分,即对Python源代码进行词法分析和语法分析的部分。除了这些,Parser目录下还包含了一些有用的工具,这些工具能够根据Python语言的语法自动生成Python语言的词法和语法分析器,与YACC非常类似。 Objects :该目录中包含了所有Python的内建对象,包括整数,list,dict等;同时,该目录还包括了Python在运行时需要的所有的内部使用对象的实现 Python :该目录下包含了Python解释器中的Compiler和执行引擎部分,是Python运行的核心所在。 PCBuild :包含了Visual Studio 2003工程文件,研究Python源代码就从这里开始。 |
3. 编译Python
好了,下载了Python的源代码之后,我们就可以走出剖析Python源码的第一步——编译Python——了:)
Python2.4.1是在Visual Studio 2003环境下开发的,在PCBuild目录下可以看到VS2003的工程文件,打开工程后,还需要进行一些设置,才能成功编译。
首先,我们需要激活VS2003的配置对话框:
在配置对话框中,首先要做的就是更改Startup Project,Python2.4.1中默认设置的是_bsddb,我们需要将其改为Python。
由于我们剖析的只是Python的核心部分,不会涉及到工程中的一些标准库和其他的模块,所以我们需要将它们从编译的列表中删除。点击配置对话框左边列表框中的“Configuration Properties”后,会出现当前配置为需要编译的子工程,取消多余的子工程的选中状态,只保留pythoncore和python的选中状态。
需要进行的改动就是这么多了,但是完成这些改动后,如果马上开始编译,那么编译还是会失败:
原因是我们还需要一个pythonnt_rc_d.h,这个文件在Python2.4.1的源码包中没有提供,必须要通过一个编译make_versioninfo子工程才能自动生成:
好了,现在再编译,一切都会顺利完成了。
恭喜大作出炉!
挑个骨头:
"""
Python2.4.1是在Visual Studio 2003环境下开发的
"""
应该说是官方预编译的Windows二进制版本是用Visual C++ 2003编译的。似乎听说过guido用的是MacOS
Qiangning Hong —— 2005年12月20日 @2:40 pm
敬请共同关注Robert Chen的大作《Python源码剖析》!
引用自CPUG邮件列表:
From: "Robert" <sea …@gmail.com>
To: "CPUG.org" <cpug @googlegroups.com>
import time
class A:
def show(self):
…
hongqn.log —— 2005年12月20日 @3:12 pm
呵呵我坦白,这点我还真不太清楚,不过看PCBuild下有完整的VS工程,就这么以为了。
呵呵待以后弄明白了再更正过来,现在不敢再动这个blog中已经发表的文章了,似乎再次编辑保存后格式就会变得惨不忍睹 :)
Robert —— 2005年12月20日 @3:30 pm
不知道Robert有没有兴趣在《程序员》上发表这个系列的文章?这么优秀的作品应该让更多的人读到。
好吧,我承认,我很冒昧的向《程序员》的编辑推荐了您的文章,无论如何,先道个歉,希望您不要此感到不快:)。
ccat —— 2005年12月21日 @10:56 am
To ccat:
呵呵兄台太客气了,小弟我真的是非常感激呢。其实当初写这些东西,一来是因为兴趣,二来也是想最后能写成这么一本书的。如果可能的话,我是当然非常希望能在《程序员》上发表这个系列的文章的,这样也许能对宣传Python起到一定的作用:)
其实现在写的也是一个比较不成熟的版本,随着剖析的深入,肯定有一些需要改动。 如果《程序员》对这个系列感兴趣,我会花更多的时间来完成这个工作 :)不过他们暂时还没和我联系,所以我会继续在这里开放后续的章节。
呵呵,无论能不能发表,都非常感谢兄台的推荐,希望兄台多多关注俺的blog,一起讨论,共同进步 :)
Robert —— 2005年12月21日 @1:33 pm
如果有国内的刊物可以发表的话真是太好了。只要有机会就要宣传啊。希望早日能登出来。
limodou —— 2005年12月21日 @9:33 pm
终于找到有解释python内部机制的文章了,太谢谢作者了,厉害!!
Jayven —— 2005年12月27日 @1:22 pm
如何在vs2005中编译python2.4.2?
3ks
py —— 2005年12月27日 @6:02 pm
呵呵非常抱歉,我手里没有VS2005,所以不能给你提供有用的意见。可以仔细看一看Python源码包中的指导编译的文档,可能会有帮助,还有就是google一下,看看别人又没有做过这些工作 :)
Robert —— 2005年12月27日 @11:56 pm
谢谢你Robert
py —— 2005年12月28日 @3:10 pm
我没有vs2003,你可以down一个VC++2005 express
py —— 2005年12月28日 @3:15 pm
非常抱歉,呵呵这几天因为工作关系,硬盘没有什么空闲了,我看MS上说这个东西要1个G呢。等过了这一段,我下载来试试 :)
这里有个关于VC++2005编译Python的讨论,也许对你有帮助:
http://www.mail-archive.com/python-dev@python.org/msg07869.html
Robert —— 2005年12月31日 @12:27 pm
非常感谢!
py —— 2005年12月31日 @1:56 pm
支持一下!
worldguy —— 2006年01月06日 @10:43 am
发现py的好文章啦!!Python源码剖析[1] —— 编译PythonPython源码剖析[2] —— 对象机制
Python —— 2006年03月10日 @1:38 pm
我建了个QQ群:23616814
讨论Python源代码相关
thanksgiving —— 2006年07月11日 @3:27 am
怎么用vs阿,感觉不够pythonic.
囧匡 —— 2008年06月29日 @9:13 pm
http://www.china-pub.com/39994
这本书讲源码的,可以读一读
hulei —— 2008年07月14日 @10:36 am