网站大量收购闲置独家精品文档,联系QQ:2885784924

编译原理与技术讲义-第9章-精选课件(公开).ppt

编译原理与技术讲义-第9章-精选课件(公开).ppt

  1. 1、本文档共103页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
编译原理与技术 主要内容 中间语言 声明语句的翻译 赋值语句的翻译 基本控制结构的翻译 转向语句的翻译 9.1 语法制导的中间代码翻译引论 中间代码翻译在编译程序中的位置 使用中间代码的好处包括: (1)把源程序翻译成目标代码的工作分阶段进行,便于控制和管理开发工作的复杂度,集中地解决不同阶段的不同问题。例如,语义检查可以发现类型不匹配、缺乏类型等可能导致程序运行得错误。 (2)÷便于把与机器特性密切相关的目标代码的生成尽可能的限制在编译的后端,有利于重定目标机器,使得一种中间代码可以为多种不同类型的目标机器服务。 这是目前最流行的编程语言Java以及.NET编程环境所采用的策略(当然,除了中间表示以外,它们的运行系统还需要虚拟机VM或通用语言运行时CLR等技术)。 9.1 中间语言 在编译过程中表示源程序的数据结构统称为中间表示(中间语言)。 用中间语言表示的程序叫做中间代码。 中间语言的设计既要包含足够的结构,可以支持高级程序语言的结构,如类型、模块、接口、安全机制、垃圾搜集等,又要便于到目标机器的的自动映射,有助于翻译成时空方面都高效的运行代码。 9.1 中间语言 中间语言可以按照下列特性分类: 抽象程度 中间语言可以非常抽象,像语法树一样抽象地表示几乎所有的操作,也可以具体到接近于目标机器及其指令。抽象的中间语言如分析树、有向无环图,底层的中间语言包括字节代码,它们的语句集合类似于汇编语言或机器的符号指令,而三地址码介于这两类表示之间。现代计算机体系结构(存储管理、寄存器、指令)的发展对中间代码的设计产生了深刻的影响。例如,P-code和Java bytecode都属于字节代码,但是,它们的代码本身与支持环境存在很大的差异。 运行时信息 中间语言可能使用目标机器和运行环境的详细信息(如数据类型、变量的位置),也可以不使用这些信息。抽象程度高的语言一般不包含目标机器的信息,而字节代码和三地址码通常都包含了数据类型以及相关的算符。一般的字节码如P-code和Java bytecode都有相应特殊的虚拟机器来解释并运行字节代码。现代计算机技术的发展对程序的安全性、互操作性、并发性等严格要求,使得运行环境更加复杂。 9.1 中间语言 使用编译的数据结构 中间语言可以包含符号表的全部信息,例如符号范围、嵌套层次和变量的偏移,目标代码的产生就可以完全倚赖于这样的中间代码。否则,产生目标代码时就需要查询符号表等数据结构。语法树、分析树和有向无环图通常需要符号表的信息才能完成分析和翻译的工作,三地址码也需要使用符号表,一般的字节码已经把这些信息转换成对应虚拟机的信息。互联、开放、异构等特性增加了编译系统数据结构与管理的复杂性,例如,统一的命名空间,除了要包含一个程序的名字以外,还要处理甚至是用其它语言编写的构件中的各种名字。 用途 编译过程包含了不同的阶段和任务,每个阶段和任务都有最合适的中间表示:分析树特别适合对源程序进行语法和语义分析,有向无环图适合代码优化和生成,后缀表示便于计算机的计算,字节码和三地址码由于更接近机器代码而最适宜目标码的生成和移植。但是,一个编译程序通常都不会使用太多的中间表示,以免各个中间表示之间的转换造成的效率损失。 9.1 中间语言-后缀式 后缀式 定义9.1 后缀式的递归定义如下: (1)如果E是一个变量或常量,则E的后缀式就是E本身; (2)如果E是形如E1 op E2的表达式,其中op是任意的二元运算符 ,那么, E的后缀式为E1’ E2’ op,其中E1’和 E2’分别是E1和E2的后缀式; (3)如果E是(E1)形式的表达式,那么,E1的后缀式就是E的后缀式。 上述定义容易扩充到含单目算符如负号“?”或否“not”的表达式,也不难扩充到包含数组元素。 9.1 中间语言-后缀式 9.1 中间语言-后缀式 后缀式的两个特点 (1)后缀式形式的表达式计算顺序唯一,无需使用括号来明确计算顺序; (2)只要直到每个算符的目数,计算参与运算数的个数,对于后缀式不论从左还是从右进行扫描,都能对它进行唯一的分解。例如 ab?c?/ 所代表的中缀表达式是 a/(?b?c) ab+cd+? 所代表的中缀表达式是 (a+b) ?(c+d) 后缀式特别适合利用栈的结构进行计算: 自左向右扫描表达式的后缀表示,每遇到一个对象就把它压入栈内; 每遇到一个算符,就从栈顶取出相应个数的运算对象进行计算,再将结果压入栈顶。 最后,栈顶元素就是表达式的运算结果。 9.1 中间语言-后缀式 后缀形式扩充到其它的语言结构 ①对于赋值表达式V=E,如果把赋值号看作是二目算符,那么,它的后缀形式为V’E’= ,其中V’和E’分别是V和E的后缀式。例如, 赋值语句t = (a+b) /c?

文档评论(0)

saodishenseng2 + 关注
实名认证
内容提供者

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

1亿VIP精品文档

相关文档