编译课程教学相关工具资源

点赞:20543 浏览:93823 近期更新时间:2024-01-04 作者:网友分享原创网站原创

摘 要 :结合编译课程教学特点,收集当前常用的编译资源,并从编程语言和教学知识点两个角度对这些资源进行归类分析;在此基础上,探讨如何利用这些资源开展编译课程的课堂教学和实践教学.

关 键 词 :编译原理;工具资源;实践教学

1.背景

编译理论与技术是计算机科学中发展最迅速、最成熟的一个重要分支,程序设计语言和编译的发展集中体现了计算机科学的重要成果与精华.编译原理课程是计算机科学与技术专业的专业必修课程,主要讲授程序设计语言编译程序构造的基本原理和方法.编译程序的开发堪称经典理论和先进技术紧密结合的典型示范,因此理论学习和实践的紧密结合是本课程的突出特色.通过编译程序构造的问题,可以体验到如何从实际需求中提出理论问题、理论研究推动技术进步、运用技术工具解决实际问题的过程.

在经典理论的支持下,在编译程序的研制过程中,产生了非常丰富的工具资源.在这些工具资源的支持下,编译程序开发的自动化程度得到了显著提高;相对其他软件开发任务,编译程序开发在效率和质量上的优势非常明显.更为重要的是,编译的理论和技术对于计算机科学中的其他领域也有重要的影响.一直以来,编译的理论和技术在程序设计语言的实现、针对计算机体系结构的优化、新的计算机体系结构的设计、自然语言理解、网络信息处理、网络协议的分析与实现等领域都是不可或缺的.国外著名大学(如美国哥伦比亚大学、哈佛大学和斯坦福大学等)的编译课程教学都特别重视相关的课程实践项目.以哥伦比亚大学为例,在编译原理的课程教学中开展了贯穿整个学期的课程实践项目.在项目中,学生分成小组,自主设计并实现一个小的语言,而这个语言涉及了丰富的领域,包括量子计算、音乐合成、计算机图形学、游戏、矩阵计算和很多其他领域.在这些教学实践中,很多编译开发工具都被应用于各种案例中,包括ANTLR、LEX和YACC等编译领域经典的开源软件工具.

通过收集编译资源(包括开源的编译器和编译程序开发工具),以及这些工具在计算机科学各领域中的成功应用案例,可以为开展案例式教学改革打下坚实的基础.笔者收集了编译领域常用的开源软件工具及其应用案例,并对其进行归类分析和整理,以形成支撑编译课堂教学和实践教学的资源库.基于该资源库,在今后的编译原理课程教学中,可以通过采取基于案例的教学方法,形象地向学生展示编译研究中“经典理论和先进技术有机结合”的突出特点,使学生能够通过具体的案例切实体验编译经典理论在各领域的重要作用.

2.编译资源分析

在几十年的研究过程中,编译领域已经形成了很多编译资源,如LEX、YACC、JaCC为代表的编译模块开发工具,以及精简语言编译器、产品级开源编译器等.这些工具实现了从Ada、C、Pascal等面向过程语言到Ja、C++等面向对象语言的编译程序,覆盖了文法、词法分析、语法分析、中间代码生成、代码优化、目标代码生成等编译原理教学中所有的知识点.基于这些工具也开发了SQL、XML分析等计算机科学其他领域的应用.下面,笔者从生成语言、知识点覆盖等角度对互联网上的编译资源进行整理分析.

2.1从编程语言的角度分析

从编译资源所面向的程序语言来看,从面向特殊领域的Fortran语言、DSP语言,面向过程的C语言、Pascal语言,到常见的面向对象的Ja语言、C++、C#语言等,均有种类繁多的分析器、生成器、目标代码优化器等可用于案例教学的编译资源.

1)面向过程语言的编译资源.

这方面的编译资源主要针对C语言和Pascal语言.C语言作为最被广泛使用的编程语言,也拥有最多的编译工具资源,如YACC、LEX、ACCENT、BANSHEE等经典工具均可用来产生C语言编程的分析器、生成器.其中,最知名的C语言解析器生成器YACC已经在各种场合得到了广泛应用.YACC也是常用于编译课程教学的工具,它采用LALR(1)语法分析方法,最初由AT&T为Unix操作系统开发,在漫长的演变中产生了如Berkeley YACC、GNU BISON、MKS YACC和Abraxas YACC等变种版本,也出现了AYACC、YACC++等面向ADA、c++其他语言的编译器.由于所产生的解析器需要词法分析器配合,因此YACC经常和词法分析器产生器LEX一起使用,目前已有IEEE相关标准对YACC和LEX的功能进行了标准化描述.此外,ACCENT、BEG、CKIT等面向c语言的编译资源也可以用于编译课程教学.据我们初步统计,目前互联网上可用的针对c语言的编译资源多达20余种,涵盖了词法分析、语法分析、前端、后端生成器、代码优化、程序分析等编译过程中的各个环节.

2)面向对象语言的编译资源.

面向对象语言已成为程序开发的主流语言,在应用层软件、网络怎么写作开发上占据着绝对优势地位.因此,目前也相应出现了很多针对面向对象编程语言的编译资源,特别是C++语言和Ja语言.C++语言由于与C语言一脉相承,许多针对c语言的编译工具也扩展了c++版本,如YACC++、Berkeley YACC、IDC-C等,均可以生成C/C++语言的分析器.

Ja语言在最近20年一直是最流行的编程语言.Ja语言为了实现跨平台的目标,在编译时仅生成字节码,再由不同平台的JVM生成目标代码执行;因此,Ja语言的编译执行具有明确的前端后端,非常有利于编译程序的开发和编译原理知识点的分解.目前针对Ja语言的编译资源与工具种类繁多,如JaCC、JastAdd、Jax、Jfront、Soot、PAT等,我们目前已经收集到相关编译资源20余种,既有JaCC等综合编译环境,又有Jfront前端工具、PAT正则表达式分析器、OOPS分析优化工具等编译工具资源.

3)其他专用语言、平台的编译资源.

为了符合特殊应用场景的计算需求,出现了一些针对特定领域、特定平台的程序语言,同样,在这些领域中对编译器往往也存在独特的需求,如嵌入式系统、科学计算等,如针对SPARC平台的编译器BEG就能对Fortran、Modula等专用语言进行分析编译,而Archelon编译器则针对DSP芯片为执行代码生成做了专门的优化.ELI是这一类编译资源的典型代表,它除了支持上述流行编程语言及专用语言如c、Fortran外,甚至支持对用户定义的语言生成独有的编译器,从而帮助用户快速地实现一种专业程序语言. 2.2从知识点的角度分析

为利于编译原理课程的教学,我们更希望从知识点的角度梳理相关资源,在讲授相关课程时,可以介绍这些经典的编译工具.通过认识真实编译系统的工作流程和开发技术,帮助学生理解关键知识点.我们从词法分析、语法分析、编译前端、编译后端、程序分析及优化、完整的编译器平台等类别对现有的编译资源进行了梳理和分类.

1)词法分析.

词法分析器以UNIX/LINUX上的LEX为典型代表,能够生成c语言描述的词法分析器;而AFLEX作为LEX的变种,能生成ADA语言描述的词法分析器;Quex还能生成C/C++、Python语言描述的词法分析器;相关的资源还包括LOLO、FLEX等.

2)语法分析.

支持语法分析的编译工具最为丰富,从简单到复杂的相关开发案例也最多,可以很好地用于支撑课程教学.如前文所述,语法分析器以YACC为典型代表,这一系列的语法分析器还包括AYACC、BISON、BYACC、BEG.CUP、Jell等Ja语言开发的语法分析器生成器,可以生成Ja语言描述的语法分析器.ANTLR是一种用Ja开发的强大的语法分析器生成工具,可以生成各种语言描述的语法分析器,包括Ada、C、C#、Ja、JaScript、Objective-C等,以及Perl、Python和Ruby等较新的互联网程序语言和脚本语言,甚至包括SQL、一阶逻辑、XPath等应用语言等.ACCENT则是一个包含了词法分析器和语法分析器的生成工具.JaCC是当前应用非常广的一种语法分析器生成工具,能产生Ja语言描述的LL(K)分析程序.值得一提的是,目前已经有非常多的利用JaCC开发的各种语言的分析程序,包括了表达式等简单语言,如DTD、IDL、RTF等应用语言,以及PHP等实用的脚本语言.随着技术的发展,甚至出现了OOPS等面向对象的分析器生成工具.


3)编译前端.

面向c语言的中间代码生成工具最著名的是Ckit,它支持将c语言程序翻译译成L类型的中间语言,也支持用户扩展C语言语法的前端编译.EDG则能将C++和Ja等语言翻译成一种高级的树结构中间语言,并具有错误检查功能.在面向Ja语言方面,比较知名的编译器前端包括Jfront等.此外,为满足特定应用场景需求,还出现了IDC-C、SUIF等编译前端及中间代码优化工具.

4)编译后端.

编译器后端方面的资源相对前端来说较少,比较知名的编译器后端是BEG,以BEGL中间语言为输入,可用于生成Motorola 68020、SPARC、MIPSl Intel 386、Pentium?Inmos T800和PowerPC等平台的目标代码.在Ja语言方面,Sable研究小组基于XML提出了JIL中间表示语言,利用XML的特性为执行代码的生成和优化提供便利.此外,还有Trimam等针对并行环境生成执行代码并优化的后端编译器生成器等工具.

5)程序分析及代码优化.

在程序分析及代码优化方面的编译工具较多,如BANSHEE、CodeSurfer、Omega、OOPS、PAG、SOOT等.其中BANSHEE、CodeSurfer、Kimwitu、MEMPHIS、PAG等工具针对C/C++程序进行分析,Omega、PAT等工具则可以对Fortran、Ja程序进行分析,SOOT、OOPS提供了对Ja等语言编译器的优化,上文中提到的Trimam及SUIF等则针对并行环境进行了代码优化.

6)编译器平台.

除上述实现了部分编译模块的开发工具之外,还存在着大量实现了从词法分析、语法分析直至最后目标代码生成所有环节的编译器平台资源,这些资源用于案例教学可以帮助学生对编译的全过程进行一个整体的理解和把握.这些平台可以分为两类:一类是以精简语言为源语言的小型编译器,如PL语言(PASCAL子集)编译器、与ADA和PASCAL类似的TINY编译器,以及斯坦福大学开发的COOL(The Classroom ObiectOriented Language)编译器,这些编译器都是面向专门为教学设计的某种精简的编程语言,将其翻译成某种抽象机代码,借助抽象机解释器执行;另一类是以GCC、LCC为代表的产品级开源编译器,面向C/C++这类主流的编程语言,提供开源、实用的编译程序.

编译课程教学相关工具资源参考属性评定
有关论文范文主题研究: 关于计算机科学的论文范本 大学生适用: 硕士学位论文、本科毕业论文
相关参考文献下载数量: 57 写作解决问题: 如何怎么撰写
毕业论文开题报告: 论文提纲、论文小结 职称论文适用: 核心期刊、职称评副高
所属大学生专业类别: 如何怎么撰写 论文题目推荐度: 免费选题

3.编译资源在课程教学中的应用

通过上面的分析,我们看到编译开发工具和相关案例是非常丰富的,但是如何将这些工具和案例很好地结合到教学中,则需要做仔细的选择和考虑.不论从课程教学,还是实践教学来看,编译原理课程的学习可以从局部知识点和系统整体两个层次开展.课程教学需要在掌握编译各阶段的具体知识点的基础上,加强各知识点之间的融会贯通,并恰当及时地从局部向系统整体引申.

在词法分析、语法分析、语义分析、优化、目标代码生成等知识点的学习过程中,可以引人相应模块的开发工具作为案例.如在讲解词法分析时可以结合LEX、在讲解自上而下分析时结合JaCC、讲解自下而上分析时结合BISON,甚至可以在课堂教学时展示这些工具的核心代码,加深学生对相关算法的印象.也可以在课外安排实践作业,要求学生选择这些工具提供的案例资源,以已有的案例为基础(为调动学习兴趣,可以有意识地选择学生在其他课程中已经熟悉的语言,如数据库中的SQL、操作系统中的Shell命令语言、离散数学中的谓词逻辑等),实际生成一个编译模块,阅读分析生成程序,在此基础上,可要求学生扩展原有案例.通过结合这些工具讲解理论知识,并通过实践作业,使得学生能够理解局部知识点,并掌握相关成熟的工具的使用.

在系统开发层面,编译程序的开发是一个典型复杂的软件开发任务.如果能在理解局部知识点的基础上,为学生提供一个理解编译程序整体全貌的平台,以编译过程为指导带动课程知识点的学习,也是非常有益的.如何在编译程序的功能实用性和教学可用性两方面保持平衡,一直是编译教学的难题.开展综合性实验,是提高学生对编译程序整体理解和开发能力的主要途径.在这方面,有两种思路.一种是侧重整体体验,主要是面向一个为教学而专门设计的精简语言,如前文介绍的PL、TINY和COOL等,这些语言通常包含现代程序设计语言典型成分,但更为精简,学生可以通过课程学习,最后为该语言实现一个完整的编译器.按照这种方案开展综合性实验,有利于学生体验一个完整的编译程序开发过程.第二种思路侧重实用性和真实性,主要以GCC、LCC这类实用的,甚至是产品级的开源编译器为平台开展实践.由于GCC、LCC这类实用编译程序代码量非常大,如何引导学生在纷繁复杂的代码中理清头绪、找到和教学知识点相关的程序段,需要教师做好充分的准备.这种思路,对于将来从事编译程序开发的学生,其收获可能更大.

4.结语

理论和实践的完美结合是编译程序研制的突出特点,也是编译课程教学力图为学生展示的特色.为了使学生切实体验编译经典理论在编译程序研制以及其他领域发挥重要作用,我们收集了一批编译开发工具,并对这些资源从公开程度、开发语言、生成语言、系统平台、涉及课程知识点、应用领域和是否提供案例等方面进行分析和标注.到目前为止,已收集60余项软件工具资源,并在课程网站上发布.下一步,我们将继续扩大收集编译资源的规模,并进一步提高分析和标注的准确性,积极探索如何结合这些资源开展课堂教学和实践教学改革,利用这些资源向学生展示编译研究中“经典理论和先进技术有机结合”的突出特点,并使学生切实体验编译经典理论在各领域的重要作用,培养学生的计算思维,提高课程教学的效果.