small-python的构建过程与总结

small python 功能如下:

  1. 实现加、减、hash运算;
  2. 实现打印功能;
  3. 实现字符串解释执行动作,不作语法检查。

实现情况:变量名为单字符的加/赋值/hash/打印操作,作简单的语法检查。

除了python中各个基本数据类型的缓冲机制与内存优化机制外:基本上把前面学习的基本思想实践了一把。没有实现的缓冲机制如下:

  • INT类型:小整数池
  • String类型:同内容串共用原则(intern机制)
  • List类型:List池与空间动态调整
  • Dict类型:small区域与hash空间动态调整

small-python本质是将面向对象中的多态思想实践了一把,那我们就来看看如何用C来实现多态思想,尝试从编程语言层面理解面向对象语言;与此同时,简单地将python运行原理小小地实践了一把。下面分两层来总结这次学习过程:多态与运行时原理

多态思想

多态,顾名思义,行为依据数据类型的变化而变化 。比如加法操作,接口一致,但我给接口两个整数类型,它会进行整数加法操作;你授给接口两个字符串,那么它会进行字符 串的‘加法操作’(拼接操作)。那么如何用面向过程的C语言实现这咱逻辑呢?

首先,要解决的就是接口的一致性,即需要设计出各种类型对外一致的接口,无论什么数据类型,这个接口都能接受。如何做到这一点呢?强制类型转换,即外部接口授受最基本的数据类型,比如void*,在内部根据分析传进的数据类型,将void*强制类型转换为对应的数据类型的指针,如int*。说起来挺简单滴,看见上面标红的“ 分析”了没,你凭什么分析呢?再说,退一万步讲,即便你分析出来了数据类型,那么如何调用相应的方法呢,难不成弄一堆case,貌似case的方法还只能对于确定的数据类型有效,一旦后面用户自己生成了特有的数据类型,就傻眼了!所以,一句话,数据自身携带着数据类型的信息及其类型对应的外部接口,这样就有效地解决了case带来的灾难了。这样一来,分析也就不用愁难为无米之炊了,因为数据自身携带有数据类型信息,一定记住加粗这句话背后的含义:可以根据数据,顺藤摸瓜到对应该数据的行为处理接口。好了,总体思路明确后,就是设计实现的问题了。首先,很明确的是,数据类型必须成为一种实体,而不单单是数据的一种属性,而且这个实体内部还必须有对应的行为接口。然后,各个类型数据,都有携带其对应的类型实体。越来越明显了,C中的结构体与指针技术结合可以实现这个想法。具体实现细节见small-python中object.h代码。

运行时原理

上面那套python的基础设施搭建好之后,运行时环境的支撑相对就容易多了。python使用自身的Dict数据类型作为解释运行的索引设施,即运行环境中的变量名作为Dict中的Key,其对应的的数据作为Dict中的Value。这也就可以解释python中的global与local这两个Dict数据了。Python经过语法分析后,最后归类就是对某个数据执行某个动作:

  1. 某个值:意味着检索,由Dict完成
  2. 某个动作:意味着对应数据的行为,由上面已经介绍的多态完成

发表评论