当前课程知识点:编译原理 >  第1章 编译原理概述 >  1.2 编译的基本过程 >  编译的基本过程

返回《编译原理》慕课在线视频课程列表

编译的基本过程在线视频

下一节:编译的基本过程

返回《编译原理》慕课在线视频列表

编译的基本过程课程教案、知识点、字幕

同学们好

今天给大家介绍编译的基本过程

编译的核心就是机器翻译

机器翻译和人工翻译的过程类似

大家看这样一句话

她是一位新教师

我们需要把它翻译成英文

大家想一想

这个翻译过程是怎样的呢

首先我们应该识别出来句子中的单词

也就是把句子中的词汇分出来

由一个汉字串变成了一个词串

第二步呢就是进行语法分析

根据语言学的研究

一个句子是由词汇按照一定规则组成的

规则我们可以说就是语法结构

语法分析就是分析源语言的句子是不是合乎语法结构

如果句子不符合源语言的语法结构

那就需要进行修改了

做翻译系统时呢就要给出出错提示

这个句

她 是 一个 新 教师

是一个符合主系表结构的句子

语法没有问题

那么我们就进入第三步语义翻译

这个过程

就是把源语言句子的意思

用目标语言表达出来

那么刚才这个句子呢

我们就可以把它翻译成

She is a new teacher.

编译过程本质上与自然语言翻译一致

不过比自然语言翻译要简单许多

因为专家们

在创造高级语言时候

就考虑到语言表述的准确性

每一个语句都有明确的含义

目标语言和源语言都有明确的对应关系

程序设计语言的符号集合

以及结构体系比自然语言要简单的多

我们来看这一段C语言程序

这段程序

计算机是无法识别它的含义的

是把它当做一个字符流

编译程序要对他进行分析翻译

用目标语言表达出来他的含义

那么首先

要区分出代码中的一个一个的单词

然后依据语法规则分析句子语法结构是否正确

如果有错就给出提错信息

否则的话分析他们所表达的意思

生成与源语言程序等价的目标程序

这样我们就可以把编译程序

抽象出来四个必不可少的阶段

第一个是识别单词的词法分析

第二个呢是分析语法结构的语法分析

第三个那就是进行语义解释的语义分析

第四个就是生成目标代码的代码生成过程

在编译系统中

目标代码一般用汇编语言或机器语言呈现

编译程序是一个复杂的系统

大部分编译系统不直接生成目标代码

在语义分析之后生成中间代码

中间代码是介于源语言程序

与机器语言之间的一种表示形式

这样可以将与机器相关的某些实现细节

它的出现放置于代码生成阶段处理

并且可以在中间代码一级进行优化处理

所以编译过程通常划分为

词法分析 语法分析 语义分析 中间代码生成

代码优化 目标代码生成六个阶段

在编译程序实现的过程中

我们就可以用对应的子程序来完成

我们来看这个图

有词法分析程序

语法分析程序

语义分析程序

中间代码生成程序

代码优化程序

目标代码生成程序

那么在编译过程中源程序的各种信息

是需要进行处理

而且要把它保留在种种不同的表格里

在编译的各个阶段

都涉及到对这个表格的操作

比如说插入 查找 更新

所以 需要有一个表格管理子程序

用户在写高级程序设计语言的过程中

难免会有各种各样的错误

所以 编译程序不仅

要能够及时的发现这些错误

还要准确的指出这些错误的位置

同时还要以恰当的方式通知用户

所以编译程序中的出错管理

也是不可缺少的一个模块

我们来看这几个阶段的任务

词法分析程序

是从字符流分出单词

提取相应的属性记入到符号表中

输入的是字符流

输出的是单词序列

这里有一个C语言的片断

我们分析其中这样一句

经过词法分析后

我们可以将句子中的单词

及属性收集到符号表中

大家看这个就是符号表

在这个过程中

我们可以获得很多变量的内部码

这里我们用 id1 id2 id3来表示

我们来看语法分析程序

对语法分析程序

它输入的是单词序列

那么依据语法规则分析这些单词

构成的句子是不是符合语法结构

那么语法分析的任务

是在词法分析基础上将单词序列

分解成各类语法短语

比如说程序 语句 表达式等等

一般语法单位可以表示为语法树

比如 我们分析出来的这个单词序列

经过语法分析之后

我们可以得出它是一个赋值语句

整个的分析过程

可以看就是这课语法树

再来看语义分析程序

对于前面两个阶段分析的结果

我们要进行语义分析

语义分析的主要任务

有这么几点

第一 完成静态语义审查和处理

第二是上下文相关性审查

还有就是类型匹配审查

还有一个是类型转换

在词法分析和语法分析之后

比如说这段代码中

我们可以得出

是id1=id2+id3*60

它是一个赋值语句

这个语句中id1、id2、id3都是实数

但是60是个整数

语义分析阶段进行类型审核之后

那需要将60转换为实数

那么语法图就变成了这个样子

我们增加了将整形数据

转换为实型的一目运算

再来看中间代码生成程序

那在进行了词法分析

语法分析 语义分析阶段之后呢

有的编译程序

将源程序变成了一种内部表示形式

这种内部表示形式

叫做中间语言或中间代码

所谓中间代码是一种结构简单

含义明确的记号系统

这种记号系统可以设计为多种多样的形式

重要的设计原则有两点

一是容易生成

二是容易将它翻译成目标代码

很多编译程序

采用了一种近似三地址指针的四元式

来作为中间代码

这里是四元式的一种表示形式

包含有四部分

运算符 运算对象1 运算对象2 结果

语法分析 语义分析之后得到的语句

id1=id2+id3*60

进行语义分析之后可以生成

这样的四个四元式序列

其中ti(i=1,2,3)是编译程序生成的临时变量名

用于存放运算结果

那么对于代码优化程序

是将中间代码进行变换改造

目的是使生成的目标代码更为高效

也就是节省时间和空间

这里的四句四元式

我们可以进行变换与优化

优化之后就得到

只有两句四元式的代码

代码优化工作会降低编译程序的编译速度

因此编译优化阶段

常常作为可选择的阶段

目标代码生成阶段的任务是把中间代码

变换成特定机器上的绝对指令代码

或者可重定位的指令代码

或者汇编指令

这是编译的最后阶段

它的工作与硬件系统结构和指令含义有关

这个阶段的工作很复杂

涉及到硬件系统功能部件的运用

机器指令的选择

各种数据类型变量的存储空间分配

以及寄存器和缓存器的调度等等

假如说我们使用两个寄存器

R1和R2

中间代码可生成这样的一段汇编代码

这里我们介绍的编译过程的阶段划分

是一种典型的处理模式

事实上并非所有的编译程序

都包括这样几个阶段

有些编译程序并不要中间代码

也就是不存在中间代码生成阶段

有些编译程序

它可以不进行优化

优化阶段可以省去

那么最简单的编译程序

至少要包含有词法分析

语法分析

语义分析和目标代码生成

这节课就讲到这里

谢谢大家

编译原理课程列表:

第1章 编译原理概述

-1.1 什么是编译原理

--什么是编译原理

--什么是编译程序

--讨论:翻译程序、汇编程序、编译程序、解释程序的区别和联系。

--练习1

-1.2 编译的基本过程

--编译的基本过程

--编译的基本过程

--讨论:表格管理和出错处理

--练习2

-1.3 编译程序的组织

--编译程序的组织

--编译程序的组织

--练习3

-编译原理概述

第2章 编译理论基础

-2.1 文法与语言

--文法与语言

--文法与语言

-2.2 文法和语言的形式定义

--文法和语言的形式化定义

--文法和语言的形式化定义

--讨论:高级语言的一般特点

--练习1

-2.3 文法的类型

--文法的类型

--文法的类型

--练习2

-2.4 上下文无关文法及语法树

--上下文无关文法及语法树

--上下文无关文法及语法树

--练习3

-2.5 上下文无关文法的句型分析

--上下文无关文法的句型分析

--上下文无关文法的句型分析

--练习4

-编译理论基础作业

-讨论:识别不同文法的实验方法

第3章 词法分析

-3.1 词法分析概述

--词法分析概述

--词法分析概述

--练习1

-3.2 正规文法和状态转换图

--正规文法和状态转换图

--正规文法和状态转换图

--练习2

-3.3 有限状态自动机

--有限状态自动机

--有限状态自动机

--讨论:有限状态自动机的应用

--练习3

-3.4 NFA与DFA的等价性

--NFA与DFA的等价性(上)

--NFA与DFA的等价性(下)

--NFA与DFA的等价性

--练习4

-3.5 正规表达式与正规集

--正规表达式与正规集

--正规表达式与正规集

--讨论:正规式的应用

--练习5

-3.6 正规文法与正规式

--正规文法与正规式

--正规文法与正规式

--练习6

-3.7 正规式与FA

--正规式与FA

--正规式与FA

--练习7

-词法分析作业

-讨论:如何实现词法分析器

第4章 自顶向下的语法分析

-4.1 自顶向下语法分析及其面临的问题

-- 自顶向下语法分析及其面临的问题

--自顶向下语法分析及其面临的问题

--自上而下语法分析中面临的问题

--练习1

-4.2 文法的等价转化

--文法的等价转化

--文法的等价转化

--讨论:什么样的文法才是等价的?

--练习2

-4.3 LL(1)文法与递归下降分析法

--LL(1)文法与递归下降分析法

--LL(1)文法与递归下降分析法

--LL(1)分析法和递归下降法的异同

--练习3

-4.4 构建FIRST集合FOLLOW集合

--构建FIRST集合FOLLOW集合

--构建FIRST集合FOLLOW集合

--讨论:FIRST集合FOLLOW集合的关系

--练习4

-4.5 LL(1)分析器工作原理

-- LL(1)分析器工作原理

--LL(1)分析器工作原理

-4.6 LL(1)分析表构造算法

--LL(1)分析表构造算法

--LL(1)分析表构造算法

--练习5

-讨论:自顶向下语法分析算法的实现方式

第5章 自底向上的语法分析

-5.1 自底向上的语法分析及优先分析

--自底向上的语法分析及优先分析

--自底向上的语法分析及优先分析

--练习1

-5.2 LR分析器

--LR分析器

--LR分析器

--练习2

-5.3 活前缀和LR(0)项目

-- 活前缀和LR(0)项目

--活前缀和LR(0)项目

--练习3

-5.4 构造识别活前缀的FA

--构造识别活前缀的FA

--构造识别活前缀的FA

--练习4

-5.5 LR(0)分析表构造算法

--LR(0)分析表构造算法

--LR(0)分析表构造算法

--练习5

-5.6 SLR(1)分析法

--SLR(1)分析法

--SLR(1)分析法

--练习6

-5.7 LR(1)分析法与LALR分析法

--LR(1)分析法与LALR分析法(上)

--LR(1)分析法与LALR分析法(下)

--LR(1)分析法与LALR分析法

--练习7

-讨论:比较四种LR分析法

第6章 语法制导翻译和中间代码生成

-6.1 语义分析和语法制导翻译概述

--语义分析和语法制导翻译概述

--语义分析和语法制导翻译概述

--练习1

-6.2 常见中间语言简介

--常见中间语言简介

--常见中间语言简介

--讨论:为什么要引入中间代码

--练习2

-6.3 简单算术表达式和赋值语句翻译

--简单算术表达式和赋值语句翻译

--简单算术表达式和赋值语句翻译

--练习3

-6.4 布尔表达式和复制语句翻译

--布尔表达式和复制语句翻译

--布尔表达式和复制语句翻译

-6.5 拉链和回填

--拉链与回填

--拉链与回填

--练习4

-6.6 程序控制语句翻译

--程序控制语句翻译

--程序控制语句翻译举例

--程序控制语句翻译

--练习5

-6.7 for循环语句的翻译

--for循环语句的翻译

--for循环语句的翻译

-6.8 GOTO语句和情况语句的翻译

--GOTO语句和情况语句的翻译

--GOTO语句和情况语句的翻译

--练习6

-6.9 含数组元素的算术表达式的翻译

--含数组元素的算术表达式的翻译

--含数组元素的算术表达式的翻译

--练习7

-6.10 数组元素赋值语句的翻译

--数组元素赋值语句的翻译

--数组元素赋值语句的翻译

--练习8

-讨论:三元式和四元式

第7章 符号表

-7.1 符号表概述

--符号表概述

--符号表概述

--练习1

-7.2 符号表的建立

--符号表的建立

-- 符号表的建立

--练习2

-讨论:符号表

第8章 运行时存储空间组织

-8.1 运行时存储空间组织概述

--运行时存储空间组织概述

--运行时存储空间组织概述

-8.2 运行时分配策略

--运行时分配策略

--运行时分配策略

--练习

第9章 中间代码优化

-9.1 线性窥孔优化

--线性窥孔优化

--线性窥孔优化

-9.2 基本块及其优化方法

--基本块及其优化方法

--基本块及其优化方法

-9.3 循环概念

--循环概念

--循环概念

-9.4 循环优化

--循环优化

--循环优化

-代码优化作业

-讨论:代码优化

编译的基本过程笔记与讨论

也许你还感兴趣的课程:

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