当前课程知识点:编译技术 >  第七章 代码生成 >  7.1 代码生成器设计中的问题 >  7.1 代码生成器的设计中的问题

返回《编译技术》慕课在线视频课程列表

7.1 代码生成器的设计中的问题在线视频

下一节:7.2 目标机器

返回《编译技术》慕课在线视频列表

7.1 代码生成器的设计中的问题课程教案、知识点、字幕

各位同学大家好

这一章我们来学习代码生成

我们看到源程序

经过前端的处理之后

会得到中间代码

然后在代码优化之后

需要来进行代码的生成

才能得到目标程序

在这一章

我们来学习一个简单的代码生成算法

它会涉及到存储的管理、

指定的选择、寄存器的分配、

计算次序的选择等等问题

接下来我们来讨论一下

代码生成器中的设计碰到的问题

我们不针对具体的语言

也不针对具体的目标机器

我们首先来看一下

目标程序可能的形式有哪几种

可以是绝对机器语言程序

可以是可重定位目标模块

当然也可以作为汇编语言程序

作为绝对机器语言程序

这是早期编译器采取的形式

目标程序

它需要装入到内存的固定的地方

粗略的说

得到的语句

相当于是现在的可执行目标模块

那么对于可重定位目标程序来说

代码当中还有重定位的信息

这样我们就可以

每次得到目标代码之后

装入到不同的机器中来进行执行

允许程序模块

分别来进行编译

同时我们可以调用其他编译好的模块

第三种是汇编语言程序

汇编语言程序

免去编译器重复汇编器的工作

相对来说增加了我们的可读性

接下来我们需要讨论指令的选择

我们知道需要针对目标机器来

选择对应的指令系统

那么指令系统

我们选择出来的性质

决定了它的难易程度

我们要求指令系统

必须具备统一性和完备性

同时指令的速度以及机器的特点

是我们另外需要讨论的一些因素

如果不考虑目标程序的效率

我们知道指令的选择

其实是很容易的

比如说对于三地址代码来说

x=y+z

假设x、y、z都是静态分配

那么我们就可以使用

对应的汇编语句

如下三条

第一条MOV y, R0

相当于把y装入到寄存器R0中

第二条ADD z , R0

我们将Z加入到R0中

第三条MOV R0, x

我们将R0存入到x中

通过这样三条语句

我们就完成了x=y+z这条指令

但是我们会观察到

如果我们只是把三地址代码

逐条的去进行翻译

我们得到的常常是低质量的代码

我们再来看一个例子

假设我们有一个语句序列

a=b+c

d=a+e

如果我们逐条的去翻译它

我们得到的指令序列

是如下的这六行代码

首先我们将b移动到R0当中

第二条语句

我们将c累加到R0中

第三条语句

我们将R0移动到a中

第四条语句

我们将a移动到R0中

第五条语句

我们将e累加到R0上

第六条语句

我们将R0移动到d中

当然这个指令序列是正确的

最终 d得到了我们想要的结果

我们会观察到

第四条语句

实际上是一条多余的语句

因为R0中已经存放了a的值

假设a的值不再使用

我们会观察到第三条语句

也是一条多余的一句

接下来我们来讨论寄存器的分配问题

我们知道对于运算对象来说

处于寄存器当中

和处于内存当中相比

指令要短一些

运行的速度也要快一些

所以我们主要讨论

寄存器的分配和寄存器的指派

这两个问题

对于寄存器的分配

我们主要讨论

选择哪一些变量

驻留在寄存器当中

对于寄存器的指派

我们主要讨论

挑选哪些变量要驻存在

具体的寄存器当中

下一个问题是

计算次序的选择问题

对于程序当中

计算的执行次序

会影响程序的执行效率

对于表达式的计算而言

一种计算次序

可能比另外一种计算次序

需要更少的寄存器来保存结果

如何选择一个最佳的计算次序

是一个NP完全问题

这一小节就到这

谢谢大家

编译技术课程列表:

第一章 绪论

-1.1 编译技术绪论

--1.1 编译技术绪论

--编译原理介绍--作业

第二章 词法分析

-2.1  词法记号 串和语言

--2.1 词法记号 串和语言

--2.1  词法记号 串和语言--作业

-2.2  正规式 状态转换图

--2.2 正规式 状态转换图

--2.2  正规式 状态转换图--作业

-2.3  有限自动机

--2.3 有限自动机

--2.3  有限自动机--作业

-2.4  DFA构建 子集构造法 DAF化简

--2.4 DFA构建

-2.5 Lex

--2.5 词法分析工具Lex

第三章 语法分析

-3.1 上下文无关文法

--3.1.1 语法分析概述

--3.1.2 上下文无关文法定义

--3.1.3 推导

--3.1.4 二义性

-3.2 自上而分析中的文法

--3.2.1 消除左递归

--3.2.2 提取左因子

--3.2 上下文无关文法--作业

--3.2.3 语言和文法

--3.2.3 语言和文法--作业

-3.3 自上而下分析

--3.3.1 first follow

--3.3.2 LL(1)文法

--3.3.3 递归下降分析

--3.3.4 非递归下降分析的预测分析器

-3.4 自下而上分析

--3.4.1 归约句柄

--3.4.2 移进归约分析过程

--3.4 自下而上分析--作业

-3.5 LR分析器

--3.5.1 LR分析器

--3.5.2 活前缀

--3.5.3 SLR分析方法

--3.5.4 规范的LR分析方法

--3.5.5 LALR分析方法

--3.5.6 LR分析方法特点

--3.5.7 非二义且非LR的上下文无关文法

第四章 语法指导的翻译

-4.1 语法制导的定义

--4.1.1 属性文法

--4.1.2 属性依赖图和计算次序

--4.1 语法制导的定义--作业

-4.2 S属性的自下而上计算

--4.2.1 S属性的自下而上计算

--4.2.2 栈代码

-4.3 L属性定义

--4.3.1 L属性定义

--4.3.2 翻译方案

--4.3.3 预测翻译器的设计

--4.3 L属性定义--作业

-4.4 L属性的自下而上计算

--4.4.1 L属性的自下而上计算

--4.4.2 模拟继承属性的计算

--4.4 L属性的自下而上计算--作业

第五章 运行时存储空间的组织与管理

-5.1  概述

--5.1 概述

--概述-作业

-5.2  全局栈式存储分配

--5.2 全局栈式存储

-5.3  调用序列

--5.3 调用序列

-5.4 非局部名字的访问

--5.4 非局部名字

--5.4 非局部名字的访问--作业

第六章 中间代码生成

-6.1 中间代码生成

--6.1 中间代码生成概述

-6.2 作用域信息的保存

--6.2 声明语句-作用域信息的保存

第七章 代码生成

-7.1 代码生成器设计中的问题

--7.1 代码生成器的设计中的问题

-7.2 目标机器

--7.2 目标机器

--7.2  目标机器--作业

-7.3 基本块和流图

--7.3 基本块和流图

-7.4 一个简单的代码生成器

--7.4 一个简单的代码生成器

第八章 基于Python的编译器框架实现

-8.1 基于Python的编译器框架演示视频和代码

--8.1 基于Python的编译器框架演示

-8.2 代码介绍

--8.2.1 Scanner

--8.2.2 Parser -1LRItem

--8.2.3 Parser-2ActionGoto

--8.2.4 SA

-8.3 SimpleJava

--8.3 SimpleJava

7.1 代码生成器的设计中的问题笔记与讨论

也许你还感兴趣的课程:

© 柠檬大学-慕课导航 课程版权归原始院校所有,
本网站仅通过互联网进行慕课课程索引,不提供在线课程学习和视频,请同学们点击报名到课程提供网站进行学习。