[绝对原创 转载请注明出处]
Python源码剖析
——Small Python
本文作者: Robert Chen (search.pythoner@gmail.com )
1. Small Python
在详细考察了Python中最常用的几个对象之后,我们现在完全可以利用这些对象做出一个最简单的Python。这一章的目的就是模拟出一个最简单的Python——Small Python。
在Small Python中,我们首先需要实现之前已经分析过的那些对象,比如PyIntObject,与CPython不同的是,我们并没有实现象CPython那样复杂的机制,作为一个模拟程序,我们只实现了简单的功能,也没有引入对象缓冲池的机制。这一切都是为了简洁而清晰地展示出Python运行时的脉络。
在Small Python中,实际上还需要实现Python的运行时环境,Python的运行时环境是我们在以后的章节中将要剖析的重点。在这里只是展示了其核心的思想——利用PyDictObject对象来维护变量名到变量值的映射。
当然,在CPython中,还有许多其他的主题,比如Python源代码的编译,Python字节码的生成和执行等等,在Small Python中,我们都不会涉及,因为到目前为止,我们没有任何资本做出如此逼真的模拟。不过当我们完成这本书的探索之后,就完全有能力实现一个真正的Python了。
在Small Python中,我们仅仅实现了PyIntObject,PyStringObject以及PyDictObject对象,仅仅实现了加法运算和输出操作。同时编译的过程也被简化到了极致,因此我们的Small Python只能处理非常受限的表达式。虽然很简陋,但从中可以看到Python的骨架,同时,这也是我们深入Python解释器和运行时的起点。
2. 对象机制
在Small Python中,对象机制与CPython完全相同:
[PyObject]
#define PyObject_HEAD /
int refCount;/
struct tagPyTypeObject *type
#define PyObject_HEAD_INIT(typePtr)/
0, typePtr
typedef struct tagPyObject
{
PyObject_HEAD;
}PyObject;
但是对于类型对象,我们进行了大规模的删减。最终在类型对象中,只定义了加法操作,Hash操作以及输出操作:
[PyTypeObject]
//definition of PyTypeObject
typedef void (*PrintFun)(PyObject* object);
typedef PyObject* (*AddFun)(PyObject* left, PyObject* right);
typedef long (*HashFun)(PyObject* object);
typedef struct tagPyTypeObject
{
PyObject_HEAD;
char* name;
PrintFun print;
AddFun add;
HashFun hash;
}PyTypeObject;
PyIntObject的实现与CPython几乎是一样的,不过没有复杂的对象缓冲机制:
[PyIntObject]
typedef struct tagPyIntObject
{
PyObject_HEAD;
int value;
}PyIntObject;
PyObject* PyInt_Create(int value)
{
PyIntObject* object = new PyIntObject;
object->refCount = 1;
object->type = &PyInt_Type;
object->value = value;
return (PyObject*)object;
}
static void int_print(PyObject* object)
{
PyIntObject* intObject = (PyIntObject*)object;
printf("%d/n", intObject->value);
}
static PyObject* int_add(PyObject* left, PyObject* right)
{
PyIntObject* leftInt = (PyIntObject*)left;
PyIntObject* rightInt = (PyIntObject*)right;
PyIntObject* result = (PyIntObject*)PyInt_Create(0);
if(result == NULL)
{
printf("We have no enough memory!!"