首页 > 其他 > 详细

编译原理-笔记-1

时间:2020-03-04 23:32:04      阅读:86      评论:0      收藏:0      [点我收藏+]

什么是编译原理

编译原理

编译原理主要就是讲编译器的作用的

下面这张图是很重要的

技术分享图片

预处理器的作用:

就是把存储在不同文件中的源程序聚合在一起把把被称为宏的缩写语句转换为原始语句

可重定位:

在内存中存放的起始位置L不是固定的

加载器:

修改可重定位地址:将修改后的指令和数据放到内存中适当的位置

起始位置+相对位置=绝对位置

链接器

将多个可重定位的机器代码文件(包括库文件)连接到一起,解决外部内存地址问题

编译器的结构

编译器的结构

技术分享图片

其中语法分析树和语义分析器和中间代码生成器可以合并在一起

词法分析/扫描

词法分析的主要任务

从左向右逐行扫描源程序的字符,识别出各个单词,确定单词的类型。
将识别出的单词转换成统一的机内表示——词法单元(token)形式
token:< 种别码,属性值>

技术分享图片

语法分析

语法分析器(parser)从词法分析器输出的token序列中
识别出各类短语,并构造语法分析树(parse tree)
语法分析树描述了句子的语法结构

例一 赋值语句的分析树

技术分享图片

例二 变量声明语句的分析树

技术分享图片

declaration 声明

type 类型

identify secrets 的缩写

语义分析

语义分析的主要任务

收集标识符的属性信息
种属(Kind)
简单变量、复合变量(数组、记录、…)、过程、…
类型(Type)
整型、实型、字符型、布尔型、指针型、…
存储位置、长度

技术分享图片


作用域
参数和返回值信息

技术分享图片

词义分析的主要任务

语义检查

收集标识符的属性信息

? 变量或过程未经声明就使用

? 变量或过程名重复声明

? 运算分量类型不匹配

? 操作符与操作数之间的类型不匹配

    数组下标不是整数

? 对非数组变量使用数组访问操作符

? 对非过程名使用过程调用操作符

? 过程调用的参数类型或数目不匹配

? 函数返回类型有误

常用的中间表示形式

三地址码(Three-address Code)

? 三地址码由类似于汇编语言的指令序列组成,

? 每个指令最多有三个操作数(operand)

语法结构树/语法树(Syntax Trees)

技术分享图片

三地址指令的表示

四元式(Quadruples)

? (op, y, z, x)

三元式(Triples)

间接三元式(Indirect triples)

三地址的四元式表示

技术分享图片

一个例子

技术分享图片

目标代码生成器的作用

目标代码生成以源程序的中间
表示形式作为输入,并把它映
射到目标语言

目标代码生成的一个重要任务
是为程序中使用的变量合理分
配寄存器

机器无关代码优化器

代码优化

为改进代码所进行的等价
程序变换,使其运行得更
快一些、占用空间更少一
些,或者二者兼顾

编译原理-笔记-1

原文:https://www.cnblogs.com/a-small-Trainee/p/12416480.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!