230 likes | 377 Views
编译原理实验指导. 张昱 计算机科学与技术学院 中国科学技术大学 合肥 2010.4.26. 资源. 编译原理实验教程及实验软件包 http://staff.ustc.edu.cn/~yuzhang/compiler 张昱,陈意云 . 编译原理实验教程 . 高等教育出版社, 2009.5 开发环境与工具(参见实验教程 1.3 节) Java 语言 规范 (第 3 版)-- JLS3 http://java.sun.com/docs/books/jls/ Java 1.5 的文法规范文件: java15.cup , java15.jj
E N D
编译原理实验指导 张昱 计算机科学与技术学院 中国科学技术大学 合肥 2010.4.26
资源 • 编译原理实验教程及实验软件包 • http://staff.ustc.edu.cn/~yuzhang/compiler • 张昱,陈意云.编译原理实验教程.高等教育出版社,2009.5 • 开发环境与工具(参见实验教程1.3节) • Java语言规范(第3版)--JLS3 • http://java.sun.com/docs/books/jls/ • Java 1.5的文法规范文件:java15.cup,java15.jj • 抽象语法树:Eclipse AST • JDT Plug-in Developer Guide • ReferenceAPI Reference org.eclipse.jdt.core.dom • Java开发运行环境:JDK+AntEclipse IDE • 编译器的自动生成工具:JFlex,Java CUP(LALR)/JavaCC(LL(k)) • 目标代码的运行:GCC(MinGW),SPIM 编译原理实验指导
编译器实现框架 编译原理实验指导
实验入门指南—初步了解 • 开发基础 • Eclipse IDE + JDK + ant(实验教程第1章) • 命令控制台+JDK + ant • 汇编码的运行:GCC、SPIM • 自主研发的实验平台及支持库(实验教程第2章及后续章节) • 实验语言 • 从SimpleMiniJOOL语言(见实验教程2.1节)及其实现入手 • 最终要求实现SkipOOMiniJOOL语言的编译器 • 词法:实验教程3.2节;语法:4.1节;语义:5.1节 • 中间表示 • Eclipse AST:(见实验教程2.4,2.5节) • LIR:(见实验教程6.2节) 编译原理实验指导
实验入门指南—初步了解 • 目标机 • X86 CISC生成的汇编码能由GCC编译生成可执行文件 • MIPS RISC生成的汇编码能由SPIM模拟器解释执行 汇编码简介:实验教程7.2和7.3节 • 汇编码的内部表示 • AIR:实验教程7.4节 编译原理实验指导
实验软件包:课程设计开发包目录 • 课程设计开发包目录 编译原理实验指导
实验软件包:实验支持库的构成 编译原理实验指导
实验运行平台 参见实验教程2.3节 • 目的 • 提供各类编译器组件及组件间信息访问的接口,简称实验平台接口。 • 提供一个实验运行平台,它能够将若干个编译器组件连接装配成一个完整的编译器或解释器并控制它们的运行。用户可以通过平台配置文件灵活地定制待装配的各个编译器组件以及待编译或解释执行的源程序文件等。 编译原理实验指导
实验平台接口 编译原理实验指导
实验任务(1) • 每一学生可选的待开发组件 • 组件1:带语义检查的分析器(生成AST) • 组件2:带语义检查的分析器(生成LIR) • 组件3:基于AST的x86汇编代码生成器 • 组件4:基于AST的MIPS汇编代码生成器 • 组件5:基于LIR的x86汇编代码生成器 • 组件6:基于LIR的MIPS汇编代码生成器 • 合作伙伴的组合方式 • 组件1+组件3+GCC 组件1+组件4+SPIM • 组件2+组件5+GCC 组件2+组件6+SPIM 编译原理实验指导
实验任务(2) • 前端任务:组件1或组件2 词法分析、语法分析、静态语义分析、中间表示的生成 其中涉及符号表的设计与实现 • 后端任务:组件3~组件6之一 需要考虑动态语义检查(如数组下标越界)、短路计算、寄存器分配等,但是对代码优化不作要求。 独立开发后端时,需要设计和实现符号表 生成的x86汇编代码应能直接用gcc汇编连接得到可执行文件,生成的MIPS汇编代码则应能在SPIM上执行 若需要使用其他目标平台,必须在6月13日前与张昱老师联系并确认是否可以使用。 编译原理实验指导
实验任务(3) • 最终的编译器 • 自行选择前后端 • 定义好接口,不开放源代码,只提供jar文件和接口说明,运行时应能输出作者名 • 你的前端(后端)被采用得越多,则得分越高 • 每个同学只负责自己提交的编译器的质量。 • 组件发布人不必考虑其发布的版本被使用的所有编译器的质量。 编译原理实验指导
提交和发布时间节点 • 提交节点 • 5月16 提交系统设计书,包括进度表和拟开发的组件 • 5月22前 经老师认可学生可调整拟开发的组件 • 5月30 提交已完成源代码和前后端接口描述 • 6月13 再次提交已完成源代码和进度报告 • 6月20 提交源文件、类库文件、测试程序、设计文档等 • 6月22 提交课程实践的收获、体会和建议(发邮件给张昱老师) • 发布节点 • 6月13 发布测试程序 • 6月15 发布测试环境,对最终提交文档的规定 每次提交时需要说明当前的执行进度与计划中的出入与原因,以及对计划的调整(如果有的话)! 编译原理实验指导
课程设计成绩评定(1) • 评分方式和过程 • 1012个学生一组,大家参与,公开评分 • 评委:1个教师、助教、同组所有同学 • 教师主导测试过程、学生自己动手按老师要求操作,并用投影机当众显示测试过程 • 老师提问,同组同学也可以提问,当众回答 • 问题主要围绕完成的设计和编程,以及测试中暴露出的设计或编程错误 编译原理实验指导
课程设计成绩评定(2) • 评分依据 • 工程的规范性 • 编译器的正确性 • 错误定位与恢复能力 • 所生成的目标代码的质量 • 回答问题时所表现出的对本课程设计所涉及的编译知识的掌握程度 • 对自己设计和编码的编译器和解释器的熟悉程度 • 操作的熟练程度 • 所提交文档的完整性、条理性及其中反映的分析和设计的思想 编译原理实验指导
课程设计成绩评定(3) • 成绩确定 • 每个评委给该组同学排名次,同学评委的排名要包括自己 • 由助教根据所有有效排名表,给出最终的排名 • 由老师根据本组的情况,确定本组的最高分和最低分,依据排名,按等间隔确定每个同学的分数 • 被老师、助教和过半数同学认为所提交文档不是自己课程设计成果时,则0分 • 未按时交也是0分 编译原理实验指导
课程设计成绩评定(4) • 奖惩 • 若所开发的前端(或后端)被多个同学(开发的合作伙伴除外)采用,则在分组评分的基础上加分,加分原则是: 1、每增加两个采用者加1分; 2、课程设计和平时作业合计不超过50分。 • 独自完成整个编译器,分组评定成绩后降10分 • 前后端人数比例严重失调,抬高少数人一端分数 • 备注 • 成绩评定可能有考虑不周的地方,解释权在老师 • 系统地发现所提供的参考源代码中的错误,给予表彰和奖励 编译原理实验指导
实验入门指南—深入学习1 • 开发基础 • 写一个简单的Java程序 mydir/src/test.java或者直接利用lab1中的代码lab1/src/… • 用Eclipse编译和调试 • 尝试按实验教程中1.3.3节介绍的各种方法来建立工程 • 学习在Eclipse下调试和运行 • 在命令控制台下编译和调试 • 用javac编译Java源程序,得到Java字节码 • 用java运行Java字节码 • 写一个ant编译文件(参见实验教程中1.3.4节),用ant来编译和运行Java程序 • 用实验平台运行,熟悉配置文件 编译原理实验指导
实验入门指南—深入学习2 • SkipOOMiniJOOL语言及其AST • 编写SkipOOMiniJOOL程序 • 目的:了解语言特点,所写程序可以作为测试程序 • 查看SkipOOMiniJOOL程序的AST • 方法:参见lab3 • 目的:通过AST图形化输出了解一个SkipOOMiniJOOL程序与其AST的对应关系 • 手工构造SimpleMiniJOOL程序的AST • 方法:参见实验教程第2章, TestCase.java等 • 从小语言入手来学习AST的构造 构造AST的一些注意事项 • 关于List类型的实例:可以用java.util.LinkedList(或ArrayList) • 一个AST节点不能被多棵AST(子树)所引用 编译原理实验指导
实验入门指南—深入学习3 • 前端:词法分析+语法分析+语义分析 • 做法 • 使用JFlex+CUP来生成分析器的源码: 参见ch4和ch5 • 使用JavaCC来生成分析器的源码: 参见ch5 • 手工编写分析器 • 先支持SimpleMiniJOOL,再扩展到SkipOO… • 语言中的注意点: • 变量的作用域,同名问题的处理,等等 • 了解AST访问者类、管理符号的一些容器类(如HashMap)、List等等 • 各类符号的描述信息定义符号类、符号表类 编译原理实验指导
实验入门指南—深入学习4 • 前端:词法分析+语法分析+语义分析 • 利用分析器的生成工具构造分析器时, • 先构造简单的语法分析器:不构造AST、不进行错误处理重点:熟悉分析器的生成工具及其使用方法 • 再构造能输出AST的语法分析器,它只能分析正确的源程序重点:熟悉在产生式的语义动作中添加构造AST的代码 • 再构造能处理语法错误并产生AST的语法分析器重点:识别哪些错误?如何处理错误?如何恢复错误?错误信息? • 以AST Visitor的实现类为基础实现语义检查重点:符号表的设计,语义检查 • 修改文法规范文件,增加符号表的维护与语义检查动作重点:注意了解语法和语义分析之间的相互影响 编译原理实验指导
实验入门指南—深入学习5 • 前端:词法分析+语法分析+语义分析 • AST->LIR • 了解LIR • AST中的结构到LIR的映射关系 编译原理实验指导
实验入门指南—深入学习6 • 后端:由LIR/AST生成x86或MIPS汇编码 • 了解x86/MIPS汇编码及其相关工具(gcc/spim) • 总结语言的语法结构与汇编码之间的映射关系 • 写出对应的C程序,用gcc编译得到x86汇编码或spim汇编码 • AST和LIR的表示与使用(见实验教程的第2,6章) • 了解汇编语言特征配置文件及汇编码的内部表示(见实验教程的第7章) • 不考虑寄存器分配的代码生成(lab6或lab7中的Generator1.java) • 考虑寄存器分配的代码生成(lab6或lab7中的Generator2.java/Generator3.java ) 编译原理实验指导