什么是DAG(只讲概念不讲算法)

什么是DAG(只讲概念不讲算法)

前提知识

中间表达

编译器的目的是将源程序编程目标代码(汇编)放入计算机执行。
在这里插入图片描述
这里有一个问题,世界上有很多不同架构的CPU,比如x86,ARM等。不同架构的CPU有不同的汇编。于是上图带来的问题是直接从源程序翻译成不同架构CPU的目标代码工作量太大且容易出错。正确的做法是在源程序目标代码中间加一层中间表示作为桥梁,将其衔接起来。

在这里插入图片描述

名词解释

DAG: Directed Acycle Graph

中文:无环有向图

通过名字就知道,该图不是闭合的,但是内部有方向。

重点:

  • DAG叶子节点对应原子运算分量。
原子运算:每次只进行一次操作
  • 在DAG中一个结点N表示一个公共子表达式,但N可能有多个父节点。比如

    a*(b-c)+(b-c)*d
    

    b-c作为一个表达式,其表达式树为

       _
      / \
     b   c
    

    但该子树有2个父节点

    *    *
     \  /
      -
     /  \
    b    c
    

    整个表达式的变化过程为:

    1. 形成a*(b-c)(b-c)*d的子树组合
       *   *
      / \ / \  
     a   -   d
        / \
       b   c  
    
    1. +将二者合并
           +
          / \
         *    *
        / \  / \
       a   -    d
          / \
         b   c
    

举例说明

在这里插入图片描述

语法制导和编码

语法制导算法将源文件表达式转成DAG。具体实现参见《编译原理(第二版)》6.1,关于如何对DAG的节点进行编码参见6.2.

用途

用于产生三地址代码,三地址代码很容易转成对应平台的汇编指令

  • 9
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值