Differences between revisions 2 and 3
Revision 2 as of 2005-12-20 06:53:28
Size: 4061
Editor: ZoomQuiet
Comment:
Revision 3 as of 2005-12-20 06:56:48
Size: 4015
Editor: ZoomQuiet
Comment:
Deletions are marked like this. Additions are marked like this.
Line 4: Line 4:
Python总体架构 === Python总体架构 ===
Line 6: Line 6:
在最高的层次上,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在执行的过程中会不断地修改当前解释器所处的状态,在不同的状态之间切换。
 * 在最高的层次上,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在执行的过程中会不断地修改当前解释器所处的状态,在不同的状态之间切换。
Line 23: Line 14:
2. Python源代码的组织 === Python源代码的组织 ===
Line 25: Line 16:
中国有句老话,巧妇难为无米之炊。要分析Python源码,首先当然要获得Python源码。Python源码可以从Python的官方网站http://www.python.org自由下载。当前Python的最新版本是2.4.2,在本书中,我采用的是Python2.4.1:

      
 * 中国有句老话,巧妇难为无米之炊。要分析Python源码,首先当然要获得Python源码。Python源码可以从Python的官方网站http://www.python.org自由下载。当前Python的最新版本是2.4.2,在本书中,我采用的是Python2.4.1:
Line 33: Line 20:
3. 编译Python
Line 35: Line 21:
好了,下载了Python的源代码之后,我们就可以走出剖析Python源码的第一步——编译Python——了:) === 编译Python ===
Line 37: Line 23:
     * 好了,下载了Python的源代码之后,我们就可以走出剖析Python源码的第一步——编译Python——了:)
 * Python2.4.1是在Visual Studio 2003环境下开发的,在PCBuild目录下可以看到VS2003的工程文件,打开工程后,还需要进行一些设置,才能成功编译。
 * 首先,我们需要激活VS2003的配置对话框:
 * 在配置对话框中,首先要做的就是更改Startup Project,Python2.4.1中默认设置的是_bsddb,我们需要将其改为Python。
 * 由于我们剖析的只是Python的核心部分,不会涉及到工程中的一些标准库和其他的模块,所以我们需要将它们从编译的列表中删除。点击配置对话框左边列表框中的“Configuration Properties”后,会出现当前配置为需要编译的子工程,取消多余的子工程的选中状态,只保留pythoncore和python的选中状态。
 * 需要进行的改动就是这么多了,但是完成这些改动后,如果马上开始编译,那么编译还是会失败:
Line 39: Line 30:
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子工程才能自动生成:

               
 * 原因是我们还需要一个pythonnt_rc_d.h,这个文件在Python2.4.1的源码包中没有提供,必须要通过一个编译make_versioninfo子工程才能自动生成:
            

2005-12-17 Python源码剖析.1

本文作者: [http://blog.donews.com/lemur/archive/2005/12/17/660973.aspx Robert Chen]([email protected])

编译Python

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在执行的过程中会不断地修改当前解释器所处的状态,在不同的状态之间切换。

Python源代码的组织

  • 中国有句老话,巧妇难为无米之炊。要分析Python源码,首先当然要获得Python源码。Python源码可以从Python的官方网站http://www.python.org自由下载。当前Python的最新版本是2.4.2,在本书中,我采用的是Python2.4.1:

下载了Python的源代码压缩包并解压后,可以看到如图3所示的目录结构。

attachment:PySrcStructure.gif

Include(PySrcStructure)

编译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子工程才能自动生成:

好了,现在再编译,一切都会顺利完成了。

PySourceCode/2005-12-17 (last edited 2009-12-25 07:12:46 by localhost)