【编译原理】第一章 绪论

1.1 什么是编译

高级语言(源语言)翻译成汇编语言或机器语言(目标语言)的过程
编译

编译器在语言处理系统中的位置

编译器在语言处理系统中的位置
预处理器:把存储在不同文件中的源程序聚合在一起;把被称为宏的缩写语句转换为原始语句
可重定位:在内存中存放的起始位置L不是固定的
加载器:修改可重定位地址;将修改后的指令和数据放到内存中适当的位置
链接器:将多个可重定位的机器代码文件(包括库文件)连接到一起;解决外部内存地址问题

1.2 编译系统的结构

人工英汉翻译的例子

翻译
类似于人工英汉翻译的过程,编译也是一种语言之间的翻译。通过分析源语言得到语义,然后再生成目标语言。
词法分析:识别单词,确定单词的类型
语法分析:识别短语,构造语法分析树
语义分析:①收集标识符的属性信息②语义检查
语义检查

编译器的结构

在这里插入图片描述
编译器的结构主要分为词法分析器、语法分析器、语义分析器、中间代码生成器、目标代码生成器和极其相关代码优化器。对应着两大步骤“分析源语言”和“生成目标语言”。

词法分析

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

语法分析

语法分析器(parser)从词法分析器输出的token序列中识别出各类短语,并构造语法分析树(parse tree)
语法分析
可以对照来看,根据词法分析的结果识别出各类短语。
变量声明
赋值语句

语义分析
(1)收集标识符的属性信息

种属:简单变量、复合变量(数组、记录、…)、过程、…
类型:整型、实型、字符型、布尔型、指针型、…
存储位置、长度
存储位置、长度

作用域
参数和返回信息:参数个数、参数类型、参数传递方式、返回值类型、…
符号表
符号表是用于存放标识符的属性信息的数据结构。这里注意一点,NAME并非直接存在符号表中,而是记录其在字符串表中的位置与长度。

(2)语义检查

变量或过程未经声明就使用
变量或过程名重复声明
运算分量类型不匹配
操作符与操作数之间的类型不匹配
数组下标不是整数

  • 对非数组变量使用数组访问操作符
  • 对非过程名使用过程调用操作符
  • 过程调用的参数类型或数目不匹配
  • 函数返回类型有误
中间代码生成

常用的中间代码表示形式如下:
三地址码:三地址码由类似于汇编语言的指令序列组成,每个指令最多有三个操作数(operand)。三地址指令序列唯一确定了运算完成的顺序。
语法结构树/语法树

(1)三地址码

常用的三地址码
地址形式:源程序中的名字、常量和编译器生成的临时变量
因为地址在符号表中有记录,所以可以用名字代替。注意没有返回值的这里成为过程,有返回值的称作函数。
表示:四元式(op, y, z, x)、三元式、间接三元式
四元式表示
举例:
中间代码生成的例子

目标代码生成

目标代码生成以源程序的中间表示形式作为输入,并把它映射到目标语言
目标代码生成的一个重要任务是为程序中使用的变量合理分配寄存器

代码优化

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

1.3 为什么要学习编译原理

  • 更深刻地理解高级语言程序的内部运行机制
  • 教给我们如何严谨地去思考、编写程序
  • 编译原理蕴含了计算机科学解决问题的思路和方法,即“形式化→自动化”
  • 所涉及的理论和方法在很多领域都会被用到:自然语言处理、模式识别、人工智能、……
  • 很多应用软件都会用到编译技术

1.4 编译技术的应用

结构化编辑器
  • 引导用户在语言的语法约束下编制程序
  • 能自动地提供关键字和与其匹配的关键字
智能打印机

对程序进行分析,打印出结构清晰的程序

  • 注释以一种特殊的字体打印
  • 根据各个语句在程序的层次结构中的嵌套深度进行缩进
静态检测器

静态定位程序中的错误

  • 释放空指针或已释放过的指针
  • 检测出程序中永远不能被执行的语句
文本格式器

文本格式器处理的字符流中除了需要排版输出的字符以外,还包含一些用来说明字符流中的段落、图表或者上标和下标等数学结构的命令。

数据库查询解释器

数据库查询语句由包含了关系和布尔运算的谓词组成。查询解释器把这些谓词翻译成数据库命令,在数据库中查询满足条件的记录。

高级语言翻译工具
发布了75 篇原创文章 · 获赞 28 · 访问量 2万+

猜你喜欢

转载自blog.csdn.net/Swocky/article/details/104490541