李洪霞
摘 要:针对普通高校本科生编译原理课程的教学,从教学目的、教学内容以及教学中的问题三个方面对其进行了分析和讨论,并给出了相应的解决方案。
关键词:编译原理;编译过程;教学目的;教学内容
DOI:10.16640/j.cnki.37-1222/t.2015.24.265
《编译原理》是计算机及相关专业的一门重要专业课程,它对促进学生理解编译过程及技术,增强学生的程序设计及实现能力,起着重要的作用。但它同时也是一门难学的课程,其主要体现在先导课程多、理论性强、对实践阶段要求高等方面。因此如何教好这门课程是需要思考的问题。
同时,编译原理课程在普通高校本科生、重点高校本科生以及硕士研究生中均有开设,其教学目的、教学内容以及教学方法应该有所区别。本文针对普通高校本科生,就如何开展编译原理课程的教学展开讨论。
1 教学目的的确定
教学目的是一门课程的核心,是开展教学工作的前提和基础。编译原理作为一门计算机及相关专业的专业核心课程,在不同层次的学生之间均有开设。但针对学生的层次不同,应设立不同的教学目标。
针对普通高校本科生,未来的发展多定位在技术人员。因此,培养方向应以“工程性”和“应用性”为主[1]。由此,针对普通高校本科生,可设定为以学习基本原理和方法为手段,理论联系实际,以培养学生计算机思维[2]、提高分析解决问题和理论联系实际的能力为目标来进行教学。下文中的学生,如不特别说明,均指普通高校本科生。
基本原理和方法的学习:编译原理课程中涉及到一些非常基础和重要的原理和和技术,如正规式和正规文法以及状态自动机的等价性,LR分析法的正确性与合理性;用状态自动机(DFA或NFA)来进行单词的识别、用三地址代码进行中间代码的表示、基本结构的中间代码生成等。通过这些内容的学习,可以对程序设计有深入的掌握和理解。同时,编译原理是一门理论性和实践性都很强的课程,如何将源语言转换成目标语言,除了掌握其技术理论外,还需能够将源程序(如具体的C语言程序),转换成目标代码(如汇编代码)的形式。因此,理论的学习必须与具体的源语言、目标语言以及目标机联系起来,理论与实践结合的非常紧密。
分析解决问题能力的提高:在编译原理课程的学习中,给出了多种问题的解决方法。如在语法分析问题上,首先提出问题:如何判断一个句子是否是合规的句子。然后用自顶向下和自底向上两种方法对该问题进行了分析解决。类似地,在中间代码生成部分,给出递归求解中间代码的方法。这些常用和基本的问题解决方案对提高学生分析解决问题的能力有所帮助。
2 教学内容的选择
现阶段,国内外编译原理的教材内容不断更新,像并行编译、形式语言与自动机等内容都成为编译原理课程的一部分编写进了教材[3]。由于课时的有限性,应根据学生的实际需求,以通过对编译技术的学习,提高学生编程能力为根本。具体来讲,即通过对给定问题进行分析,能够采用合适的结构来存储数据、运用合适的模型来描述问题,然后提高运用语言编写代码的能力,快速发现并纠正程序中错误的能力,及编写高质量程序代码的能力。
在程序编写部分,除了对程序语言的理解和掌握外,主要就是对编译技术的掌握。其重点内容应包括:词法分析,语法分析,语义分析与中间代码生成,中间代码优化及目标代码生成这几个主要的环节。其它内容,在不影响课程进展的情况下,可以考虑略讲或直接省略。如在自下而上语法分析中,像算符优先分析可以不讲或略讲。在LR分析法中,具体内容涉及到LR分析器及LR(0)、SLR、规范LR及 LALR分析表的构造方法。此处是语法分析中的难点,如果逐一讲解必然占用大量课时。故可在LR分析器的基础上,以LR(0)为例来对自下而上语法分析进行讲解。然后,在此基础上进一步引申,如项目集中含有冲突项目(如同时含有移进和归约项目),应该如何处理。这些供有兴趣的同学进一步探讨。
类似地,对属性文件及语法制导翻译,并行编译的内容,以及形式语言与自动机的知识点,采用点到为止的方式,仅提出相应的问题,不做细致分析讲解。
同时,由于编译原理的先导课程较多,如以C语言为源语言,汇编语言为机器代码为例进行课程分析,对涉及到的相关知识及内容应适当加以回顾,使学生能将精力集中放到编译技术的理解上,不因先导课程中知识点的不理解而影响对当前知识的掌握。
3 教学过程中的注意事项
编译原理课程是理论性强的课程,也比较抽象,如何让学生能够理解并运用其中的原理和技术,从而来提高编程能力呢?实例引用和与实践结合就是课程讲授中非常重要的两个方面。
(1)实例引用贯穿始终。如在编译过程概述中,提到编译过程的各个阶段,词法、语法及语义分析等概念,学生一时难以接受和理解。此时可举实例进行讲解,比如以赋值语句:area=pi*r^2为例,讲解如何将本条语句由源程序通过词法、语法等步骤,逐步转换成目标代码并加以执行的。从而使学生对整个编译过程有一个直观的印象。
同样,在中间代码生成阶段,举例说明是如何将三种基本结构的语句,如顺序结构语句(如赋值语句)、控制结构语句(如if…then, if…then…else语句)、循环结构语句(while和for语句)等,分别用具体的源语言程序来说明,讲解是如何利用语义分析技术将其翻译成中间代码(如三元式)的。
(2)与实践相结合。上面提到以实例来对相关的技术加深理解。而在实践应用方面,只有将理论与技术真正应用于实践,编译技术的学习才有意义。如在上机实习方面,可通过C语言构造一个小的编译系统。可以分别利用flex和bison等工具构造词法、语法、语义分析器,并在此基础上构造一个小的编译系统。使得词法分析可识别关键字、标识符以及各种符号,语法分析可进行语法的判断,语义分析器可进行一些数学运算,而构造的编译系统可以将C语言的一个子集翻译成汇编语言的形式。
4 小结
针对普通高校计算机专业及相关专业本科生,从教学目的、教学内容、教学中出现的问题三个方面对编译原理课程的教学进行了分析讨论。希望通过对这几个方面的讨论,可以使学生能够对编译过程有更深入的理解,并使其编程能力得到进一步的提高。
参考文献:
[1]张昱.“编译原理”课程的教学内容选择的探讨[J].计算机教育,2009(18):143-146.
[2]蒋宗礼.“编译原理”课程与专业能力培养[J].计算机教育,2009(21):4-6.endprint