目 录
论文总页数:24页
1 引言 1
1.1 课题背景 1
1.2 研究意义 1
1.3 研究方法 1
2 Scheme语言 2
2.1 发展历史与现状 2
2.2 Scheme语言介绍 2
2.3 Scheme的特点 3
3 相关理论基础 3
4 解释程序的整体结构 3
4.1 词法分析器 4
4.2 类型系统 4
4.3 循环求值器 4
4.4 虚拟的寄存器机器 5
4.5 内存管理与垃圾回收 5
5 解释程序的实现 6
5.1 类型系统 6
5.2 词法分析 7
5.3 表达式求值的环境模型 7
5.3.1 环境模型 7
5.3.2 环境操作 9
5.3.3过程应用的环境模型 9
5.3.4 环境模型的实现 10
5.4 尾递归 11
5.5 虚拟的寄存器机器 13
5.5.1 寄存器 14
5.5.2 存储模型 15
5.5.3 基本表操作的实现 16
5.5.4 停止并复制垃圾回收算法 17
5.5.5 虚拟的寄存器机器的实现 18
5.6 表达式求值过程 18
6 测试结果 19
6.1 测试尾递归 19
6.2 测试正确性与效率 20
结 论 21
参考文献 22
致 谢 23
声 明 24
结 论
解释程序已经实现了基本的Scheme语言特征,并可以运行普通的Scheme程序。并且也实现了一些调试方法,如显示寄存器中的对象、某内存段中的对象等等,用来调试解释程序本身。通过实现该解释程序,我对Scheme语言以及C++和其它编程语言有了更深入的了解,对解释器和编译器的相关知识有了一定的理解和体会,通过学习SICP[3]我也对程序设计思想和本质有了比较深刻的认识,同时在程序编写过程中也锻炼了我的代码编写能力和代码管理能力。
在开发过程中也碰到过不少问题和困难。一个问题是在对Scheme表达式求值过程中发现错误而抛出异常后,栈中还有残留的内容,此时会将其清空,但是这里的内容是寄存器中的值,要能继续正确的对Scheme表达式求值,就需要将这些内容恢复到寄存器中。对这个问题设计了一个很好的解决办法,就是在每一次入栈操作中都记录入栈信息,在出栈时删除相应的入栈信息,在发生异常后,就可以根据这些入栈信息将栈中的内容恢复到原来的寄存器中,以便还原状态。
另外,在最初的设计中,是没有对过程调用的参数个数进行检查的,但后来发现在其它解释器中都有对参数个数的检查,如果参数不匹配会报错。于是在后期基本内置操作实现的基础上,加入了对参数个数的检查。由于内置操作是通过模板偏特化来实现的,因此定义了另一个模板类,并使用其偏特化来定义参数个数限制,并定义了一个模板函数来进行相应操作的参数检查。这样的设计利用了模板的特性,很好的与原有系统整合到了一起。
但该解释器的实现也是有很多不足的,比如程序执行效率低、整体设计结构不太合理等等,这说明仍然是有很大的改进空间的。在以后将整个解释器结构重新设计,以运行效率为主要目的,根据即将推出的R6RS标准文档来实现,开发出一个具体实用价值的Scheme解释程序。