1、语言编译系统初探,计算机系01本陈海东2004年2月,概述,该系统是一个简易的32位语言编译系统,可以实现语言程序从编辑修改、编译到连接、运行等一系列过程。能够工作在Windows的各个版本下。必须声明的是:在设计实现这个系统的时候我并未正式接触过编译原理,因此难免会有很多贻笑大方之处,主要构成模块,编译程序汇编程序连接程序运行库及启动代码工程管理程序集成开发环境,系统流程,源代码,编译,汇编代码,汇编,目标代码,源代码,编译,汇编代码,汇编,目标代码,源代码,编译,汇编代码,汇编,目标代码,源代码,编译,汇编代码,汇编,目标代码,运行库,连接,可执行文件,编译程序,汇编程序,连接程序,编译程
2、序,编译器是系统的核心部分,用纯面向对象的方法设计,是技术上最难实现的部分。由于本项目的目标只是做编译器的尝试且为了调试方便,因此并未使用低级语言而是采用Visual C+ 6.0来实现。编译器以普通的源代码文件为输入,以32位x86汇编语言代码文件为输出。该编译器实现了一些简单的优化。如常值表达式的化简等。,目标代码输出,词法分析解释预处理指令,源程序,编译流程,类型/声明分析,语句分析,表达式分析,函数体分析,代码生成,Token流,类型表,变量表,函数表,常量表,错误表,错误信息输出,目标代码,错误信息,引用信息,词法分析将源程序分解为按语言规定的保留字、标识符、数字、符号、字符串等,并
3、处理预编译指令。代码生成进行将输入的单词归约为诸如声明、定义、语句、表达式等实体的尝试,并登记到各相关表中,如果归约失败还将记录出错信息。整个过程采用递归的方式进行逐级的分析。类型表记录由typedef所定义的类型。函数表直接记录目标代码。该编译程序不产生中间代码。常量表记录字符串、浮点常数等无法由x86立即数寻址方式引用的常量。类型表和变量表采用栈结构,这是为了方便表示非全局的类型和变量。引用信息记录了源程序所有引用过的源文件,这些信息将用于工程管理。,简单数值类型,与标准之间语法的差异,函数调用前必须声明。函数、外部变量的声明不能省略基本类型标识。函数参数表如果为空则表示无任何参数。局部变
4、量的定义无须全部写在语句体的开头部分。可以使用+风格的单行注释。,汇编程序连接程序,这两个部分不是我做的,我只是采用了Borland的TASM和TLINK来充当这两个角色。此外为了生成能够脱离Win32环境的程序,该系统最后还将为目标程序安装一个32位DPMI扩展器,使得程序即使部署在纯DOS环境下依然能够进入处理器保护模式并能访问全部4GB的地址空间。,运行库及启动代码,运行库包括了很多常用的标准库函数,并全部由该编译系统编译生成。启动代码由纯汇编语言编写,包含目标程序启动时所需的与运行环境相关的初始化代码及基础支持代码(如截获系统中断、高精度计时、64位长整数乘除运算支持等)。,工程管理程
5、序(MAKE),这个模块是由该编译系统实现的。它能够逐个检查工程内的每个模块的修改时间,对上次编译后又修改过的模块或新加入的模块进行编译、汇编,最后根据需要进行连接。整个过程都是自动完成的,这使得建造工程变得简单了许多,同时也为我后来的开发工作提供了很大的方便。,集成开发环境(IDE),同样是由该编译系统实现,并利用了前面提到的工程管理程序。这是整个系统的主要界面,集成了系统几乎所有的功能。由于语言不直接支持面向对象的程序设计,因此我引用了Windows API中的消息传递机制来模拟面向对象的机制。,结束语,这个“初探”的系统已经有一定的实用价值了。源程序附有我以前在Turbo C 2.0上写的一个图形演示程序,在这个系统上运行几乎未作什么修改。与TC的版本比较,在该系统上的版本能够并发更多的特效(主要得益于32位的代码并突破了实模式下640KB的内存限制),且由于对高精度计时的支持使得程序运行速率能够更加精确地控制。加上前面的MAKE程序和IDE,都使整个系统经受了一定的能力上和稳定性上的考验。,然而,这个系统毕竟还只处于实验阶段,仍有许多不足之处,很多功能也还不完善。最大的遗憾就是由于时间仓促没能完成Debug模块和帮助子系统,以后一有时间我会补完的。,