编译原理C1-绪论(精品·公开课件).pptVIP

  1. 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
  2. 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  3. 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  4. 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  5. 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  6. 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  7. 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
中间代码生成 例:id1+id2*id3 后缀表示(逆波兰Reverse Polish Notation) id1id2id3 * + 前缀表示(波兰Polish Notation) + id1*id2id3 四元组表示 (三地址码) 1 (*,id1,id2,T1) 2 (+,id3 ,T1 ,T2) 三元组表示 1 (* ,id2,id3) 2 (+,id1,(1)) E E + E id1 E * E id2 id3 语法树 中间代码生成 三地址码的另一种表示形式 T1=id2*id3 T2=id1*T1 其它类型的语句举例 printf(“hello”) x := s (赋值) param x (参数) call f (函数调用) 其中s 是hello的地址,f 是printf的地址 对中间代码的优化处理:对代码进行等价变换以求提高执行效率,即提高运行速度、节省存储空间 与机器无关的优化 与机器有关的优化 代码优化 与机器无关的优化 根据优化范围分类 局部优化 循环优化 全局优化 优化技术 常量合并:常数运算在编译期间完成,如8+9*4 公共子表达式的提取:基本块内 强度削减 代码外提 与机器有关的优化 寄存器的利用 将常用量放入寄存器,以减少访问内存的次数 体系结构 MIMD、SIMD、SPMD、向量机、流水机 存储策略 根据算法访存的要求安排:Cache、并行存储体系——减少访问冲突 任务划分 按运行的算法即体系结构,划分子任务(MPMD) 目标代码生成 将中间代码转换成目标机上的机器指令代码或汇编代码 符号表,记录符号与其关联的属性,如类型、作用域,对于过程名符号,有其参数个数和类型、传值还是传引用、返回类型。 符号在词法分析阶段进入符号表,而与其关联的属性要在后继阶段补充。 float position, initial, rate; 符号表管理 在遇到错误时,应尽可能继续执行相应阶段。 词法分析:不成词的余留串,如3int 语义分析:语法结构良好,但语义错误,如两个标识符相加,但其类型分别为数组和过程。 错误处理 例 一个语句的翻译 编译程序的组织 语法分析 程序 语义分析及 代码生成程序 词法分析 程序 整理目标程序 源程序 目标程序 停机 开始 编译的遍(Pass) 根据系统资源的状况、运行目标的要求等,可以将一个编译程序设计成多遍扫描的形式,在每一遍扫描中,完成不同的任务。 遍可以和阶段相对应,也可无关 单遍代码不太优 编译的前端与后端 前端:与目标机无关的部分 后端:与目标机有关的部分 编译程序的设计 设计目标 目标程序执行速度快 编译程序编译速度快 编译程序诊断能力强,可靠性高 可移植性,可扩充性 如何实现编译器? 直接用可运行的代码编制——太费力! T 形图 表示语言翻译的 T 形图 源语言 表示语言 目标语言 功能 交叉编译(Cross Compiling)/移植 问题一:A机上有一个C语言编译器,是否可利用此编译器实现B机上的C语言编译器? 条件:A 机有 C 语言的编译程序(P1) 目的:实现 B 机的 C 语言的编译(P3) 1. (人)用C语言编制B机的C编译程序P0(C→B) C语言 C语 言 B机器 P0 C语言 A机器 A机器 P1 C语言 A机器 B机器 P2 2. (A机的C编译P1)编译P0,得到在A机上可运行的P2(C→B) C语言 C语言 B机器 P0 C语言 A机器 A机器 P1 C语言 A机器 B机器 P2 获得一个工具 C语言 A机器 B机器 P2 C语言 C语言 B机器 P0 3. (用A机的P2)编译P0,得到在B机上可运行的P3(C→B) C语言 B机器 B机器 P3 本机编译器的利用 问题二: A机上有一个C语言编译器,现要实现一个新语言NEW的编译器?能利用交叉编译技术么? C语言 A机器 A机器 P1(原有) NEW语言 A机器 A机器 P2(生成) NEW语言 C语 言 A机器 P0(编写) 用C编写NEW的编译,并用C编译器编译它 问题三:直接在一个机上实现C语言编译器,还有别的技术么? 解决: 用汇编语言实现一个C子集的编译程序(P0—人) 用汇编程序处理该程序,得到P2(P2:可直接运行) 用C子集编制C语言的编译程序(P3—人) 用P2编译P3,得到P4 编译程序的自展技术 1. 用汇编语言实现一个 C子集的编译程序(P0—人) C语言子集 汇编语言 机器语言 P0 2. 用汇编程序(P1)处理该程序,得到P2(P2:可直接运行) 汇编语言 机器语言 机器语言 P1 C语言子集 机器语言 机器语言 P2 获得一个工具 C语言子集 机器语言 机器语言 P2 3. 用C

您可能关注的文档

文档评论(0)

夏天 + 关注
实名认证
文档贡献者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档