CPython学研笔记
文章平均质量分 64
学习、研究Python虚拟机的C实现。
jasonblog
这个作者很懒,什么都没留下…
展开
-
[笔记]Python虚拟机对函数的解释
demo.py:i = 1def f(): j = 2f()test.py:import dissource = open('./demo.py').read()co = compile(source, './demo.py', 'exec')print(co.co_name)dis.dis(co)print("\n")fCode = co.co_c原创 2012-03-10 01:47:55 · 2316 阅读 · 0 评论 -
[笔记]Python虚拟机对if语句的解释
demo.py代码如下:a = 1if a > 0: passelif a == 0: passelse: passtest.py代码如下:import dissource = open('./demo.py').read()co = compile(source, './demo.py', 'exec')dis.dis(co)输出结果如原创 2012-03-10 01:47:21 · 2188 阅读 · 0 评论 -
[笔记]Python虚拟机对创建基本内置对象的执行过程
同样的,有demo.py代码如下:i = 1s = "Python"d = {"1":1, "2":2}l = [2, 3]有test.py代码如下:import dissource = open('./demo.py').read()co = compile(source, './demo.py', 'exec')dis.dis(co)输出如下: 1原创 2012-03-10 01:46:40 · 2129 阅读 · 0 评论 -
[笔记]Python虚拟机如何执行“i = 1”
首先写一个demo.py,里面只有一句:i = 1接着写一个test.py,内容如下:import dissource = open('./demo.py').read()co = compile(source, './demo.py', 'exec')dis.dis(co)输出: 1 0 LOAD_CONST 0原创 2012-03-10 01:45:45 · 2575 阅读 · 0 评论 -
[笔记]Python虚拟机的运行时基本知识
首先应该了解程序的运行时刻环境,个人觉得龙书中文版第7章挺通俗易懂的。Python在这方面设计了PyFrameObject这个结构(对应于龙书中的“活动记录”)来维护运行时环境,并采用了“访问链”的思想(龙书中介绍了“访问链”和“显示表”)来解决不同作用域间变量的访问问题。不过在PyFrameObject中维护了3个成员,用来指向最经常使用的3个符号表,内置符号表、全局符号表、局部原创 2012-03-10 01:45:09 · 4851 阅读 · 0 评论 -
[笔记]PyCodeObject初探
在code.h中有PyCodeObject的定义:/* Bytecode object */typedef struct { PyObject_HEAD int co_argcount; /* #arguments, except *args */ int co_nlocals; /* #local variables */原创 2012-03-10 01:44:06 · 2538 阅读 · 0 评论 -
[笔记]PyDictObject的哈希算法和搜索过程
哈希函数如下:longPyObject_Hash(PyObject *v){ PyTypeObject *tp = v->ob_type; if (tp->tp_hash != NULL) return (*tp->tp_hash)(v); /* To keep to the general practice that inheriting原创 2012-03-10 01:42:54 · 1785 阅读 · 0 评论 -
[笔记]PyDictObject头文件阅读
dictobject.hPyDictObject是一种字典类型,从可哈希的对象映射到另一个对象。然后提到了在Objects目录下,有dictnotes.txt文件,关于字典的使用设计和优化。字典类实际上是维护了一张哈希表,而表项,entry or slot,有3种状态。1. Unused. me_key == me_value == NULL未使用状态,key原创 2012-03-10 01:37:58 · 1821 阅读 · 0 评论 -
[笔记]PyListObject对象
在listobject.h中,有如下定义和注释:typedef struct { PyObject_VAR_HEAD /* Vector of pointers to list elements. list[0] is ob_item[0], etc. */ PyObject **ob_item; /* ob_item contains space for原创 2012-03-10 01:36:58 · 2332 阅读 · 0 评论 -
[笔记]Python的字符串对象
PyStringObject定义在stringobject.h中,附有不少注释说明。1. PyStringObject实际上是一组字符,以'\0'结尾,且因为有只是长度的变量,所以也可以包含'\0'作为内容。2. PyStringObject是不可变对象,所以a = "hello"和a = "world"先后执行后,a指向的是不同的对象了。3. PyStringObject保存了has原创 2012-03-10 01:36:12 · 2390 阅读 · 0 评论 -
[笔记]Python的整数对象:PyIntObject
一般没有特指,参考的是Python 2.7.2的源码。在intobject.h的开头就有英文注释,对PyIntObject进行了一下简单介绍。原文如下:/*PyIntObject represents a (long) integer. This is an immutable object;an integer cannot change its value aft原创 2012-03-10 01:34:47 · 5265 阅读 · 1 评论 -
[笔记]Python对象基础
以前写在Evernote上的笔记。Python对象机制最基础的是PyObject和PyVarObject,而后者又仅仅是比前者多了一个变量而已。在object.h中有这两者的定义:typedef struct _object { PyObject_HEAD} PyObject;typedef struct { PyObject_VAR_HEAD} PyV原创 2012-03-10 01:32:18 · 1886 阅读 · 0 评论 -
Python虚拟机的初始化概览
今天想跟下Python虚拟机的启动,看看以调试模式跑起python_d.exe是怎么一个过程。1. d:\Python-2.7.2\Modules\python.c文件是main函数,直接调用Py_Main函数;2. 在Py_Main函数中,初始化函数为Py_Initialize();,而后者直接调用Py_InitializeEx(1);函数;3. 在Py_Initialize原创 2011-09-02 19:18:58 · 3554 阅读 · 0 评论 -
关于VS2008编译Python2.7
参考的是《Python源码剖析》,基本一样的操作。我选择的是Python-2.7.1.tar.bz2,然后使用VS2008进行编译。比较郁闷的是,现在浏览python.org,时不时都需要小翻一下。 Python 2.7.1目录下有PC和PCbuild两个目录,前者包含VC6、VS7.1和VS8三个目录,相应目录里面有适合不同IDE编译的项目。于是猜测PCbuild应该是包含适合VS2008的项目文件,查看一下该目录下的env.bat源码得到确认:接着用VS2008打开项目文件,默认的st原创 2010-11-29 10:42:00 · 6403 阅读 · 1 评论