当前位置: 首页 > news >正文

专家访谈:《编译技术》课程教学的一些体会

 

《编译技术》课程教学的一些体会

 

北京航空航天大学 计算机学院

 张莉

 

       可能是因为北航工科院校的特点,我们的编译课程一直采用了《编译技术》这个名字,意在强调编译系统的构造及其相关技术。

    

       曾经一度,有人讲我们的学生毕业后很少做编译器了,是否不用学编译课程了。我不这样认为。虽然,我们重在介绍编译系统的构造和相关技术,但是在这个过程中,我们介绍了计算机领域三个非常重要的概念和技术:1)高级程序设计语言的工作原理;2)一种程序/模型转换的方法:实现模型从一种语言表达形式到另一种语言表达形式的(语义)等价转换技术;3)软件系统的概念。毕竟对于大多数本科生而言,编译系统是他们构造的第一个相对完整的软件系统。而之前更多是针对语言、数据结构和算法的程序设计练习。

      

       基于这三个定位,我们在教学过程中考虑如何将这三点有机的结合起来,贯穿整个教学过程。尽可能做到问题驱动、目标驱动,重视系统性,让大家理解为什么要学习“枯燥”的理论部分。


       第一,大家都认为编译课难学、难讲,尤其是理论部分。经过多年的教学,我发现学生更多的是不理解为什么要学那么多理论、那么多分析方法,不能很好的建立之间的逻辑关系;还有就是不理解学编译有什么用。对此,我们采用问题驱动的方法,在讲解过程中不断提出问题。如讲语法分析部分,介绍了递归子程序法,可以编写某些语法的编译程序,但是我们必须对于每一个文法手工编写相应的编译程序,于是一个问题是:是否可以找到一种机器自动生成编译程序的方法呢?由此,逐渐引出LL(1)分析法。再由自顶向下分析法的不足引出自底向上分析法。从而保证整个课程有一条清晰的线索贯穿各个知识点,并在讲解过程中不断强化这条线索。

      

       第二,是编译课程的实践性。这是一门实践性很强的课程。学生要真正理解编译系统,往往是在做完编译课程设计之后。为此,我们要求所有的学生都要完成一个编译系统(从词法分析到程序执行),无论大小、复杂与否,从而真正理解整个编译过程,以及系统的运行过程。为到达这个目标,我们设计了不同难度系统的题目:包括不同复杂程度的文法、生成不同的代码(从伪代码,到X86汇编、MIPS汇编指令等)、是否要求进行代码优化以及不同的代码优化要求等,从而满足不同基础的学生进行课程实践的要求。

    

       第三,是考虑编译技术的实用性。作为一门介绍高级程序设计语言原理的课程,对于编写高质量的程序是非常实用的。学了编译技术,学生理解了编译过程和程序执行过程,对于提高学生的程序调试能力是非常有用的。为此,我们也介绍了一些调试工具,提高学生的编程水平。

 

 

 

       编译课程面临很多挑战:随着技术的发展和社会的需求,如何平衡基础性和实用性、前端和后端(尤其是优化技术)的讲解比例、基础性和前沿性(新的语言特征的处理、并行编译技术、面向对象编译技术)......希望和更多的同仁聚在一起,交流编译课程教学中取得的经验,研讨面临的挑战和问题。

相关文章:

  • 张亚勤推荐《观止——微软创建NT和未来的夺命狂奔》
  • Python开发技术详解
  • 专家访谈:《编译原理》课程教学的探讨
  • 谁能成为“代码勇士”(3)——《观止》
  • 谁能成为“代码勇士”(4)——《观止》
  • 《Windows高级调试》评价
  • 代码之王(1) ——《观止》
  • 《正在爆发互联网革命》封面征集活动开始了
  • 沉寂十五年后,首次与中国读者见面,微软全球副总裁张亚勤推荐《观止》
  • Beautiful Data 诚征译者
  • 一个比尔盖茨都怕的人?他是谁?
  • 《观止》让我一夜未眠
  • 《观止》-观而不止
  • 紧急通知:《观止-微软》请在经管柜购买!
  • 《观止》是一部关于人和感情的书
  • 实现windows 窗体的自己画,网上摘抄的,学习了
  • 【399天】跃迁之路——程序员高效学习方法论探索系列(实验阶段156-2018.03.11)...
  • classpath对获取配置文件的影响
  • JAVA SE 6 GC调优笔记
  • JS笔记四:作用域、变量(函数)提升
  • Puppeteer:浏览器控制器
  • Quartz实现数据同步 | 从0开始构建SpringCloud微服务(3)
  • React16时代,该用什么姿势写 React ?
  • Redis在Web项目中的应用与实践
  • SpringBoot几种定时任务的实现方式
  • SQLServer之创建显式事务
  • ucore操作系统实验笔记 - 重新理解中断
  • 道格拉斯-普克 抽稀算法 附javascript实现
  • 等保2.0 | 几维安全发布等保检测、等保加固专版 加速企业等保合规
  • 对JS继承的一点思考
  • 关于 Linux 进程的 UID、EUID、GID 和 EGID
  • 腾讯大梁:DevOps最后一棒,有效构建海量运营的持续反馈能力
  • 问题之ssh中Host key verification failed的解决
  • 源码安装memcached和php memcache扩展
  • [Shell 脚本] 备份网站文件至OSS服务(纯shell脚本无sdk) ...
  • ​LeetCode解法汇总307. 区域和检索 - 数组可修改
  • ​LeetCode解法汇总518. 零钱兑换 II
  • #[Composer学习笔记]Part1:安装composer并通过composer创建一个项目
  • $Django python中使用redis, django中使用(封装了),redis开启事务(管道)
  • $L^p$ 调和函数恒为零
  • (31)对象的克隆
  • (附源码)ssm考生评分系统 毕业设计 071114
  • (附源码)ssm失物招领系统 毕业设计 182317
  • (附源码)流浪动物保护平台的设计与实现 毕业设计 161154
  • (理论篇)httpmoudle和httphandler一览
  • (六)库存超卖案例实战——使用mysql分布式锁解决“超卖”问题
  • (亲测成功)在centos7.5上安装kvm,通过VNC远程连接并创建多台ubuntu虚拟机(ubuntu server版本)...
  • (十)c52学习之旅-定时器实验
  • (四)模仿学习-完成后台管理页面查询
  • (一)使用Mybatis实现在student数据库中插入一个学生信息
  • *Django中的Ajax 纯js的书写样式1
  • .net core 6 集成和使用 mongodb
  • .Net Memory Profiler的使用举例
  • .NET 程序如何获取图片的宽高(框架自带多种方法的不同性能)
  • .NET/C# 推荐一个我设计的缓存类型(适合缓存反射等耗性能的操作,附用法)