日期:2023-01-23 阅读量:0次 所属栏目:学前教育
“编译原理”课程主要介绍了编译的基本原理、技术以及实现的方法。主要包括词法分析、语法分析、语义分析、中间代码生成、代码优化、目标代码生成等六大部分。通过以上学习,使学生系统掌握设计一般编译器的原理和方法,也能够同时加深?W生对高级语言的认识,提高学生的综合编程水平和算法设计能力。
“编译原理”是计算机专业中最难的一门专业课之一,在理论上要求学生掌握形式语言和自动机等比较抽象的概念,在技术上要求学生能熟练利用各种方法设计程序,因此对学生的各方面水平要求比较高,对学生来说具有很大的挑战性。
1 “编译原理”课程教学现状
“编译原理”课程目前在教学中出现的问题主要有以下几方面。
(1)编译课程内容抽象,采用以往灌输式的教学模式,教学方法单一,无法让学生提起兴趣。“编译原理”课程中的概念和算法大都是以符号、自动机、属性文法等抽象度很高的形式描述,光看教材会难免觉得枯燥无味。如果教师还是用以往的方式灌输式教学,那么因为上述的原因,在整个教学中,学生学习知识很被动,学习知识缺乏动力,造成课难学的印象。
(2)学生学习过程中常常会认为编译在开发软件过程中应用不多,因此也很难提起学生的主动性。“编译原理”这门课程包含的知识和算法,都有很高的难度。与此同时,学生觉得教材中的理论知识和算法应用性不强。编译原理中很多算法,比如LL和LR语法分析算法,代码优化技术等,只有在编译开发中能用到,而学生也不会从事这方面的研发,加上实现难度过大,会给学生造成难学的印象。
(3)学生之前学习高级语言程序设计,数据结构等课程掌握程度不好,也会影响学生的学习情况。“编译原理”是大三的课程,它的先修课程一般在大一大二学习,如果学生之前就没有很好的学习相关知识,就会感到学习非常困难,比如数据结构中的“栈”,如果不了解,就会直接影响语法分析的理解和上机操作。
(4)课时有限,有时刚上完课,学期就结束了。由于高校的改革,很多课程都遭到压缩,给教学带来了一定的难度。很多高校在实验课上进行了压缩,仅仅学习编译的理论和算法,没有相应的实践,使得学生无法将理论具体、形象化,就难以更好地理解运用,更难说全面融会贯通整个编译器。
以上问题的焦点在于,本身编译就已经很抽象了,学生晦涩难懂,如果再没有相应的实验做支撑,难免会让学生有难学的印象,从而进一步影响编译课程的教学质量。因此,在理论学习的同时,如何在有限的时间做好相关的实验教学,使得整个教学过程鲜活起来,让学生真正认识到编译是计算机的重要课程,必须学好,对以后算法设计,程序设计都会带来巨大帮助,是教学中必须面对并解决的问题。
近年来,国内学校在“编译原理”教学方面也积累了大量的经验,上海交通大学张冬茉等[1]提出了现阶段进行大型“编译原理”课程设计的教学模式和方法,使学生能够通过实现一个实用的编译系统,提高对编译原理的认识。合肥师范学院祖弦等[2]针对每部分的核心知识点,设计实验教学实例,探讨在实验案例驱动下的“编译原理”课程教学创新方案。
2 实验教学建设
“编译原理”课程理论性很强,实践性更强,是两者相结合的课程。理论部分抽象、难懂。所以,在理纶学习过程中,适当地穿插实验,可以加强学生对重要知识点的认识和理解,同时也可以很好地培养学生的编程能力。实验总体分为两部分:(1)对“编译原理”中每一部分重要方法做相应的实验。(2)最终整合这些部分,成为一个简单的编译器。
2.1 词法分析器
使用DOS环境输入字符串序列(以‘#’作为结束标志)作为源程序,调用词法扫描程序将字符串以二元组的形式进行输出(若有不属于语言单词的符号出现,则做出错处理),词法扫描程序包括了对源程序的预处理(忽略无用空格、回车符,换行符等空白符),以及对单词的识别和分类,以形成(单词种别,单词自身的值)形式的二元组,并将用户自定义变量信息存入程序变量信息表中。
2.2 语法分析
使用自上而下的递归下降分析法,从文法开始符号出发,根据文法规则正向推导出给定的句子。根据递归下降的分析函数编写规则来编写相应函数,在各个函数分析过程中调用词法分析程序中扫描程序,发出“取下一个单词”的命令,从而取得下一个单词符号作语法分析。
2.3 语义分析和中间代码生成
在语义分析和中间代码生成的阶段,采用语法制导翻译方法,用属性文法作为工具来描述程序设计语言的语义。首先审查词法分析得到的每个语法结构的静态语义,如果静态语义正确再生成中间代码(课设中预采用四元式)。
2.4 代码优化
代码优化部分,设计开发一个代码优化程序,将上一步出现的四元式,进行包括局部、循环和全局等优化,学生将优化后的四元式和优化前的作比较,了解优化在编译中的重要作用。
2.5 目标代码生成
目标代码生成是编译的最后一个阶段,根据符号表等信息,将中间代码转化成为等价的目标代码。为了减少访问计算机内存的次数,应尽可能把基本块内仍然要被引用的变量放到寄存器中,而把基本块内不再使用的变量所占的寄存器释放。为了随时掌握寄存器使用情况和变量的存放情况,以便生成合适的目标代码,可以建立寄存器描述表以及变量地址描述表。
2.6 简单编译器的设计
以上5组实验对于编译过程中的六大部分重点方法进行了实验,由于内容较为分散,大部分学生不能很好地了解编译器每个部分是怎么在整个编译系统中达到协调工作的。经过一个学期的学习,除了在平时上课过程中设计对于每一部分重要知识点的单独编程,还将开设四学时的集中课程设计。目的是为了设计一个比较完整的的编译器。题目较为开放(见图1),是将一个高级语言的一个语句翻译成最终的目标代码的过程,学生可以根据学生自身情况自行设计一个适合自己程度的做法:基础较差的同学,可以针对题目设计一些较为基础的算法,而基础较好的同学可以将编译中诸多算法融入编译器中,最终生成一个较为复杂的编译器。通过这个设计,能够使学生系统地理解编译的整个过程。由于现在大部分计算机系同学都配有电脑,加上本身编译课程时间比较紧张,这次课程设计的大部分内容学生可以自行实践并上交实验报告。
在做以上实验过程中,可以适当地做分组,让组内同学进行实验内容讨论,研究出实验设计方案,并设计程序,以小组为单位上交实验报告,提高学生团队协作能力。
3 结语
在“编译原理”实验教学中,对这门课程实验内容以及形式做了以上改革,收到了一定的成效。这次改革最为主要的是让学生把编译器各个部分的实验整合为一个编译器,把编译所学的内容能够融会贯通,更好地学习了“编译原理”这门课程,同时在一定程度上培养了学生编程能力以及团队协作能力。
本文链接:http://www.qk112.com/lwfw/jiaoyulunwen/xueqianjiaoyu/214375.html