第1章编译系统讲义.ppt

  1. 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
  2. 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  3. 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
* 例如表达式 (a+b)*(c+d) 翻译成四元的中间代码如下: (+ , a , b , t1) (+ , c , d , t2) (* , t1 , t2 , t3) 1.3.3语义分析及中间代码生成程序 LOAD a 将a的内容加载到操作数栈 LOAD b 将a的内容加载到操作数栈 ADD 将操作数栈顶的两个单元的内容相加 STO t1 将操作数栈顶的内容存入单元t1 LOAD c 将c的内容加载到操作数栈 LOAD d 将d的内容加载到操作数栈 ADD 将操作数栈顶的两个单元的内容相加 STO t2 将操作数栈顶的内容存入单元t2 LOAD t1 将t1的内容加载到操作数栈 LOAD t2 将t2的内容加载到操作数栈 MULT 将操作数栈顶的两个单元的内容相乘 STO t3 将累加器的内容存入单元t3 翻译成某个抽象机的汇编指令代码: * 1.3.4.代码优化 代码进行优化的目的:提高目标程序的执行效率。代码优化首先在中间代码上进行。在局部范围可能做的优化有常数表达式的计算或根据操作符的某些性质如可结合性、可交换性和分配性以及检测公共子表达式进行优化 有四元式指令代码如下: (*,3.14,2,t1) (=,t1,_,x) (*,2,5,t2) (*,t2,a,t3) (=,t3,_,y) (+,x,1,t4) (=,t4,_,z) 而优化后的代码如下: (=,6.28,_,x) (*,10,a,y) (=,7.28,_,z) 代码优化不是编译程序的必要组成部分,不同的编译程序所进行的代码优化程度差别很大,能够完成代码优化的编译程序称为“优化编译程序”。 * 1.3.5.目标代码生成 编译的最后一步是将中间代码生成特定机器上的低级语言代码。这部分与机器类型有关,对程序中的每个变量指定存贮单元,把中间代码的指令翻译成等价的某种类型机器的机器指令代码或汇编指令代码。 目标代码的形式可以是绝对指令代码、可重定位的机器指令代码或汇编指令代码。如果目标是绝对指令代码,则可立即执行。如果是汇编指令代码,还需经汇编程序翻译后才能运行。现在多数编译程序产生的是可重定位的机器指令代码,这种目标代码在运行前必须借助于一个连接装配程序把各个目标模块(包括系统提供的库模块)连接在一起,确定程序中的变量在内存中的位置,装入内存中指定起始地址,使之成为一个可以运行的绝对指令代码程序。 * 1.3.6.符号表管理 编译过程中要记录源程序中出现的标识符,并收集每个标识符的各种属性信息。在词法分析中,对所有的标识符都用一个统一的符号表示,这个符号代表的标识符是变量名、函数名还是其它对象名?如果是变量名,变量的类型是什么?如果是函数名,编译程序怎么知道参数的个数、类型及函数返回值的类型等信息呢? 符号表是由若干记录组成的数据结构,每个标识符在表中有一条记录,每条记录有多个域,每个域记载标识符的一个属性。例如下面一条记录说明标识符aaa是整型变量及分配的内存地址。 标识符的各种属性是在编译的不同阶段填入符号表的。词法分析阶段只能分析出标识符名,语法分析阶段只能判断标识符在语句中出现是否合法,只有到了语义分析阶段,才能将标识符的各种属性填入符号表并使用这些属性生成中间代码。 标识符名 标识符类型 类型 地址 aaa 1(表示变量) 1(表示整型) 0001 * 1.3.7.错误处理 编译的各个阶段都可能发现源程序中的错误。发现错误后如果立即停止编译,往往会降低调试程序的效率,所以应对出现的错误做适当的处理,从而使编译能继续进行。词法分析可以检测出源程序中的非法符号。语法分析能够发现程序语句中的各种语法错误,如括号不匹配等等。语义分析能判断运算对象的类型是否匹配、变量是否重复声明或没声明就使用等错误。任意时刻发现错误,都应该报告错误信息,包括错误出现的位置、错误性质等,为程序员调试程序提供方便。 * 1.4 编译程序的结构 在设计和实现编译程序时,要考虑编译程序分“遍”的问题。所谓一“遍”是指编译程序在编译时把源程序或中间形式从头到尾扫描一遍,并做相关的处理,生成新的中间形式或目标代码。在一遍扫描中,可完成编译程序五个任务中的一个或几个。采用不同的分遍方式,编译程序的结构也有所不同。 * 1.4.1单遍编译程序 单遍编译程序只对源程序进行一遍扫描,就完成编译的各项任务,产生目标代码。在单遍编译程序中,不产生中间代码,往往以语法分析程序为中心,词法分析和语义分析作为语法分析的子程序。其工作过程如下: 当语法分析需要读进一个新单词时,就调用词法分析子程序。词法分析子程序则从源程序中依次读入字符,组合成单词

文档评论(0)

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

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

1亿VIP精品文档

相关文档