面向应用型人才能力培养的编译原理教学内容剪裁研究
2014-12-12吴其林汪世义
吴其林 汪世义
(巢湖学院计算机与信息工程学院,安徽 巢湖 238000)
编译原理是计算机类专业中一门非常重要的基础课程,主要讲述编译程序的基本理论、方法与实现技术,通过这些知识的学习,可以让学生进一步认识程序和算法,提升学生的逻辑思维能力以及计算机问题的求解水平。另外,编译技术已经广泛应用于编译程序构造之外的其他领域(比如网络信息处理、网络协议的分析与实现、自然语言语言处理等领域),通过这门课程的学习,对拓宽学生的知识面以及未来的创新研发生涯将产生有益影响[1-3]。然而,这门课程中所涉及到形式语言与自动机理论等概念较为抽象,难以理解,学生在学习过程存在一定困难,需要投入较大的精力。为此,编译原理课程的教学将面临一个重要的挑战:如何激发学生的学习兴趣,努力学好这门课程?根据笔者的长期教学经验,在正确的教学目标下选择适当的教学内容将是化解这一挑战的非常重要的一环。
1 理论教学内容剪裁
国内外关于编译原理课程的教学已有几十年了,一些国外知名院校(比如麻省理工学院、加州大学伯克利分校以及佐治亚理工学院等)和国内重点大学(比如武汉大学、中国科学技术大学以及清华大学等)都在编译原理的教学内容、教学方式以及教学手段等方面积累了宝贵的教学经验,值得我们借鉴与学习。显然,对于应用型普通本科院校而言,我们不能照搬这些重点大学和知名院校的教学内容和方法,需要根据自身的办学特点和学生水平,对编译原理的教学内容做适当的剪裁,以收获较好的教学效果。
根据笔者的教学心得,以及应用型办学特点和学生的基本素养,教学内容的选取应强调对编译原理和技术的宏观理解及全局把握,而不是把学生的注意力集中到一些细节的算法上,在讲述各章理论的同时使用一些C语言小程序作为实例,努力将一些实际的问题抽象出来,鼓励学生去解决实际的应用问题。依据笔者教学经验,对于应用型普通本科高校,在课程内容讲解时,可以直接从词法分析开始逐步按照编译器的各个阶段讲解,而不需要首先对形式语言和自动机理论加以详述。结合编译器的各个阶段,现对教学内容裁剪如下:
1.1 词法分析
该内容要强调有限自动机具有识别功能,它为词法分析程序的构造提供一种特殊的方法与工具。并且要以正规式、正规文法与有限自动机三者之间的相互转换,以及有限自动机的最小化为讲解主线。同时要运用C语言写的一个简单语言的词法分析程序,介绍词法分析器的生成过程,以便将抽象的自动机理论应用到实际问题的求解中去。
1.2 语法分析
该内容要强调语法分析可以分为自下而上和自上而下两种分析方法,以及每种分析方法所要面临的问题与所适用的文法环境。讲解时,需要重点讲解 LL(1)和 LR(0)两种具体的分析方法,而与算法优先分析有关的算法则不需要讲解,因为编译器的语法分析已不再使用这种方法。对于LL(1),要重点讲述预测分析程序的构造与实现过程,避免过多地将学生的集中力分散到消除递归、消除回溯以及求解First集和Fellow集的具体算法上。同时要以一个C语言小程序的语法分析来讲解预测分析程序的实现过程,从而增强学生的直观感,让学生充分认识到编译原理的应用性特点。LR分析方法是一种高效的自下而上的语法分析技术,它能适用于一大类上下文无关文法的分析,可以进一步分为LR(0)、SLR、规范LR和LALR四种方法。然而,LR分析表的生成算法较为复杂,讲解时需要重点讲述LR实现的关键问题,即根据“历史”、“展望”以及“现实”来确定栈顶符号是否构成句柄,并且以LR(0)作为讲解的主要内容,并且也要以一个C语言小程序的语法分析来讲解其分析程序的实现过程。
1.3 语义分析
目前流行的语义处理方法是属性文法和语法制导翻译,通过对此内容的学习会让学生对语义分析程序有更多的了解,这在软件工程中是很有好处的。然而这部分内容较为抽象,难以理解。讲解时,首先对属性文法、语义规则与翻译模式等概念加以简单介绍,然后将重心放在如何将这两个技术和方法应用到具体的语义分析中去,努力将抽象的东西具体化,以便于学生的理解与应用。结合C语言程序,重点讲解类型检查、控制语句与赋值语句的翻译过程,因为这三者在C语言程序设计中占据重要位置。
1.4 运行时存储空间的组织
在使用C语言这样比较低级的语言时,掌握这部分内容对程序的编写和查错都很有帮助。具体应该讲解局部存储分配策略,以及静态分配、栈式分配和堆式分配等三种全局存储分配策略,非局部名字的访问和各种参数传递方式的实现。
1.5 代码优化
用实例来重点讲解局部优化和循环优化(避免讲解全局优化,因为这类优化较为复杂,其实现代价较高),让学生明白编译器能完成哪些优化,而不要给学生介绍各种优化算法。这对编程有好处,例如,在可读性好的源代码和优化的源代码两者之间做选择时,若知道哪些优化可以由优化编译完成,则宁可选择可读性好的代码。
1.6 代码生成
代码生成器是编译程序设计的最后一步,其设计要依赖于目标语言和操作系统,可以选择一种采用简单的寄存器分配策略的代码生成算法加以介绍,让学生对代码生成作一简单了解。
2 实验教学内容剪裁
编译原理内容抽象、不易理解,其实验是将理论知识转化成具体实现的重要手段,对培养学生深入理解编译程序各个阶段任务,同时也对培养学生的计算思维、算法设计分析、程序设计等能力具有举足轻重的作用。国内外各个高校都非常重视编译原理的实验教学[4],如表1所示。显然,以上这些实验内容难度系数都较大,我们不能照搬这些大学的实验内容,我们需要依据应用型办学的特点,根据自己学生的掌握的情况对实验内容进行适当的裁剪,主要目的是通过该课程的学习,培养学生掌握编译程序各个阶段的任务及其实现,熟悉编译程序的构造过程;同时,可以把该门课程中所涉及到的理论和技术能够灵活加以运用,以解决实际中的应用性问题。
为此,我们根据其他高校的情况和本专业学生的特点,设计了应用型实验教学内容,如表2所示。表2所示的5个实验中,第1-3个实验属于基础性的实验,主要是为了让学生掌握编译程序构造的各个阶段及其实现。需要注意的是,我们并没有设计语义分析实验内容,因为LR分析表的构造较为复杂,根据长期的教学经验,学生对语义分析实验完成的不够理想,没有收到预期的实验效果。然而,通过前面1-3个实验,学生并不能从整体上很好地掌握编译器的构造。为此,我们又设计了第4个综合实验,这样既可以解决前面所提到的缺陷,又能减少从头构造整个编译器的所带来的难度(当然比第1-3个实验难度要大)。第1-4个实验主要是针对编译程序本身的,那么如何在实际问题中应用相关的编译原理和技术,这是学生的共性和典型问题,这也是第5个创新性实验所需要解决的。通过一个实际项目的开发锻炼,可以让学生积累编程和解决实际问题的经验,切实提高学生实践动手能力、解决问题的能力和项目开发能力,以培养出适应社会需求的应用型人才。
表1 国内外高校编译原理实验安排情况
表2 剪裁后的实验内容安排情况
3 教学内容裁剪成效
为了评价教学内容裁剪后的成效,我们将裁剪后的学生网上质量评价与裁剪前进行了对比,并从兴趣激发、课堂气氛、联系实际、能力培养、理解程度、重点突出、条理清晰、内容充实、创新培养等方面进行统计与对比,其结果如表3所示。通过表3可以看出,裁剪之后的教学效果明显好于之前的,特别是在兴趣激发、联系实际和创新培养等方面表现尤为突出。裁剪之后的教学效果平均满意程度为89.2%,而之前的仅为35.4%。
当然,在内容裁剪之后仍然存在一些问题,主要表现在以下几个方面:一是学生对属性文法、语法制导翻译和LR语义分析等内容上理解的还不够好,对此,我们还需要加强具体实例问题分析与讲解,以便学生对这些内容的消化理解。二是学生的中等以上规模的编程与调试能力还有所欠缺,在项目开发实践方面表现的还不够理想,对此,我们还需要联合其他专业课程(如高级语言程序设计、数据结构等),加强学生的编程与项目开发实践能力的培养。
4 结语
编译原理课程在计算机类课程体系中占据着重要位置,对提升学生的逻辑思维能力以及计算机问题的求解水平具有不可或缺的作用。然而,对于应用型普通本科院校,应依据应用型办学特点和学生的素质水平,对编译原理的教学内容进行适当的裁剪,而不能照搬其他重点大学的做法。根据长期的教学经验和所取得的教学效果,对编译原理的教学内容分别从理论教学和实验教学部分进行适当的裁剪,力求将抽象的原理转化具体的实现和应用,让学生充满学习兴趣,努力学好这门课程。
表3 教学内容裁剪成效对比
[1]Alfred V.Aho,Monica S.Lam,Ravi Sethi,Jeffrey D.Ullman.Compilers:principle,techniques and tools (2nd Edition)[M].America:Addison Wesley,2007.
[2]侯丽敏.《编译原理》课程教学改革探索[J].电脑知识与技术,2013,(7):1586-1590.
[3]何炎祥,伍春香.计算机专业不需要开设编译原理课程吗?[J].计算机教育,2009,(4):61-63.
[4]田玲,余盛季,王晓斌,等.《编译原理》实验教学改革及探索[J].实验科学与技术,2013,(6):297-300.
[5]王晓娟,谭建龙,刘金刚,等.基于自动机理论的 PDF 文本内容抽取[J].计算机应用,2012,(9):2491-2495.