Python源码剖析[15] —— 最简单的Python实现:Small Python

本文介绍了Small Python,一个简化版的Python实现,主要用于理解Python的运行时环境和对象机制。Small Python实现了PyIntObject、PyStringObject和PyDictObject,支持基本的加法运算和输出操作。它通过PyDictObject维护变量名到变量值的映射,解释过程通过字符串搜索和简单的if...else结构完成。此外,文章还提到了交互式环境的实现。
摘要由CSDN通过智能技术生成

[绝对原创 转载请注明出处]

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中,我们仅仅实现了PyIntObjectPyStringObject以及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!!"

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值