《自己动手写编译器、链接器》

冯向萍

(新疆农业大学计算机与信息工程学院)  

摘 要:本文主要从教材的选择,实践项目的设置以及实践课程占总评成绩的比例等方面分析和比较了国内外多所高校编译原理课程实践教学的基本情况和特点。根据我院编译原理课程开设的实际情况,提出相应的对策,实现对我院计算机科学与技术专业编译原理课程实践项目的科学,合理设置,以提高学生的动手能力,锻炼学生的逻辑思维能力。

  关键词: 课程  实践教学  现状

“编译原理”课程是计算机专业必修的一门重要的专业基础课程,也是计算机系统软件中非常重要的一个分支。在众多的原理性学习课程中,编译原理主要承担了语言实现原理、方法和技术的介绍。但该课程内容有一定深度和难度,且综合性比较强,涉及的先修课程比较多,包括离散数学、程序设计、数据结构、汇编语言、操作系统等,对学生专业知识掌握情况也要求比较高,学生在学习过程中感到内容抽象、算法复杂,是一门公认比较难学、比较难教的课程。同时,计算机学科是一门对实践性要求比较高的学科,很多东西不能认为听懂看懂就是理解、掌握,需要编程去实现才能说是真正理解、掌握。因此,在考虑如何使学生学好“编译原理”课程理论知识时,如何把理论和实践结合起来,促进和激发学生的学习兴趣,锻炼学生用计算机解决问题的能力和逻辑思维能力,是编译原理教学的一个主要而且极其重要的问题。本文主要对国内外编译原理课程的实践教学现状进行了分析,希望从中找到适合我院学生编译原理实践课程的教学方法。

  一、 国外高校编译原理课程实践教学情况

(一) 斯坦福大学

斯坦福大学(Stanford University)的编译课程分为两个阶段,课程代码分别为CS143和CS147,CS143主要针对在Windows平台下开发编译器的本科生教学,CS147主要针对有一定编译理论和Unix环境下编程经验的的研究生。我们在此主要分析CS143课程。斯坦福大学编译课程的主要参考资料为两本,一本是《Principles, Tools, andTechniques, Second Edition》,这本书被读者称为编译理论知识讲解的“龙书”,主要注重编译理论的详细讲解。另一本书为《Parsing Techniques:A Practical Guide,Second Edition》,侧重点在于分析研究编译中各种语法分析实现的各种算法和理论技术,并从中找到解决每一个问题的最优的方法。

CS143编译课程学时为46学时,其中期中考试占2学时,讨论14学时,即课堂教学学时为30学时。

课程实验内容主要由词法分析(使用 Flex)、语法分析(使用 Bison)、语义分析和综合实验四部分组成,根据实验的难度不同,在实验成绩中所占的比例也不同,前面四个实验分别占实验总成绩的 50 分、60 分、125 分和 125 分。整个实验部分占编译课程总评的 70%。实验在课程的不同阶段发布,要求学生定时提交。课程组织主要由一名授课教师和若干名助教组成,方便学生答疑。

(二) 卡内基梅隆大学

卡内基梅隆大学(Carnegie MellonUniversity)在编译技术领域享有很高的国际声誉,该校的编译课程使用的主要参考教材是被业界称为“虎书”的《Modern CompilerImplementation in ML》。编译实践内容基于一个特定语言L1设置,题目共有 5 道:①扩展给定的 L1 语言的编译器,使之能够将源代码转换成真实的X86 汇编代码;②实现支持 L2 语言的完整编译器;③实现支持 L3 语言的完整编译器;④实现另一个支持 L3 语言并生成安全代码的完整编译器;⑤两者选其一,实现 L3编译器的各种代码优化或者实现 L3 的垃圾收集器,以上五个作业在实验成绩中占相同的比重。

卡内基梅隆大学编译课程实验分数占编译课程总评成绩的 70%,其余的30%是书面作业成绩。课程的组织由一名主讲教师和若干名助教组成。卡内基梅隆大学编译课程的监督措施也很到位,每次作业的发放时间和提交时间都固定,超过预定时间两天未交者成绩按0分计,对于晚交作业的学生也有相应的惩罚措施。程序代码的相似性都有专门的工具检查。

(三) 加州大学伯克利分校

加州大学伯克利分校(University of California, Berkeley)的编译课程编号为CS164,课程名称为《Programming Languagesand Compilers》,该校指定了三本参考教材,分别是称之为的“龙书”的《Compilers:Principles, Techniques, and Tools》,《Thinking in C++》和《Python Essential Reference (3rd edition)》。课程的组织方式主要由课堂讲课,讨论,学生完成书面作业和独立完成实验四部分组成。

该校编译课程的实验要求是使用C++语言实现 Python 语言(version 2.5)的编译器,课程成绩的评定主要由期中考试,期末考试,书面作业和实践四部分组成,其中期中考试和期末考试两次考试占总成绩的25%,实践部分占总成绩的55%,书面作业占总评成绩的20%。

(四)华盛顿大学

华盛顿大学(Washington University)编译课程的名称是《Introduction to Compiler Construction》,使用的参考教材是《Engineering a Compiler 》、《Modern Compiler Implementation in Java》、《Engineering a Compiler》(Cooper & Torczon)。课程实验项目是将一个用 Java 写的简单编译器完善成一个支持MiniJava(Java 语言子集)的功能完整的编译器。课程成绩的评定主要由实践项目40%,书面作业15%,期中考试15%,期末考试25%四部分组成。

  二、国内高校编译原理课程实践教学情况

(一) 国防科学技术大学

国防科学技术大学的编译课程总学时为54学时,其中讲授48学时,课内上机6学时,学分3分。使用的教材是陈火旺院士领衔编著、国内高校广泛使用的《程序设计语言编译原理》,参考教材指定的是称之为“龙书”的《CompilersPrinciples,Techniques and Tools》。该校实验课程设置了两个实验:①以PL语言(结构化语言的子集)为背景,实习编译程序的构造方法②了解编译程序构造工具Lex、Yacc 和 JavaCC 的使用。实验成绩占总评成绩的 20%。

(二)武汉大学

武汉大学的编译课程是国家级精品课程,课程总学时为90学时,期中课堂讲授为54学时,实验为36学时,学分为3学分。武汉大学使用的教材是自编的教材《编译原理》(何炎祥编著),参考书指定的是《Complier ConstructionPrinciples and Practice》。课程实验的安排有两种方式:第一种是先在课堂上举出一个完整的小语言编译程序实现的例子,要求学生读懂编译程序实现的代码和算法,在此基础上,将该语言进行扩充,然后将扩充后的语言作为实习内容,要求学生完成扩充部分的程序。第二种方式是提供程序框架,简单部分直接提供源代码,关键模块的代码空缺,要求学生在掌握程序算法,读懂程序的情况下完成关键模块的代码编写。

(三)清华大学

清华大学的编译课程教材选用的是吕映芝等自行编写的《编译原理》教材,参考书为:(美)劳顿著,冯博琴等译的《编译原理及实践》。清华大学编译原理课程的教学学时为48学时,实验由两部分组成,第一部分为课堂实验内容,第二部分为期末的课程设计。课堂实验内容充分体现了对学生个人能力的尊重。该部分的实验题目有三个,由学生根据自己的能力自选,三个题目难度从低到高,分数所占总评的比例分别是 30%、50%和 20%。作为课程设计,清华的编译原理课程教学的理念是避免传统教育中存在的“种基础,轻实践”,现在的观念是要求学生“学中练,练中学;练中闯,练中创”的观念。考虑到JAVA在全球软件开发中占据将近20%份额的现状,要求学生使用现有的词法器和语法器自动生成工具(如Jlex、CUP)实现一个JAVA编译器。

(四)吉林大学

吉林大学的编译原理课程是教育部—微软精品课程,教材是自行编写的《编译程序构造原理和实现技术》(金成植著)。课程总教学学时为72学时,实验课学时为32学时。该校专门开设了独立的编译原理实践课程,共包含8 个实验:词法分析程序开发、递归下降分析法、LL(1)语法分析、符号表管理、语义分析、中间代码生成、中间代码优化和目标代码生成。

 三、 国内外大学编译原理实践课程特点分析

(一)国外大学

总体来看,国外高校的编译课程非常重视实验,实验内容量大且要求高,涉及到了编译程序的每个阶段以及面向对象语言编译器实现、代码优化等高级内容。对于学生完成的标准,作业提交的时间等要求都很高,学生提交的实验作业须保证学生自己完成,严禁抄袭。另外,课程通常除有一名主讲教师外,会根据上课学生的人数配备一定数量的助教,及时解答学生疑问,协助教师检查实验作业。

(二)国内大学

相比较国外大学实验多,要求严的特点,国内高校编译原理实践课程的设置主要有以下几个特点:

1、授课学时方面

对于和实践教学配套的理论教学来说,国内大学理论教学的学时普遍高于实践学时,教师课堂授课内容较多,较细,而且几乎没有讨论学时。

2、实践成绩占课程总评成绩的比例

在实践课程的监督上,普遍缺少对学生实验环节的督促。对于实践成绩在总评成绩所占的比例而言,国内大学的实践成绩普遍都控制在20%左右,很少有超过30%,而期末考试成绩占分比例较大,基本都达到70%,这就容易导致学生重理论,轻实践的情况发生,也会使学生失去动手实践的兴趣。

3、实践内容和方式

相比较国外大学要求学生必须完成一个较为完整的编译系统,国内大学对实践内容的安排上,主要分成以下三种情况:

(1)多次小实验设置方式

在进行理论课教学的同时,为了加深学生对相关内容的理解,在相应的实践课内安排多次小型实验,分别支持编译程序的词法分析,语法分析,语义分析及中间代码的优化以及目标代码的生成等阶段。这种安排的优点是实验进度一般和理论授课的进度同步,学生可以通过每一部分的实验加强对课堂学习知识的理解,能够掌握编译的有关技术,而且这种实验难度相对较低,也激发学生学习的积极性和主动性。但这种方法的缺点是人为的分裂了编译程序的完整性,因此学生不能学习到一个完整的编译器的开发运行过程。

(2)综合实验设置方式

考虑到第一种情况的缺陷,有些高校的编译原理实验内容是由教师先设计一

种简单的语言,然后要求学生针对这种语言设计和实现一个相对完整、独立的编译器。或者考虑到学生的实际情况,在进行编译原理的实践时,要求学生对现有的编译程序进行研习,对语言进行扩充,然后在修改相应的编译器,达到对编译程序实践的效果。这种方式实验课程的难度是根据语言规模的不同以及学生扩充程度的不同而有差别,弹性较大,有利于加强学生对编译程序的整体认识,且可以做到因材施教,能充分锻炼每一个学生解决问题的能力和编程能力。

(3)编译工具实践方式

第三种情况是对某一特定的语言,借助 Flex (或Lex)和 Bison(Yacc) 等

自动工具,直接生成词法分析程序和语法分析程序,然后组装成完整的编译程序。这种方式的实践,要求学生必须花费大量的时间研究开发工具的基本原理及使用方法,通过学习,学生对编译程序前端的理论知识有一很好的学习和提高过程,但对编程能力的提高不多。

    四、我校编译原理实践课程开设的探索

通过比较和分析国内外大学计算机专业编译原理实践课程开设的优缺点,针对我院学生的特点,对于编译原理实践课程,拟做以下尝试:

(一)课程组织方式的改革

借鉴国外大学主讲教师配备助教制的教学模式,在理论授课和课内实验以及课程设计中,主讲教师配备一定数量的助教,由助教协助主讲教师一起完成实验课程的顺利进行,随时解决学生存在的问题。

(二)减少课堂授课内容,增加课外讨论内容

从以上的分析可以看出,国外著名高校编译原理课程的课堂教学学时都较少,更多的时间留给学生进行自学和完成实践作业。因此,在学校人才培养方案学时有限的情况下,减少编译原理课程理论教学的学时,课堂授课内容适当减少,增加学生的课外阅读内容,是一个解决课堂教学和实践教学学时冲突的有效可行的方法。当然,在将课内教学内容转移到课外自学中时,增加必要的监督措施是督促学生课外阅读和提高阅读质量的前提条件。因此,在教学的实施过程中,对学生进行分组,借鉴国外教学和研究生教学中讨论的授课方式,在课外在主讲教师的布置和助教的监督下组织学生对阅读内容进行讨论,并将每次讨论的成绩作为期末评分的依据。

(三) 实践课程的改革

为了提高学生的动手能力和锻炼学生的逻辑思维能力,将编译原理的实践课程分为两部分:

1、课内实验

主要根据编译程序的词法分析,语法分析,语义分析和中间代码生成及代码优化和目标代码的生成过程,分成几个小实验,在计划内学时完成,需要16学时左右。

2、课程设计

要求学生在课内小实验的基础上,在Unix或Windows平台下完成完整的编译器。时间为课程结束后一个礼拜。完成一种自定义语言的完整的编译器。时间为课程结束后一个礼拜内完成。

(四)实践课程考核细则

1、课程的实践成绩占总成绩的50%,其中课内实验占30%,课程设计占20%。

2、实践成绩评定方法

实验成绩的评定主要从操作过程是否正确、结果是否正确、工作量、质量、是否及时完成、实验报告质量等多方面进行考核,根据最终实验完成情况以及实验过程的表现进行评分,在评分中主要考虑以下各项指标,各项指标的评定标准为:

l  程序的正确性(60%):包括所完成的设计思路是否清晰,算法是否正确,数据结构的选择是否适当等方面评价。

l  实验报告(20%):包括报告的完成情况及质量、报告结构是否符合要求,功能算法描述是否清晰完整、各种图例结构是否正确等。

l  程序分格(10%):所写程序是否有注释,变量名起名是否符合规则等。

l  创新性(10%):完成设计是否有新意或者创意,对于常见系统设计是否具有独到之处。

l  有无抄袭现象:如果发现有抄袭现象,相关人员本次实验成绩均为零分。

l  是否按时交:在提交时间每向后拖一天,扣两分。

    五 结束语

总之,在编译原理实践课程的设置中,根据学生水平层次和培养目标的不同,通过对国内外大学编译实践课程设置的比较,找到最优的,最适合我院学生的编译实践教学方案,最大限度的培养学生的逻辑思维能力、编程和综合应用能力。

参考文献:

[1] 斯坦福大学编译课程网站.[2012-11-21]:http://www.stanford.edu/class/cs143/.

[2] 卡内基梅隆大学编译课程网站[2012-11-21]:

http://www.cs.cmu.edu/~fp/courses/15411-f08/index.html

[3 ]加州大学伯克利分校.编译课程网站[2012-11-21]:http://inst.eecs.berkeley.edu/~cs164/fa12/

[4] 华盛顿大学编译课程网站[2012-11-21]:http://www.cs.washington.edu/education/courses/cse401/11au/

[5] 国防科学技术大学. 编译原理精品课程网站. [2012-11-21]:http://eol.ctbu.edu.cn/resource/data/jpk/2007139.htm.

[6] 武汉大学编译原理精品课程教学网站[2012-11-21]:http://cs.whu.edu.cn/cs2011/jpkc_Cons.php?id=774

[7] 吉林大学编译原理精品课网[2012-11-21]:http://www.jlu-softlab.cn/education/compiler.

基金项目:新疆农业大学教学研究项目“编译原理课程实验项目研究与实践”(201033)

作者简介:冯向萍,女,副教授,在读博士,主要从事编译原理课程的教学和相关的科研工作。

国内外编译原理课程实践教学现状分析相关推荐

  1. PL/0语言编译器扩展 编译原理课程实践(1)

    转眼大学生活就要结束,编译原理课程学的东西很多都忘记了.当时我们编译原理课程实践是PL/0语言编译器扩展,在原有PL/0语言文法进行扩展.我写这次博文一是为了回忆以前学的知识,加深记忆:二是和大家分享 ...

  2. 编译原理课程实践——实现一个初等函数运算语言的解释器或编译器

    编译原理课程实践--实现具有初等函数运算语言的解释器或编译器 作者:Sylvan Ding |转载请注明文章出处! 摘要:本文主要内容是设计词法分析器.语法分析器(LL(1).SLR(1))和语义分析 ...

  3. lr1分析器c语言实验报告怎么写,编译原理课程的设计构造LR分析法语法分析器.doc...

    编译原理课程的设计构造LR分析法语法分析器 太 原 学 院 课程设计报告书 课程名称 设计题目 构造LR(0)分析法语法分析器 专业班级 学 号 姓 名 指导教师 2016年 12 月 15日 目 录 ...

  4. 【20200429】编译原理课程课业打卡十九之判断OPG文法求解句子分析过程

    [20200429]编译原理课程课业打卡十九之判断OPG文法&求解句子分析过程 一.课业打卡十九之判断OPG文法&求解句子分析过程 二.知识巩固 1.判断OPG文法 2.求算符优先函数 ...

  5. 编译原理课程设计-对pl0语言进行扩充

    文章目录 一. 设计目的及要求 1.1 设计目的 1.2 设计要求 1.2.1 要求一 1.2.2 要求二 1.2.3 要求三 二.程序设计 2.1 程序的组织结构 2.1.1 PL/0编译程序函数定 ...

  6. 编译原理公式计算器C语言,编译原理课程设计-简单计算器实现.doc

    编译原理课程设计-简单计算器实现 课程设计报告课程:编译原理学号:姓名:班级:11级嵌入式应用技术班教师:时间:2014年6月计算机科学与技术系 设计名称:简单计算器的实现设计内容.目的与要求:设计内 ...

  7. 编译原理课程设计词法分析

      编译原理课程设计词法分析任务书 5)参考文献: (1)张素琴,吕映芝. 编译原理[M]., 清华大学出版社 (2)蒋立源.康慕宁等,编译原理(第2版)[M],西安:西北工业大学出版社 6)课程设计 ...

  8. 课程设计是计算机科学与技术专业的一门,计算机107编译原理课程设计.doc

    淮阴工学院 编译原理课程设计指导书 王文豪 江苏·淮阴工学院·计算机工程系 二OO九年三月 前言 <编译原理>是计算机科学与技术专业最重要的一门专业基础课程,内容庞大,涉及面广,知识点多. ...

  9. 编译原理课程作业-Cminus语言的词法及语法分析器实现

    Cminus Compiler 编译原理课程作业-Cminus语言的词法及语法分析器实现 设计思想 词法分析 使用确定有限态自动机(DFA)实现与Lex自动分析两种方式实现. 语法分析 使用递归下降方 ...

最新文章

  1. HarmonyOS 怎样打印log/日志的打印
  2. cnetos6,centos7添加新网卡,系统不识别的解决办法
  3. 233. Number of Digit One
  4. [转]C++中extern C的含义
  5. python运行不了程序代码_Python源码分析2 - 一个简单的Python程序的执行
  6. 红橙Darren视频笔记setContentView源码分析 xml加载的过程
  7. 光纤 matlab,matlab – 均衡光纤通道的最小均方
  8. 铁路售票系统_黑龙江一学生购买的火车票上惊现“学猪”字样!铁路部门给出回应...
  9. PAT1046. 划拳
  10. 潘石屹没跑,他去学 Python 了
  11. java emoji显示乱码_菜鸟笔记(一) - Java常见的乱码问题
  12. Eclipse 更新Android SDK后,新建项目出现appcompat_v7project的相关问题
  13. 基于小脑模型神经网络轨迹跟踪matlab程序
  14. 网络虚拟化之虚拟交换机技术Linux Bridge
  15. Ubuntu安装bluefish2.0.最新版本方法
  16. EDI集成对业务的重要性
  17. 泡泡网 前有古人后有来者! 胶水处理器回顾
  18. 解决jinja2模板中包含大括号的情况
  19. c语言或运算怎么没起作用,C语言学不会? 这样学习, 才有效果!
  20. 开源Star10K+数据库工具Beekeeper上手体验,免费够酷值得拥有

热门文章

  1. 如何在winows的PPT里面使用醒目的思源系列字体(思源宋体/黑体)
  2. IDEA初学者保存就格式化代码插件save actions
  3. C++未经处理的异常...stackoverflow(参数: 0x0000000000000001...)-- 分配大内存
  4. fanuc机器人刷机教程_FANUC机器人中文简易教程
  5. 基于javaweb+JSP+Servlet简单购物车
  6. 解决MacOS12.6自带的屏幕录制闪退的问题
  7. ENVI安装步骤和常见问题及解决办法(以ENVI5.3为例)
  8. 工作中的完美主义心态
  9. 程序员的vbs强势表白
  10. 关于大华onvif搜索不到的解决