付立平,赵彩虹
(黑龙江大学 计算机科学技术学院,黑龙江哈尔滨 150080)
编译原理课程是计算机专业中一门重要的专业理论课,是一门理论性和实践性都很强的课程。编译原理课程是专门介绍如何将高级语言翻译成低级语言的编译程序的工作原理与方法的课程。编译原理作为一门比较难理解的课程,一直作为计算机科学与技术专业的必修课程,因为作为承接计算机硬件与软件的关键技术,对编译原理课程的学习可以使学生加深对计算机的理解。因此,进一步深入探讨编译原理课程教学改革和实践方法是非常有意义的。
课程中涉及许多理论知识,如形式语言与自动机、文法、语法制导等理论,这些理论抽象不好理解,学生学习过程中有很大的难度。编译原理课程的重点是词法分析和语法分析,这两个部分的学习主要以理论为主。在教学过程中,对大量编译理论进行教学,会使学生产生错觉,认为编译是一门理论课的学习,会做题就能学好编译。这个错误的认识往往使很多学生忽略了编译实践性的重要性,这对课程的学习是非常不利的。课程中涉及到的LL(1),LR(1)等算法思想复杂,学生虽然学习过数据结构的一些算法,但对于编译课程中的算法还是感到难理解、难实现,这种情况给后续实验带来一定的困扰。
大部分编译原理教材中,对小型编译器这个实践环节都是用PL/0语言进行描述的。PL/0语言具有结构清晰、功能简单、可读性强的特点,是计算机高级语言的模拟语言。学生没有实际接触过PL/0语言,对用其描述的编译原理实验内容虽然容易理解,但和实验内容所选的编程语言是脱节的,不利于学生上机实现。
许多编译原理课程的实验内容是对现有编译器进行改进,这样的实验内容不能使学生充分理解编译器的原理,使学生对编译原理的学习停留在表面理论上,无法理解其精髓和内核理论。
在实际教学过程中,对不同专业、不同水平的学生可以采用不同的难易度教学。软件工程专业和计算机科学技术专业的学生相比,就可以降低难度,注重实验过程。这样,就达到了因材施教,使学生在实验过程中加深对理论的理解。
为解决上述教学内容中的问题,本着本科教育以培养实用技术人才为主的主导思想,坚持理论与实践紧密结合的原则,将编译原理的实验教学与课堂教学内容、教学模式、教学方法等多方面进行结合,创新性地提出了以课程设计为依托的教学改革措施。
在充分研究制定编译原理课程教学大纲及实验大纲的基础上,制定了大型综合实验的考核方案和实验讲义。提出了在计算机上做作业的理念,让学生在学习理论的同时,亲自上机将理论付诸实践。从而有力地改善了高等教育理论与实践严重脱节的情况,全面提高学生利用所学理论解决实际问题的能力、实际动手能力以及创新精神。使得学生将所学理论知识和实际应用相结合,让理论、应用与实践能够相辅相承。编译原理课程设计的开展,是教学改革的迫切需要,是全面提高学生素质和培养创新人才的需要。
为配合编译原理课程的教学,培养学生的实际工作能力,加深对课堂教学内容的理解,通过设计一个小型编译器,使学生更深刻地领会其基本概念、基本工作原理和实现方法,从而具有初步开发系统软件和应用软件的实际能力。
编译器是将一种语言翻译为另一种语言的计算机程序。一个现代编译器的主要工作流程:源代码(source code)→预处理器(preprocessor)→编译器(compiler)→汇编程序(assembler)→目标代码(object code)→链接器(Linker)→可执行程序(executables)。编译器的设计,深入地探讨了编译器设计方面的重要主题,包括词法分析、语法分析、语法制导定义和语法制导翻译、运行时刻环境、目标代码生成、代码优化技术、并行性检测以及过程间分析技术,并强调编译技术在软件设计和开发中的广泛应用。主要由语言基础知识、词法分析、语法分析、中间代码生成、代码优化、目标代码生成、符号表的构造和运行时存储空间的组织等部分组成。
具体内容和要求如下:
1.掌握某种语言源程序的结构及构成规则。
2.掌握形式语言与自动机的概念,能构造识别相应符号串的自动机。
3.掌握编译程序的词法分析程序的构造。
4.掌握语法分析技术,构造相应的语法分析程序。
5.掌握语法制导生成中间语言的算法。
6.掌握编译程序的代码生成程序。
学生在对PL/0语言某一扫描的分析程序或主程序进行修改或扩充时,保存完整的源程序正本,只须在相应源文件副本上进行修改。然后再重新对修改的程序进行编译,得到新的源文件和新的可执行文件,并用来编译用户编制的含有增加或修改成分的新源程序。学生在词法分析阶段、语法分析阶段、语义分析及代码生成阶段均要进行上机实践,达到学以致用的目的。
编译原理课程设计共有8个实验教学项目,学生完成所有实验项目,就设计并实现了一个小型编译器系统。
实验一:PL/O源程序结构及构成规则,要求学生用高级语言编写程序建立和访问正文文件,并用PL/O语言编写程序,扩充规则。
实验二:构造识别符号串的自动机,要求学生用高级语言实现,分别编写识别各类单词的程序。
实验三:词法分析程序的构造,要求以PL/O编译程序为样本,改编其总控程序和词法分析程序,使其能对扩充后的PL/O语言进行词法分析。
实验四:语法分析程序的构造,用高级语言编写程序,使其能对算术表达式进行LL(1)、算符优先的语法分析。
实验五:掌握语法制导生成中间语言的算法,用高级语言编写程序,使其能将任意表达式翻译成逆波兰式,并用语法制导的方法生成表达式的四元式序列。
实验六:目标代码生成,以PL/O编译程序为样本,改编总控制程序及代码生成程序。
实验七:综合设计,通过结构化设计方法将上述各种程序综合为一个完整的软件系统,以窗口、菜单做界面进入各个子系统,最终实现编译器的实现。
根据近10年的编译原理课程设计的考核经验,在考核学生实验时,创新性的将7个实验项目分3次考核。第一次考核包括实验一、二、三,占总分的30%。第二次考核包括实验四、五,占总分的30%。第三次考核包括实验六、七,占总分的30%,另外可以增加学生出勤和报告的考察,占总分的10%。具体的评分原则与优势有以下三点:
1.要求学生选取一个PL/0小程序进行词法分析,并且程序从文件中读入,词法分析结果存入到文件中,可以使学生练习编程中文件读写的操作。程序中每个单词进行分类,可以使学生更好地理解和掌握自动机的思想,实现标识符自动机的构造和无符号数自动机的构造。符号表进行扩展,可以使学生更好地理解词法分析的过程和原理。
2.要求学生对简单的算术表达式进行语法分析,可以更好地理解LL1语法分析过程。学生对PL/0程序进行语法分析,可以更好地掌握语法分析器的构造原理。
3.要求学生生成中间代码和目标代码,最终连接成一个完整的编译器,使学生对编译原理课程有了系统化的认识,将复杂的实验项目概括为整体,更容易进行程序设计和实现。
针对目前编译原理课程教学中存在的问题,提出了因材施教,注重实验教学的改革举措。根据编译原理课程设计的主要内容和具体要求,设置合理的实验考核标准以及经过多年实践摸索总结出的具体评分标准。
[1]黄剑锋.“编译原理”教学内容探讨[J].电脑知识与技术,2006.
[2]黄贤英等.“编译原理”课程的地位及教改思路[J].重庆科技学院学报(社会科学版),2005.
[3]陈意云等.编译原理(第2 版)[M].高等教育出版社,2008.