代码生成课件.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文档。上传文档
查看更多
代码生成课件.ppt

10.2 根据一个带标号的表达式树生成代码 2、假设我们有一个标号为k的内部结点,其子结点的标号不相等。那么它必然有一个子结点的标号为k,我们称之为“大子结点”;而另一个子结点的标号为某个mk,它被称为“小子结点”。使用基线b,通过下列步骤为这个内部结点生成代码: 使用基线b,递归的为大子结点生成代码,其结果保存在Rb+k-1中。 使用基线b,递归的为小子结点生成代码,其结果保存在Rb+m-1中。 根据大子结点是该内部结点的右子结点还是左子结点,分别生成指令“OP Rb+k-1, Rb+m-1, Rb+k-1”, “OP Rb+k-1, Rb+k-1, Rb+m-1” 3、对于代表运算分量x的叶子结点,当基线为b时,生成指令“LD Rb, x”。 精选 2 t4 t1 t3 a b c d e t2 1 1 1 1 1 2 2 3 根结点标号为3,基线b为1。 1、根结点的两个子结点标号相同,所以先生成右子结点,后生成左子结点 2、t3时,基线为2,先大子结点,后小子结点。 LD R3, d LD R2, c ADD R3, R2, R3 3、t3的小子结点 LD R2, e 4、t3 MUL R3, R2, R3 5、继续生成左子 LD R3, d LD R2, c ADD R3, R2, R3 LD R2, e MUL R3, R2, R3 LD R2, b LD R1, a SUB R2, R1, R2 ADD R3, R2, R3 精选 10.3 寄存器数量不足时的表达式求值 当可用寄存器的数量少于树的根结点的标号时,不能直接使用上面的算法,需要引入一些保存指令,将某些子树的值溢出到内存中,然后在必要的时候用加载指令把那些值再加载到寄存器中。 改进算法: 输入:带有标号的表达式树和寄存器的数量r≥2。表达式树的每个运算分量只出现一次(即没有公共子表达式)。 输出:计算根结点对应的值并将其存放到一个寄存器中的最优机器指令序列。代码使用的寄存器数量不大于r。假设这些寄存器为R1, R2, …, Rr。 令基线b=1,从根结点开始应用下面的递归算法。对于标号为r或者更小的节点N,使用前面的算法生成指令序列。对于标号kr的内部结点来说,我们要分别处理内部结点的各个子结点,并把较大子树的结果保存到内存中,在对结点N求值之前才从内存重新加载,而最后的求值步骤将在Rr-1和Rr内进行。 精选 改进后的算法 算法的改动如下: 结点N至少有一个子结点的标号为r或者大于r。选择较大的子结点(如果两个子结点标号相同,则任选一个)作为“大”子结点,另一个作为“小”子结点。 令基线b=1,递归的为大子结点生成代码。这个求值结果保存在寄存器Rr中。 生成机器指令“ST tk, Rr”,其中tk是一个用于存放中间结果的临时变量。 按照如下方式为小子结点生成代码。如果小子结点的标号大于或等于r,选取基线b=1.如果小子结点的标号为jr,选取基线b=r-j。然后递归的把本算法应用于小子结点,其结果保存在Rr中。 生成指令“LD Rr-1, tk”。 如果大子结点时N的右子结点,生成指令“OP Rr, Rr, Rr-1”。如果大子结点是N的左子结点,生成代码“OP Rr, Rr-1, Rr” 精选 2 t4 t1 t3 a b c d e t2 1 1 1 1 1 2 2 3 根结点的两个子结点标号相同,任选一个当大子结点(假设为右子结点) LD R2, d LD R1, c ADD R2, R1, R2 LD R1, e MUL R2, R1, R2 ST t3, R2 LD R2, b LD R1, a SUB R2, R1, R2 LD R1, t3 ADD R2, R2, R1 R=2 精选 11. 使用动态规划的代码生成 上节中的算法其时间复杂度是树的大小的线性函数。但需要满足如下假设: 所有的计算都在寄存器中完成 指令中包含的运算符要么作用于两个寄存器,要么作用于一个寄存器和一个内存位置。 动态规划算法可以被应用到具有复杂指令集合的多种计算机上,使人们可以在线性时间内为一个表达式树生成最优代码。 只要机器具有r个可以互换的寄存器,以及加载、保存和运算指令,就可以使用动态规划算法生成代码 我们假设每个指令的代价是一个成本单位。 精选 精选 代码生成 授课:胡静 编译器的结构 出 错 处 理 语法分析程序 语义分析程序 目标代码生成程序 词法分析程序 中间代码生成程序 代码优化程序 表 格 管 理 精选 9. 通过树重写来选择指令 指令选择是一个大型的排列组合任务。对于像CISC

文档评论(0)

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

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

1亿VIP精品文档

相关文档