zoukankan      html  css  js  c++  java
  • 编译原理笔记

    编译原理龙书第二版笔记,主要是代码生成和代码优化相关,记录概念,方便查阅

    每天看点,督促自己

     

    0.基本块:满足以下条件的最大连续三地址指令序列

    1)控制流只能从基本块的第一个指令进入该块。即没有跳转到基本块中间的跳转指令序列

    2) 除了基本块的最后一个指令,控制流在离开基本块之前不会停机或者跳转。

     

    1.基本块形成了流图的结点,流图的边指明了那些基本块可能紧随一个基本块之后运行

     

    2.基本块的首指令:

    1)中间代码的第一个三地址指令是一个首指令

    2)任意一个条件或者无条件跳转的目标指令是一个首指令

    3)紧跟在一个条件或无条件跳转指令之后的指令是一个首指令

     

    3.三地址语句中对一个名字使用(use)的定义:假设三地址语句i给x赋值;若语句j的一个运算分量为x(含x的表达式),且从语句i可以通过未对x进行赋值的路径到达语句j(j直接使用i中x的值),则j使用了语句i处计算得到的x值。x在语句i处活跃(live)

     

    4.用流图表示基本块之间的控制流,基本块是流图的结点。若从基本块b到基本块c有一条边连接,b是c的前驱(predecessor),c是b的后继(successor)

     

    5.对循环的处理。程序会花费大量时间执行循环,循环的优化是编译器完成的。结点集合L是循环流图的条件:

    1)在L中有一个循环入口结点(loop entry),是唯一的前驱可能在L之外的结点。即从整个流图的入口结点开始到L中任何结点的路径都必然经过循环入口结点,且循环入口结点不是整个流图的入口结点。

    2)L中每个结点都有一个到达L的入口结点的非空路径,且该路径全部在L中

     

    6.代码生成

    1)x=y+z

    1>getReg(x=y+z)为x、y、z选择寄存器,记Rx、Ry、Rz

    2>根据寄存器描述符判断y是否在Ry中,若不在生成指令“LD Ry,y'”,其中y‘是根据y的地址描述符得到的内存位置;类似地处理z

    3>生成指令“ADD Rx,Ry,Rz”

    2)x=y

    假设getReg(x=y)总是为x、y选择同一寄存器,判断y是否位于Ry,若不在生成指令“LD Ry,y”;若y已经在Ry中,只修改Ry的寄存器描述符,表明Ry也存放x值

    3)基本块结束对临时变量的处理

    在基本块结束时若一个变量只在基本块内部使用,当基本块结束后可以假设存放该变量的寄存器为空。若变量在基本块结束时活跃或不知道变量是否在出口处活跃,则必须假定其活跃,此时若该变量的地址描述符表明它没有存放在内存位置上,则用寄存器R保存其值生成指令ST x,R。

     

     

     

     

     

     

     

     

     

     

     

  • 相关阅读:
    js-计算器
    正确看待HTML5的语法变化
    什么是Web前端,Web前端是做什么的?
    css复合属性的写法
    Unicode与JavaScript详解
    input 定宽,文本超出后缩小字体,尽可能多的显示文本
    手机号中间四位加*号
    React 状态和生命周期
    还是数组 练习题 而已
    数组 练习题 而已
  • 原文地址:https://www.cnblogs.com/snip3r/p/12506271.html
Copyright © 2011-2022 走看看