32
编译原理课程与系统能力培养 张昱 中国科学技术大学 计算机科学与技术学院 http://staff.ustc.edu.cn/~yuzhang 第二届计算机专业系统能力培养综合改革经验交流与报告会[2016.5.68,合肥] 1

编译原理课程与系统能力培养 - USTCstaff.ustc.edu.cn/~yuzhang/compiler/slide/slide20160508.pdf02多层次的编译原理课程 内容概要 04 教学上采取的策略 01

  • Upload
    others

  • View
    22

  • Download
    0

Embed Size (px)

Citation preview

Page 1: 编译原理课程与系统能力培养 - USTCstaff.ustc.edu.cn/~yuzhang/compiler/slide/slide20160508.pdf02多层次的编译原理课程 内容概要 04 教学上采取的策略 01

编译原理课程与系统能力培养

张 昱

中国科学技术大学 计算机科学与技术学院http://staff.ustc.edu.cn/~yuzhang

第二届计算机专业系统能力培养综合改革经验交流与报告会[2016.5.6‐8,合肥] 1

Page 2: 编译原理课程与系统能力培养 - USTCstaff.ustc.edu.cn/~yuzhang/compiler/slide/slide20160508.pdf02多层次的编译原理课程 内容概要 04 教学上采取的策略 01

02 多层次的编译原理课程

内容概要

教学上采取的策略04

中科大的程序语言系列课程简介01

03 编译原理课程实践案例

第二届计算机专业系统能力培养综合改革经验交流与报告会[2016.5.6‐8,合肥]

总结05

2

Page 3: 编译原理课程与系统能力培养 - USTCstaff.ustc.edu.cn/~yuzhang/compiler/slide/slide20160508.pdf02多层次的编译原理课程 内容概要 04 教学上采取的策略 01

02 多层次的编译原理课程

内容概要

教学上采取的策略04

中科大的程序语言系列课程简介01

03 编译原理课程实践案例

第二届计算机专业系统能力培养综合改革经验交流与报告会[2016.5.6‐8,合肥]

总结05

3

Page 4: 编译原理课程与系统能力培养 - USTCstaff.ustc.edu.cn/~yuzhang/compiler/slide/slide20160508.pdf02多层次的编译原理课程 内容概要 04 教学上采取的策略 01

中科大程序语言系列课程简介

程序设计语言课程

程序设计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

Page 5: 编译原理课程与系统能力培养 - USTCstaff.ustc.edu.cn/~yuzhang/compiler/slide/slide20160508.pdf02多层次的编译原理课程 内容概要 04 教学上采取的策略 01

02 多层次的编译原理课程

内容概要

教学上采取的策略04

中科大的程序语言系列课程简介01

03 编译原理课程实践案例

第二届计算机专业系统能力培养综合改革经验交流与报告会[2016.5.6‐8,合肥]

总结05

5

Page 6: 编译原理课程与系统能力培养 - USTCstaff.ustc.edu.cn/~yuzhang/compiler/slide/slide20160508.pdf02多层次的编译原理课程 内容概要 04 教学上采取的策略 01

多层次的编译原理课程

计算机专业

分两个级别,同时间段授课,学生可以选择

英才班(30+)从2010级开始

加大实验强度,基础实验+扩展实验,占总分50%

普通班

基础实验,实验占总分20~30%

学生均要开发出小型实验型语言的编译器

计算机双学位

周六上课,4节/次,弱化实验(2个),内容适当删减

第二届计算机专业系统能力培养综合改革经验交流与报告会[2016.5.6‐8,合肥] 6

Page 7: 编译原理课程与系统能力培养 - USTCstaff.ustc.edu.cn/~yuzhang/compiler/slide/slide20160508.pdf02多层次的编译原理课程 内容概要 04 教学上采取的策略 01

普通高校本科/双学位的教学目标

通过编程语言实现技术的学习,提高:

学习、理解编程语言的能力

在程序开发中应用编程语言的能力

提高程序排错的能力

即快速理解、定位和解决在程序开发与程序运行

中碰到的问题的能力

提高编写高质量代码的能力

第二届计算机专业系统能力培养综合改革经验交流与报告会[2016.5.6‐8,合肥] 7

Page 8: 编译原理课程与系统能力培养 - USTCstaff.ustc.edu.cn/~yuzhang/compiler/slide/slide20160508.pdf02多层次的编译原理课程 内容概要 04 教学上采取的策略 01

重点高校本科的教学目标

通过对和编程语言相关的理论和技术的学习,提高

学习、理解编程语言的能力

在程序开发中应用编程语言的能力

在软件工程中应用这些理论和技术的能力

形式语言和自动机理论

语法制导的翻译技术

类型论和类型系统

数据流分析的理论基础

第二届计算机专业系统能力培养综合改革经验交流与报告会[2016.5.6‐8,合肥] 8

Page 9: 编译原理课程与系统能力培养 - USTCstaff.ustc.edu.cn/~yuzhang/compiler/slide/slide20160508.pdf02多层次的编译原理课程 内容概要 04 教学上采取的策略 01

中科大编译原理课程实验历史

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

Page 10: 编译原理课程与系统能力培养 - USTCstaff.ustc.edu.cn/~yuzhang/compiler/slide/slide20160508.pdf02多层次的编译原理课程 内容概要 04 教学上采取的策略 01

中科大专业实践改革(编译原理2006-)

指导思想

首先抓课程实验改革,课程实验要整体规划

像讨论教学计划那样来讨论技术水平的培养:语言、工具、

平台的覆盖范围和相互之间的衔接。

其覆盖程度依赖于

制度的保证、学科机构的资源、教职人员的利益

软件类的课程实验

• 学生至少参与完成一个有一定规模的软件项目的设计

与开发, 涉及对多门课程所学原理的综合运用

• 遵循由小到大、循序渐进的原则

• 整体规划课程实践涉及的语言、工具和环境

• 注意培养工程意识、质量意识和团队意识

第二届计算机专业系统能力培养综合改革经验交流与报告会[2016.5.6‐8,合肥] 10

Page 11: 编译原理课程与系统能力培养 - USTCstaff.ustc.edu.cn/~yuzhang/compiler/slide/slide20160508.pdf02多层次的编译原理课程 内容概要 04 教学上采取的策略 01

中科大专业实践改革(编译原理2006-)

软件类的课程实验

低年级的课程实验(如C语言、数据结构)

以巩固课程知识的小实验为主

训练学生基本的程序设计技能

高年级的课程实验(如编译原理、操作系统等)

以综合运用的课程设计为主

训练学生软件工程的能力

培养学生的系统能力

第二届计算机专业系统能力培养综合改革经验交流与报告会[2016.5.6‐8,合肥] 11

Page 12: 编译原理课程与系统能力培养 - USTCstaff.ustc.edu.cn/~yuzhang/compiler/slide/slide20160508.pdf02多层次的编译原理课程 内容概要 04 教学上采取的策略 01

中科大2006-2010实验方案的主线

第二届计算机专业系统能力培养综合改革经验交流与报告会[2016.5.6‐8,合肥] 12

源语言程序

分析器高级中间表示

(AST) 解释器

变换器(AST2LIR)

汇编代码的内部表示 汇编代码

(如x86, MIPS)

低级中间表示(如三地址码)

寄存器分配器

检查器 正确?

变换器(IR优化器/IR之间的转换器)

代码生成器

以“源语言-抽象语法树-低级中间表示-汇编代码的内部表示-x86/MIPS汇编”为主线搭建的、基于组件的编译原理实验体系

Page 13: 编译原理课程与系统能力培养 - USTCstaff.ustc.edu.cn/~yuzhang/compiler/slide/slide20160508.pdf02多层次的编译原理课程 内容概要 04 教学上采取的策略 01

中科大2006-2010实验方案的主线

第二届计算机专业系统能力培养综合改革经验交流与报告会[2016.5.6‐8,合肥] 13

源语言程序

分析器高级中间表示

(AST) 解释器

变换器(AST2LIR)

汇编代码的内部表示 汇编代码

(如x86, MIPS)

低级中间表示(如三地址码)

寄存器分配器

检查器 正确?

变换器(IR优化器/IR之间的转换器)

代码生成器

以“源语言-抽象语法树-低级中间表示-汇编代码的内部表示-x86/MIPS汇编”为主线搭建的、基于组件的编译原理实验体系

张昱, 陈意云.编译原理实验教程. 北京:高等教育出版社, 2009.5.(附光盘)

Page 14: 编译原理课程与系统能力培养 - USTCstaff.ustc.edu.cn/~yuzhang/compiler/slide/slide20160508.pdf02多层次的编译原理课程 内容概要 04 教学上采取的策略 01

02 多层次的编译原理课程

内容概要

教学上采取的策略04

中科大的程序语言系列课程简介01

03 编译原理课程实践案例

第二届计算机专业系统能力培养综合改革经验交流与报告会[2016.5.6‐8,合肥]

总结05

14

Page 15: 编译原理课程与系统能力培养 - USTCstaff.ustc.edu.cn/~yuzhang/compiler/slide/slide20160508.pdf02多层次的编译原理课程 内容概要 04 教学上采取的策略 01

编译原理课程实践案例

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

Page 16: 编译原理课程与系统能力培养 - USTCstaff.ustc.edu.cn/~yuzhang/compiler/slide/slide20160508.pdf02多层次的编译原理课程 内容概要 04 教学上采取的策略 01

编译原理课程实践案例 - 基础实验

P1 预备阶段

熟悉实验环境:Linux、LLVM 3.6.0、GCC,Makefile

熟悉C1语言的特征:编写C1程序,用GCC/Clang编译

初步了解编译的过程

提交的目录结构要求

• README

• Makefile

• src/

• doc/

• bin/  :shell脚本

• test/第二届计算机专业系统能力培养综合改革经验交流与报告会[2016.5.6‐8,合肥] 16

Page 17: 编译原理课程与系统能力培养 - USTCstaff.ustc.edu.cn/~yuzhang/compiler/slide/slide20160508.pdf02多层次的编译原理课程 内容概要 04 教学上采取的策略 01

编译原理课程实践案例- 基础实验

P2 词法分析

学习LLVM提供的教程Kaleidoscope

• 理解其中的词法分析过程

• 对上述词法分析进行扩展:多行注释、八进制数

• 修改扩展后的词法分析部分,使之输出记号流

学习使用Flex,用Flex生成C1的词法分析器

阅读Clang源代码中的词法分析文件,并回答问题

提交的目录结构要求

第二届计算机专业系统能力培养综合改革经验交流与报告会[2016.5.6‐8,合肥] 17

Page 18: 编译原理课程与系统能力培养 - USTCstaff.ustc.edu.cn/~yuzhang/compiler/slide/slide20160508.pdf02多层次的编译原理课程 内容概要 04 教学上采取的策略 01

编译原理课程实践案例- 基础实验

P3 Kaleidoscope语法分析

理解Kaleidoscope的语法分析和抽象语法树

扩展while循环

P4 C1语言的语法分析与错误恢复

学习Bison

用Flex+bison为C1语言构造能识别正确 C1程序的分析器

提交的目录结构要求

第二届计算机专业系统能力培养综合改革经验交流与报告会[2016.5.6‐8,合肥] 18

Page 19: 编译原理课程与系统能力培养 - USTCstaff.ustc.edu.cn/~yuzhang/compiler/slide/slide20160508.pdf02多层次的编译原理课程 内容概要 04 教学上采取的策略 01

编译原理课程实践案例- 基础实验

P5 生成C1的抽象语法树(AST)

理解所提供的asgn2ast样例

为C1生成AST

P6 Clang源码阅读:理解语法分析和静态检查

用ninja编译clang,了解其中由td描述文件自动生成代

码的技术

阅读clang源码中的部分源程序文件,来理解clang的语

法分析和静态语义检查的实现机制

了解clang编译工具的构造(可选的库+驱动程序)

P7代码生成:为C1程序生成LLVM IR代码第二届计算机专业系统能力培养综合改革经验交流与报告会[2016.5.6‐8,合肥] 19

Page 20: 编译原理课程与系统能力培养 - USTCstaff.ustc.edu.cn/~yuzhang/compiler/slide/slide20160508.pdf02多层次的编译原理课程 内容概要 04 教学上采取的策略 01

编译原理课程实践案例- 综合实验

基础实验扩展:22人

基于流水技术的并行化数据流语言:2人合作

静态存储布局优化

重复代码检测:3人合作

小型MASM汇编语言编译器

GO语言调研

Python编译器调研

ucc扩展

第二届计算机专业系统能力培养综合改革经验交流与报告会[2016.5.6‐8,合肥] 20

Page 21: 编译原理课程与系统能力培养 - USTCstaff.ustc.edu.cn/~yuzhang/compiler/slide/slide20160508.pdf02多层次的编译原理课程 内容概要 04 教学上采取的策略 01

02 多层次的编译原理课程

内容概要

教学上采取的策略04

中科大的程序语言系列课程简介01

03 编译原理课程实践案例

第二届计算机专业系统能力培养综合改革经验交流与报告会[2016.5.6‐8,合肥]

总结05

21

Page 22: 编译原理课程与系统能力培养 - USTCstaff.ustc.edu.cn/~yuzhang/compiler/slide/slide20160508.pdf02多层次的编译原理课程 内容概要 04 教学上采取的策略 01

教学上采取的策略

介绍许多从实际编译和运行时碰到的问题

多以C语言作为实例语言

学过、非类型安全的语言、可生成汇编便于阅读

引导用所学知识去分析、解决、理解实际编程中的问

题和发生的现象 让学生出题

不同的编码方法、不同的实现技术产生的不同影响

介绍现代常用语言的编译运行系统的结构

编译、连接生成本地码:C汇编码

即时编译器+垃圾收集:Java虚拟机、JavaScript引擎

安卓代码的编译、运行:Delvik ART第二届计算机专业系统能力培养综合改革经验交流与报告会[2016.5.6‐8,合肥] 22

Page 23: 编译原理课程与系统能力培养 - USTCstaff.ustc.edu.cn/~yuzhang/compiler/slide/slide20160508.pdf02多层次的编译原理课程 内容概要 04 教学上采取的策略 01

例题1 全局存储分配

下面的程序运行时输出3个整数。试从运行时存储空间

的组织和printf的实现来分析,为什么此程序会有3个整数

输出?

main() {printf(“%d, %d, %d\n”);

}

第二届计算机专业系统能力培养综合改革经验交流与报告会[2016.5.6‐8,合肥]

…  …

main控制链

printf返回地址

printf控制链

printf局部变量ebpesp

格式串指针其它参数

main返回地址

23

Page 24: 编译原理课程与系统能力培养 - USTCstaff.ustc.edu.cn/~yuzhang/compiler/slide/slide20160508.pdf02多层次的编译原理课程 内容概要 04 教学上采取的策略 01

例题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

Page 25: 编译原理课程与系统能力培养 - USTCstaff.ustc.edu.cn/~yuzhang/compiler/slide/slide20160508.pdf02多层次的编译原理课程 内容概要 04 教学上采取的策略 01

例题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

Page 26: 编译原理课程与系统能力培养 - USTCstaff.ustc.edu.cn/~yuzhang/compiler/slide/slide20160508.pdf02多层次的编译原理课程 内容概要 04 教学上采取的策略 01

例题3 代码生成

下面的程序在X86/Linux机器上编译后的运行结果是7,

而在SPARC/SUNOS机器上的运行结果是6。试分析运行结

果不同的原因

main(){

long i;

i = 0;printf("%ld\n", (++i)+(++i)+(++i) );

}

第二届计算机专业系统能力培养综合改革经验交流与报告会[2016.5.6‐8,合肥] 26

Page 27: 编译原理课程与系统能力培养 - USTCstaff.ustc.edu.cn/~yuzhang/compiler/slide/slide20160508.pdf02多层次的编译原理课程 内容概要 04 教学上采取的策略 01

例题3 代码生成

按一般的代码生成,i = i +1的计算结果保留在寄存器中,因此这三个i = i +1的计算次序不会影响最终的结果。结果应该是6

第二届计算机专业系统能力培养综合改革经验交流与报告会[2016.5.6‐8,合肥]

++

= ==

i

i +

1 i

i +

1 i

i +

1

27

Page 28: 编译原理课程与系统能力培养 - USTCstaff.ustc.edu.cn/~yuzhang/compiler/slide/slide20160508.pdf02多层次的编译原理课程 内容概要 04 教学上采取的策略 01

例题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

Page 29: 编译原理课程与系统能力培养 - USTCstaff.ustc.edu.cn/~yuzhang/compiler/slide/slide20160508.pdf02多层次的编译原理课程 内容概要 04 教学上采取的策略 01

02 多层次的编译原理课程

内容概要

教学上采取的策略04

中科大的程序语言系列课程简介01

03 编译原理课程实践案例

第二届计算机专业系统能力培养综合改革经验交流与报告会[2016.5.6‐8,合肥]

总结05

29

Page 30: 编译原理课程与系统能力培养 - USTCstaff.ustc.edu.cn/~yuzhang/compiler/slide/slide20160508.pdf02多层次的编译原理课程 内容概要 04 教学上采取的策略 01

总结

教学与实践内容选择的建议

第1门程序语言:细讲、GUI命令行、WindowsLinux

以后的语言课学习:相比以前语言的特点、实现

养成查语言规范、编译器版本的说明来了解语言特征

程序设计方法学及一定规模的程序的程序设计

编译原理和技术(针对一般的高校)

淡化对分析器的自动生成技术的叙述

增强对实际编译、运行问题的分析

引入编译器源码的阅读

第二届计算机专业系统能力培养综合改革经验交流与报告会[2016.5.6‐8,合肥] 30

Page 31: 编译原理课程与系统能力培养 - USTCstaff.ustc.edu.cn/~yuzhang/compiler/slide/slide20160508.pdf02多层次的编译原理课程 内容概要 04 教学上采取的策略 01

资源

教师的课程主页

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

Page 32: 编译原理课程与系统能力培养 - USTCstaff.ustc.edu.cn/~yuzhang/compiler/slide/slide20160508.pdf02多层次的编译原理课程 内容概要 04 教学上采取的策略 01

Q&A

谢谢!

第二届计算机专业系统能力培养综合改革经验交流与报告会[2016.5.6‐8,合肥] 32