Upload
others
View
22
Download
0
Embed Size (px)
Citation preview
编译原理课程与系统能力培养
张 昱
中国科学技术大学 计算机科学与技术学院http://staff.ustc.edu.cn/~yuzhang
第二届计算机专业系统能力培养综合改革经验交流与报告会[2016.5.6‐8,合肥] 1
02 多层次的编译原理课程
内容概要
教学上采取的策略04
中科大的程序语言系列课程简介01
03 编译原理课程实践案例
第二届计算机专业系统能力培养综合改革经验交流与报告会[2016.5.6‐8,合肥]
总结05
2
02 多层次的编译原理课程
内容概要
教学上采取的策略04
中科大的程序语言系列课程简介01
03 编译原理课程实践案例
第二届计算机专业系统能力培养综合改革经验交流与报告会[2016.5.6‐8,合肥]
总结05
3
中科大程序语言系列课程简介
程序设计语言课程
程序设计I(C语言) 40/30学时,2.5学分,一上,通修
程序设计II 40/40,3,一下,通修
Java软件开发基础 2学分,选修
编译原理和技术: 60/40学时,4学分,三上,专业核心课
程序设计语言基础:60/20,3.5学分,三下,专业方向课
JavaScript中的闭包、动态绑定;函数式语言;并发……
并行计算:2.5学分
程序设计语言理论:研究生课程
第二届计算机专业系统能力培养综合改革经验交流与报告会[2016.5.6‐8,合肥] 4
02 多层次的编译原理课程
内容概要
教学上采取的策略04
中科大的程序语言系列课程简介01
03 编译原理课程实践案例
第二届计算机专业系统能力培养综合改革经验交流与报告会[2016.5.6‐8,合肥]
总结05
5
多层次的编译原理课程
计算机专业
分两个级别,同时间段授课,学生可以选择
英才班(30+)从2010级开始
加大实验强度,基础实验+扩展实验,占总分50%
普通班
基础实验,实验占总分20~30%
学生均要开发出小型实验型语言的编译器
计算机双学位
周六上课,4节/次,弱化实验(2个),内容适当删减
第二届计算机专业系统能力培养综合改革经验交流与报告会[2016.5.6‐8,合肥] 6
普通高校本科/双学位的教学目标
通过编程语言实现技术的学习,提高:
学习、理解编程语言的能力
在程序开发中应用编程语言的能力
提高程序排错的能力
即快速理解、定位和解决在程序开发与程序运行
中碰到的问题的能力
提高编写高质量代码的能力
第二届计算机专业系统能力培养综合改革经验交流与报告会[2016.5.6‐8,合肥] 7
重点高校本科的教学目标
通过对和编程语言相关的理论和技术的学习,提高
学习、理解编程语言的能力
在程序开发中应用编程语言的能力
在软件工程中应用这些理论和技术的能力
形式语言和自动机理论
语法制导的翻译技术
类型论和类型系统
数据流分析的理论基础
第二届计算机专业系统能力培养综合改革经验交流与报告会[2016.5.6‐8,合肥] 8
中科大编译原理课程实验历史
1984~1993:实现扩展PL/0语言到扩展PL/0抽象机的编译器、
实现扩展PL/0抽象机的解释器 数组类型和函数类型
1994~2001:单独的实践课
布尔类型、exit/break语句和布尔表达式短路计算等
2002~2006 :本科学制五年改成四年,单独的实践课被取消,
仅开展熟悉Lex和Yacc的课程小实验
2007~2010 :以“源语言 ‐抽象语法树 ‐低级中间表示 ‐汇编代
码的内部表示 ‐ x86/MIPS汇编”为主线,每个学生完成编译器
的前端(后端),自行选择合作伙伴,分组逐个答辩
2011春,2012春:PL/0扩展
2012秋至今:分英才班、普通班
循序渐进的小实验 [ + 综合实验]
第二届计算机专业系统能力培养综合改革经验交流与报告会[2016.5.6‐8,合肥] 9
中科大专业实践改革(编译原理2006-)
指导思想
首先抓课程实验改革,课程实验要整体规划
像讨论教学计划那样来讨论技术水平的培养:语言、工具、
平台的覆盖范围和相互之间的衔接。
其覆盖程度依赖于
制度的保证、学科机构的资源、教职人员的利益
软件类的课程实验
• 学生至少参与完成一个有一定规模的软件项目的设计
与开发, 涉及对多门课程所学原理的综合运用
• 遵循由小到大、循序渐进的原则
• 整体规划课程实践涉及的语言、工具和环境
• 注意培养工程意识、质量意识和团队意识
第二届计算机专业系统能力培养综合改革经验交流与报告会[2016.5.6‐8,合肥] 10
中科大专业实践改革(编译原理2006-)
软件类的课程实验
低年级的课程实验(如C语言、数据结构)
以巩固课程知识的小实验为主
训练学生基本的程序设计技能
高年级的课程实验(如编译原理、操作系统等)
以综合运用的课程设计为主
训练学生软件工程的能力
培养学生的系统能力
第二届计算机专业系统能力培养综合改革经验交流与报告会[2016.5.6‐8,合肥] 11
中科大2006-2010实验方案的主线
第二届计算机专业系统能力培养综合改革经验交流与报告会[2016.5.6‐8,合肥] 12
源语言程序
分析器高级中间表示
(AST) 解释器
变换器(AST2LIR)
汇编代码的内部表示 汇编代码
(如x86, MIPS)
低级中间表示(如三地址码)
寄存器分配器
检查器 正确?
变换器(IR优化器/IR之间的转换器)
代码生成器
以“源语言-抽象语法树-低级中间表示-汇编代码的内部表示-x86/MIPS汇编”为主线搭建的、基于组件的编译原理实验体系
中科大2006-2010实验方案的主线
第二届计算机专业系统能力培养综合改革经验交流与报告会[2016.5.6‐8,合肥] 13
源语言程序
分析器高级中间表示
(AST) 解释器
变换器(AST2LIR)
汇编代码的内部表示 汇编代码
(如x86, MIPS)
低级中间表示(如三地址码)
寄存器分配器
检查器 正确?
变换器(IR优化器/IR之间的转换器)
代码生成器
以“源语言-抽象语法树-低级中间表示-汇编代码的内部表示-x86/MIPS汇编”为主线搭建的、基于组件的编译原理实验体系
张昱, 陈意云.编译原理实验教程. 北京:高等教育出版社, 2009.5.(附光盘)
02 多层次的编译原理课程
内容概要
教学上采取的策略04
中科大的程序语言系列课程简介01
03 编译原理课程实践案例
第二届计算机专业系统能力培养综合改革经验交流与报告会[2016.5.6‐8,合肥]
总结05
14
编译原理课程实践案例
2012级(2015年秋季学期)英才班课程实践安排
http://staff.ustc.edu.cn/~yuzhang/compiler/
https://www.zybuluo.com/sangyy/note/166600
7个基础实验:和讲授内容配套,循序渐进
最后1个扩展实验:自由选题,1月份逐个答辩
实验环境:Linux+命令行编译运行(Makefile、shell脚本)
学生平时在个人电脑上实验
助教上讨论课、QQ交流等
长期在线的服务器:git版本管理,学生专有的库
助教:以往的研究生近年的大四学生(上届学本课程)
第二届计算机专业系统能力培养综合改革经验交流与报告会[2016.5.6‐8,合肥] 15
编译原理课程实践案例 - 基础实验
P1 预备阶段
熟悉实验环境:Linux、LLVM 3.6.0、GCC,Makefile
熟悉C1语言的特征:编写C1程序,用GCC/Clang编译
初步了解编译的过程
提交的目录结构要求
• README
• Makefile
• src/
• doc/
• bin/ :shell脚本
• test/第二届计算机专业系统能力培养综合改革经验交流与报告会[2016.5.6‐8,合肥] 16
编译原理课程实践案例- 基础实验
P2 词法分析
学习LLVM提供的教程Kaleidoscope
• 理解其中的词法分析过程
• 对上述词法分析进行扩展:多行注释、八进制数
• 修改扩展后的词法分析部分,使之输出记号流
学习使用Flex,用Flex生成C1的词法分析器
阅读Clang源代码中的词法分析文件,并回答问题
提交的目录结构要求
第二届计算机专业系统能力培养综合改革经验交流与报告会[2016.5.6‐8,合肥] 17
编译原理课程实践案例- 基础实验
P3 Kaleidoscope语法分析
理解Kaleidoscope的语法分析和抽象语法树
扩展while循环
P4 C1语言的语法分析与错误恢复
学习Bison
用Flex+bison为C1语言构造能识别正确 C1程序的分析器
提交的目录结构要求
第二届计算机专业系统能力培养综合改革经验交流与报告会[2016.5.6‐8,合肥] 18
编译原理课程实践案例- 基础实验
P5 生成C1的抽象语法树(AST)
理解所提供的asgn2ast样例
为C1生成AST
P6 Clang源码阅读:理解语法分析和静态检查
用ninja编译clang,了解其中由td描述文件自动生成代
码的技术
阅读clang源码中的部分源程序文件,来理解clang的语
法分析和静态语义检查的实现机制
了解clang编译工具的构造(可选的库+驱动程序)
P7代码生成:为C1程序生成LLVM IR代码第二届计算机专业系统能力培养综合改革经验交流与报告会[2016.5.6‐8,合肥] 19
编译原理课程实践案例- 综合实验
基础实验扩展:22人
基于流水技术的并行化数据流语言:2人合作
静态存储布局优化
重复代码检测:3人合作
小型MASM汇编语言编译器
GO语言调研
Python编译器调研
ucc扩展
第二届计算机专业系统能力培养综合改革经验交流与报告会[2016.5.6‐8,合肥] 20
02 多层次的编译原理课程
内容概要
教学上采取的策略04
中科大的程序语言系列课程简介01
03 编译原理课程实践案例
第二届计算机专业系统能力培养综合改革经验交流与报告会[2016.5.6‐8,合肥]
总结05
21
教学上采取的策略
介绍许多从实际编译和运行时碰到的问题
多以C语言作为实例语言
学过、非类型安全的语言、可生成汇编便于阅读
引导用所学知识去分析、解决、理解实际编程中的问
题和发生的现象 让学生出题
不同的编码方法、不同的实现技术产生的不同影响
介绍现代常用语言的编译运行系统的结构
编译、连接生成本地码:C汇编码
即时编译器+垃圾收集:Java虚拟机、JavaScript引擎
安卓代码的编译、运行:Delvik ART第二届计算机专业系统能力培养综合改革经验交流与报告会[2016.5.6‐8,合肥] 22
例题1 全局存储分配
下面的程序运行时输出3个整数。试从运行时存储空间
的组织和printf的实现来分析,为什么此程序会有3个整数
输出?
main() {printf(“%d, %d, %d\n”);
}
第二届计算机专业系统能力培养综合改革经验交流与报告会[2016.5.6‐8,合肥]
… …
main控制链
printf返回地址
printf控制链
printf局部变量ebpesp
栈
低
高
格式串指针其它参数
main返回地址
23
例题2 编译和连接
cc是UNIX系统上C语言编译命令, l是连接库函数的选
择项。某程序员自己编写了两个函数库 libuser1.a和libuser2.a,当用命令
cc test.c luser1.a luser2.a编译时,报告有未定义的符号,而改用命令
cc test.c luser2.a luser1.a时,能得到可执行程序。试分析原因
(备注:库名中的lib在命令中省略。该命令和命令cc test.clibuser1.a libuser2.a的效果一致)
第二届计算机专业系统能力培养综合改革经验交流与报告会[2016.5.6‐8,合肥] 24
例题2 编译和连接
cc test.c luser1.a luser2.acc test.c luser1.a luser2.a
解答
test.c libuser1.a libuser2.a引用a 定义b 定义a
引用b
test.c libuser2.a libuser1.a引用a 定义a 定义b
引用b
第二届计算机专业系统能力培养综合改革经验交流与报告会[2016.5.6‐8,合肥] 25
例题3 代码生成
下面的程序在X86/Linux机器上编译后的运行结果是7,
而在SPARC/SUNOS机器上的运行结果是6。试分析运行结
果不同的原因
main(){
long i;
i = 0;printf("%ld\n", (++i)+(++i)+(++i) );
}
第二届计算机专业系统能力培养综合改革经验交流与报告会[2016.5.6‐8,合肥] 26
例题3 代码生成
按一般的代码生成,i = i +1的计算结果保留在寄存器中,因此这三个i = i +1的计算次序不会影响最终的结果。结果应该是6
第二届计算机专业系统能力培养综合改革经验交流与报告会[2016.5.6‐8,合肥]
++
= ==
i
i +
1 i
i +
1 i
i +
1
27
例题3 代码生成
按一般的代码生成,i = i +1的计算结果保留在寄存器中,因此这三个i = i +1的计算次序不会影响最终的结果。结果应该是6
第二届计算机专业系统能力培养综合改革经验交流与报告会[2016.5.6‐8,合肥]
++
= ==
i
i +
1 i
i +
1 i
i +
1
结果是7的话,一定是某个i = i +1的结果未保
留在寄存器中。上层计算对它的引用落在计算另一个i = i +1的后面
28
02 多层次的编译原理课程
内容概要
教学上采取的策略04
中科大的程序语言系列课程简介01
03 编译原理课程实践案例
第二届计算机专业系统能力培养综合改革经验交流与报告会[2016.5.6‐8,合肥]
总结05
29
总结
教学与实践内容选择的建议
第1门程序语言:细讲、GUI命令行、WindowsLinux
以后的语言课学习:相比以前语言的特点、实现
养成查语言规范、编译器版本的说明来了解语言特征
程序设计方法学及一定规模的程序的程序设计
编译原理和技术(针对一般的高校)
淡化对分析器的自动生成技术的叙述
增强对实际编译、运行问题的分析
引入编译器源码的阅读
第二届计算机专业系统能力培养综合改革经验交流与报告会[2016.5.6‐8,合肥] 30
资源
教师的课程主页
http://staff.ustc.edu.cn/~yuzhang/compiler
http://staff.ustc.edu.cn/~qlzheng/compiler
中科大省级精品课程资源
http://www.bb.ustc.edu.cn/jpkc/sheng_ji.html
2013年《编译原理和技术》省级精品资源共享课
2009年《编译原理》省级精品课程
两年1次的龙星计划课程(2014、2016)
http://dragonstar.ict.ac.cn/dragonstar/curriculum.asp
欢迎省内同仁反馈、交流探讨!第二届计算机专业系统能力培养综合改革经验交流与报告会[2016.5.6‐8,合肥] 31
Q&A
谢谢!
第二届计算机专业系统能力培养综合改革经验交流与报告会[2016.5.6‐8,合肥] 32