||
《编译原理》这样传统的难上的课,对于普通的应用型本科院校来说,这课门或这类课开还是不开?怎样开?确实值得讨论。
《编译原理》是门“好”课,我曾经给学生开过,当满心欢喜想着怎样讲好怎样安排实验,再给下一届学生上的时候,这门课变成选修,也就是不开了。(大学里常有专业课程只是一个人开,就好象这课就是这老师的,我虽然不敢占有哪门课,也反对这样,但得知俺的《编译原理》不开时,也有一种“失业”的感觉,甚至是“失恋”被甩的感觉。)
《编译原理》是门“好”课,在计算机科学与技术专业中是重要的专业基础课程,也是比较难学的一门课程,其理论是本专业学生不可或缺的知识基础,其应用也不仅体现在编译器的设计,在很多计算机领域都直接或间接利用其方法和技术;学这门课对锻炼学生逻辑思维能力、学会用计算机解决问题的方法、深入系统地掌握计算机语言、提高软件设计开发能力都有重要作用。部分学校为了适应信息技术的发展开设了一些新课程,使得《编译原理》的学时有所减少,但本课程对学生的专业培养、构建完整的学科知识体系具有不可替代的作用。
和多数计算机专业课程相比,编译原理课内容抽象,理论课中的一般原理、方法和技术更需通过实践才能深入理解和掌握。
但现在的学风,教学情况大家也都明了。现在的学生兴趣广泛,精力分散,多数有计算机,玩手机更盛行,但是投在课程学习及实践的时间大大减少,不少学生学习目标不明确;对于编译原理这样有一定难度的课程,遇到挫折容易退缩,在学习上的钻劲和毅力有所降低,有的学生学习热情不高,交实验作业时拷贝风气日益蔓延。
学生已学的课程有C语言程序设计、数据结构、离散数学、计算机组成原理等,这些课的知识和技能在编译原理课中都要用到。有些内容在编译原理中用,但前序课的教学中学生掌握的一般,有的也没学好或没学,这是多数学校存在的情况。如离散数学中没涉及形式语言和自动机,数据结构中DAG,另外对汇编语言知识也学生也有所欠缺。学生虽然学习了编程语言,具备一定的编程能力,但在应对复杂程序方面还显得无从下手,以至放弃,这也是学生积极性不高的原因。
另一方面,《编译原理》这样的课程也确实需要改革一下了。在上世纪七八十年代,编译理论和应用在社会需求的促进下发展很快,也曾是很热门的前沿技术,到九十年代日臻完善,层出不穷的计算机语言经过实践的检验、优胜劣汰、更新换代后,到现今已相对稳定在对主要的十几种编程语言的应用和改进上,总之传统的编译理论已很成熟,这由近年来本领域发表的文章数及新编教材出版种数相对减少也可反映出来。在公开发表的教学论文方面,有关编译原理课程的文章远远没有数据结构、计算机组成原理、编程语言等课程的多。编译原理理论和技术方面近些年也鲜有新成果出现,可能是编译技术相对成熟的原因,也有些编译原理在其它领域的应用。
非研究型的普通院校,要考虑学生基础知识及技能掌握的情况,以及学生将来发展的需要,综合信息技术领域的新发展及部分用人单位的新需求,而进行以实验内容改革为重点的研究和设计。目前,做为计算机科学与技术专业核心课程的《编译原理》相对成熟,形成了固定的教学内容和实验内容,如多数教材中的实验内容都是以编制一个类Pascal的Sample语言或PL0语言的编译器,大部分学校实际开设的实验也是如此,先分别对整个编译器生成的各阶段理论和算法进行练习实践,一般再安排一周时间进行综合训练,以达到教学要求。这样的实验内容和模式,确实有其系统性,但是仅从将来学生就业一方面来看,很少有人去设计一种语言编译器,作为例子的Pascal语言现在也很少有人应用。更重要的是在目前新知识新技术不断发展,专业教学内容不断丰富,应用型本科人才培养方案中调整学时后,传统的实验内容已不太适应了,如果没有集中一周的实训更难以达到效果。
其实,多数学生还是有想学好、学到“有用”知识和技能、顺利通过考核的主观原望,所以提高学生的学习和实践兴趣,让他们在课程学习和实践的各阶段够得着、看得到成果、体会得到有用,是选取课程内容和实验项目的依据。
在教材方面:
编译领域的经典著作是Alfred V. Aho 和Jeffrey D. Ullman在1977年编写的《Principles of Compiler Design》,后又由Ravi Sethi和Monica S. Lam参与改为《Compilers: Principles, Techniques and Tools》出版。Kenneth C.Louden写的《Compiler Construction Principles and Practice》也是经典著作,已由冯博琴,冯岚等翻译出版,还有Keith D. Cooper, Linda Torczon著《编译器设计》。
国内发行量最大的教材是陈火旺等编著《程序设计语言编译原理》,现已改编至第三版。
张素琴编著的《编译原理.第2版》(清华大学出版社),陈意云编著的《编译原理和技术:第2版》(中国科技大学出版社),蒋宗礼,、姜守旭编著的《编译原理》(高等教育出版社),吕映芝等编著的《编译原理》(清华大学出版社),蒋立源、康慕宁主编的《编译原理》(西北工业大学出版社)都是国内常用的好教材,这些书各有特点,适合重点院校本科生学习。由黄贤英, 王柯柯编著,清华大学出版社出版的《编译原理及实践教程》是一本少学时的教材,也是适合学生阅读和学习的。
《编译原理》课不过时
随着信息技术不断发展,虽然对计算机语言编译器的需求不明显了,但对编译原理思想方法的应用需求一直未减,这都需要开好《编译原理》,在有限的学时内让学生上好实验课。“应用型”也得开好原理课才能应用。编译原理的应用领域体现在以下几方面:
形式语言和自动机原理,做为课程只在研究生阶段开设,它是编译原理的基础理论,对本科生来说,只有在编译原理课中接触一些形式语言和自动机的知识,但这些知识的应用非常广泛,尤其是自动机的算法在很多自动控制系统中也用,所以在编译原理课中加入形式语言和自动机的实验很有必要,对学生的思维锻炼,完善学生的知识和技术体系皆有帮助。
在复杂文本处理方面,词法分析的知识和算法都可以应用其中,有时也涉及语法分析的知识;如非结构化数据向结构化转换,文本模式转换等。
在游戏软件开发中,因多数游戏角色的智能化程度高,用户需自定义很多剧情脚本、规则等,所以编译原理的很多知识都可应用。
在信息检索领域,检索条件的处理、模糊查询等都可用到编译原理中词法分析的知识和算法;正则表达式更是处理此类问题的有力工具,我在教学过程中作为重点进行了讲解,在也实验教学中通过相关软件工具让学生掌握。
语言翻译方面,通过建立大规模的语料库,也能实现较成功的语言翻译。
程序语言的转换,因计算机语言更新换代原因,很多程序语言不流行了,不再有相适应的编译环境和运行环境,但用这些语言写的算法和库函数还有实用价值,如从上世纪六十年代以来,在科学计算领域写了大量的Fortran程序,随着应用环境的变化,就有翻译或转换为其它语言如C语言、Matlab语言的需求。
在并行计算方面,由于计算机体系结构在各层次上采用了并行结构,如向量操作、多处理机等,对并行程序设计和并行编译技术的需求增加。面向并行机的并行程序设计语言有待完善,串行程序的并行化任务也很大,这些都需编译原理和技术的支撑。
嵌入式系统编译器及其工具的应用开发,近年来随着计算机技术、微电子技术、通信技术的发展,嵌入式系统在工业控制、交通通讯、生活医疗、武器等各领域得到广泛应用,嵌入式产品已成为信息产业的主流。嵌入式系统开发需要开发工具和环境,由于嵌入式系统本身不具备自主开发能力,传统的程序语言和编译方式不能胜任,开发时往往有宿主机和目标机的概念,宿主机用于程序开发,目标机作为最后的执行机,交叉编译就是在一种机器结构下编译的软件在另一种机器结构下执行。目前就有较成熟的基于ARM等目标机的交叉编译软件,如arm-linux-gcc和arm-elf-gcc。在应用型本科的编译原理教学中,这些面向应用的知识和技术学生应该了解,对于嵌入式开发的编译器、连接器和调试工具,学生应在了解理论的基础上掌握使用方法,以便学好嵌入式系统开发的课程。
在脚本语言开发中,如处理超文本网页、所见即所得的排版软件、多媒体文档中,也用到编译原理的原理、方法、技术。在一般原理课程中对这些内容涉及不多,但实际应用是很广泛的,只不过我们多数都用现成的商品软件处理这些,而忽视软件背后的技术和原理,这可能也是国内近些年来在这些领域创新不足的原因。在理论教学和实验中如何安排这些内容有待进一步设计和研究。
除脚本语言外,在软件建模语言、硬件描述语言的翻译方向也用到编译的原理和技术。
在人工智能、机器人设计方面,编译原理的理论、方法和技术也有相当多的应用。本人时间和能力有限,未做相应研究。
实验设想:
首先,设计编译原理实验项目需遵循课程本身的理论体系,编译理论知识点和各实验项目要有对应关系,按程序编译过程的五个阶段,即词法分析、语法分析、语义分析与中间代码生成、代码优化和目标代码生成来设计实验的内容和秩序, 要考虑知识点的覆盖范围等。
其次要考虑学生的情况。实验的设计要在学生的知识背景、技术能力,如何提高学习兴趣上进行,如在实验教学的开始阶段,重点进行C语言程序设计、数据结构课程的综合应用,回顾所学知识也起到承上启下作用。在编译原理中用到大量典型数据结构的操作,如编译器中表格管理就是很重要的部分,树和图的知识也贯穿课程的始终。
再次,随着信息和计算机技术的发展,也出现了一些很实用的编译器自动生成工具,包括词法分析、语法分析器自动生成工具等,也有的学校教师编写了可示化的工具软件来模拟编译原理复杂算法的执行过程。利用现有的工具软件可便于学生跳出调试程序时烦琐的细节,从整体把握编译原理关键阶段的核心算法,也有利于学生验证和对照一些题目的结果。如很多软件系统中有正则表达式分析功能,可利用其进行词法分析中正规文法的学习;Unix或Linxu系统下一般都有词法分析程序Lex(或FLEX) ,可利用Lex语言按文法的正规产生式写源程序,再转换成标准C语言程序,编译后完成词法分析阶段的任务;同样可利用语法分析自动生成工具YACC(Yet Another Compiler_Compiler)进行语法分析的实验。培养学生善于利用工具软件去解决问题,也符合应用型人才培养的理念。
最后,在教学和实践过程中要结合应用领域,在完成编译器设计的基本算法实验的基础上,增加一些在其它领域的应用示例有利于提高学生学习兴趣,拓展知识面,达到理论联系实际应用之目标。如信息检索、表达式处理、超文本分析都是适合的实验题材,另外并行程序编译、嵌入式开发都可在实验中有所体现。
Archiver|手机版|科学网 ( 京ICP备07017567号-12 )
GMT+8, 2024-11-23 05:12
Powered by ScienceNet.cn
Copyright © 2007- 中国科学报社