前言

如果你对这篇文章可感兴趣,可以点击「【访客必读 - 指引页】一文囊括主页内所有高质量博客」,查看完整博客分类与对应链接。

文章目录

  • 前言
  • 目标代码生成
    • 一、目标代码生成概述
      • 1.1 任务
      • 1.2 输入
      • 1.3 输出
    • 二、抽象计算机模型
    • 三、代码生成
      • 3.1 代码生成原则
      • 3.2 待用信息和活跃信息
        • 3.2.1 概念解释
        • 3.2.2 符号表示
      • 3.3 变量地址、寄存器描述
        • 3.3.1 目的
        • 3.3.2 概念
      • 3.4 代码生成算法
        • 3.4.1 算法描述
        • 3.4.2 算法举例
    • 四、DAG的目标代码

目标代码生成

一、目标代码生成概述

1.1 任务

将分析、翻译、优化后的中间代码变换成目标代码

1.2 输入

  • 源程序的中间表示,以及符号表中的信息
  • 类型检查均已完成

1.3 输出

  • 绝对指令代码:能够立即执行的机器语言代码,所有地址已经定位
  • 可重新定位指令代码:机器语言模块,需要与运行程序链接才能执行
  • 汇编指令代码:需要汇编程序转换成可执行机器语言代码

二、抽象计算机模型

其中 (M) 表示主存中 M 位置的数据。

其它指令

三、代码生成

3.1 代码生成原则

  • 以基本块为单位生成目标代码

    • 依次把四元式的中间代码变换成目标代码
    • 在基本块的范围内考虑如何充分利用寄存器
    • 进入基本块时,所有寄存器空闲
    • 离开基本块时,把存在寄存器中的现行的值存回主存中,释放所有寄存器
    • 不特别说明,所有说明变量在基本块出口之后均为非活跃变量
  • 在一个基本块的范围内考虑充分利用寄存器

3.2 待用信息和活跃信息

3.2.1 概念解释

活跃信息 - 将来会不会被引用

待用信息 - 将来在什么地方会被引用

3.2.2 符号表示
  • 二元组 (x, x) 表示变量的待用信息和活跃信息

    • 第 1 元: i 表示将会在第 i 行被引用、^表示非待用
    • 第 2 元: y 表示活跃,^表示非活跃
  • 信息变化

    • (x, x) -> (x, x),用后者更新前者
  • 计算方法

3.3 变量地址、寄存器描述

3.3.1 目的

推出 AVALUE、RVALUE 目的:

  • 四元式指令:指令中各变量在将来会被使用的情况
  • 变量:每个变量现行值的存放位置
  • 寄存器:每个寄存器当前的使用情况
3.3.2 概念
  • AVALUE(变量地址描述数组)

    • 动态记录各变量现行值的存放位置
    • AVALUE[A] = {R1, R2, A}
  • RVALUE(寄存器描述数组)
    • 动态记录各寄存器的使用信息
    • RVALUE[R] = {A, B}

注意,对于四元式 A:=B

  • 如果 B 的现行值在某寄存器 RiR_iRi​ 中,则无须生成目标代码
  • 只须在 RVALUE(RiR_iRi​) 中增加一个A,并把 AVALUE(A) 改为 RiR_iRi​

3.4 代码生成算法

3.4.1 算法描述
  • 总体流程

  • 寄存器分配算法

3.4.2 算法举例
  • 为基本块生成代码示例

四、DAG的目标代码

作用:重排中间代码,减少目标代码

算法:

  1. 构建 DAG,结点标记写在结点圆圈中,叶结点未编号,内部结点的编号写在各结点下面
  2. 倒序填写中间代码编号,找到无父节点的结点,向左进行递归拓扑,遇到子结点或无法拓扑则停止

举例:

  • 中间代码
T1 := A+B
T2 := A-B
F := T1*T2
T1 := A-B
T2 := A-C
T3 := B-C
T1 := T1*T2
G := T1*T3
  • DAG图

  • 节点重排

编译原理完整学习笔记(八):目标代码生成相关推荐

  1. HTML4基本编译原理,Stanford公开课《编译原理》学习笔记(1~4课)

    课程里涉及到的内容讲的还是很清楚的,但个别地方有点脱节,任何看不懂卡住的地方,请自行查阅经典著作<Compilers--priciples, Techniques and Tools>(也 ...

  2. Stanford公开课《编译原理》学习笔记(2)递归下降法

    [摘要] javascript实现递归下降语法解析 示例代码托管在:http://www.github.com/dashnowords/blogs B站地址:[编译原理] Stanford公开课:[S ...

  3. 编译原理(二十)——目标代码生成

    一.目标代码 实际目标代码:实际机器上的指令序列 绝对地址机器代码:可重定位的机器代码: 汇编代码: 虚拟目标代码:虚拟机上的目标程序. 在本地机器上具备虚拟机的解释器. 目标程序的生成和目标机是密切 ...

  4. Stanford公开课《编译原理》学习笔记(1~4课)

    [摘要] 编译原理基础 示例代码托管在:http://www.github.com/dashnowords/blogs B站地址:[编译原理] Stanford公开课:[Stanford大学公开课官网 ...

  5. 《编译原理》学习笔记 ·002【第二章:文法和语言(形式语言理论)-1】

    注:前言.目录见 https://blog.csdn.net/qq_44220418/article/details/108428971 文章目录 零.引言 一.符号串与符号串集合 1.字母表 2.符 ...

  6. 《编译原理》学习笔记 ·001【第一章:总论】

    注:前言.目录见 https://blog.csdn.net/qq_44220418/article/details/108428971 文章目录 一.编译程序 1.编译程序 2.编译基础设施 3.编 ...

  7. 【编译原理】学习笔记以及课程设计

    编译原理 教材用的是<编译原理>(第三版)陈火旺著,电子版戳这里密码:x4ut 课后习题答案戳这里密码:nkv9 教学PPT戳这里密码:0tfz PPT习题答案戳这里密码:v9ct (侵删 ...

  8. 【编译原理】学习笔记1 词法分析

    进行词法分析,打印分析结果. 编译器是一个程序:输入字符串,输出目标代码. 词法分析: 读入源码字节,将其组成有意义的TOKEN流. 语法分析: 根据TOKEN流构建树形的中间表示. 语义分析: 检查 ...

  9. 《编译原理》学习笔记 ·003【第二章:文法和语言(形式语言理论)-2】

    注:前言.目录见 https://blog.csdn.net/qq_44220418/article/details/108428971 文章目录 三.文法和语言的分类 1.Chomsky语言分类法 ...

  10. 【编译原理】编译原理系统学习与实践系列文章汇总目录(持续更新中)

    本文属于「编译原理」系列文章的汇总目录,这一系列正式开始于2021/10/22,着重于「编译原理的学习与实践」.众所周知,编译原理难学难精,因此本系列将至少持续到作者本人「精通编译原理」为止(笑).由 ...

最新文章

  1. 【vue插件篇】vue-form-check 表单验证
  2. linux vss rss区别,关于VSS / RSS / PSS / USS的解释是否准确?
  3. 不加样本就能做数据增强?还能提效?
  4. 利用条件GANs的pix2pix进化版:高分辨率图像合成和语义操作 | PaperDaily #23
  5. CodeForces 688B - Lovely Palindromes(思路)
  6. [转载] Python—urllib模块
  7. 五、谈扩展方法的理解
  8. Elasticsearch 批量导入数据
  9. Win10中Jenkins的安装和基本使用流程
  10. rest接口访问webService soap接口 用XStream javabean和xml的互转
  11. polybase配置 sql_在 Windows 上安装 PolyBase
  12. mysql按某个条件升序_问题描述大家都知道, MySQL 中按某字段升序排列的 SQL 为 (以 id 为例,下同):SELECT * FROM `MyTable` WHERE...
  13. 前端(1)js:百度地图api使用
  14. 财务管理实战专家黄道雄老师
  15. JDK10新特性讲解
  16. nginx 502错误原因和解决办法总结
  17. 51单片机-DS1302可调时钟(实现代码)
  18. 果壳中的宇宙 1:把时空掰弯的男人
  19. POI:Excel计算公式的再计算
  20. 大地四边形类设计C++代码

热门文章

  1. display:table-cell 在页面中的应用
  2. 技术开发人员需要改变性格吗?
  3. android外接usb摄像头demo_手机通过USB连接打印机使用教程,手机连接打印机系列之二...
  4. Argparse 使用
  5. python逢7跳过_python学习笔记(七)break 和continue
  6. php编写程序计算积分_PHP论坛实现积分系统的思路代码详解
  7. #Pragma Pack(n)与内存分配
  8. 文本文件与二进制的区别
  9. 超市对账源码php_[源码和文档分享]基于Java的在线购物系统的设计与实现
  10. 会考flash中文字变形为三角形_flash逐帧课件动画制作有哪些详细教程