编译原理——概述
基本概念
- 编译:把源程序转换为目标程序的过程
-
翻译程序:扫描所输入的源程序,将其转换为目标程序或者直接翻译成结果
-
编译程序:即编译器,将源程序翻译成目标程序的翻译器;源程序和数据分开处理
- 解释程序:解释器,直接执行源程序的翻译器,不生成目标程序,同时处理源程序和数据
-
编译程序:即编译器,将源程序翻译成目标程序的翻译器;源程序和数据分开处理
-
翻译过程
- 高级语言程序——编译程序——>低级语言程序
- 汇编语言——汇编程序——>机器语言程序
- 编译的阶段和任务
- 分析阶段
* 语法分析
* 词法分析
* 语义分析- 综合阶段
* 中间代码生成
* 代码优化
* 目标代码生成- 符号表的管理
- 错误诊断和处理
-
分析阶段:对源程序进行结构分析和语义分析,从而把源程序正文转换为某种内部表示形式
-
语法分析:依次读入源程序的每个字符,对构成源程序的字符进行分解,并识别出来特殊的字符串,例如变量名等
- 空格:被删去
- 注释:被跳过
- 识别出来的标识符放入符号表,并对某些加上属性值
-
词法分析:层次结构分析,根据语法进行分组
-
语义分析:对语句的意义进行检查
-
类型检查:
- 每个运算符和运算对象是否符合要求
- 数组下标是否合法
- 形参实参是否匹配,类型是否匹配
-
类型检查:
-
-
综合阶段
- 中间代码生成:一种抽象的机器程序
- 代码优化:对代码进行改进,使其占用空间少,运行速度快
-
目标代码生成:一般生成可以重定位的机器代码或者汇编语言代码
- 对程序使用的每个变量要指定存储单元
- 对变量进行存储器分配
-
符号表管理
- 记录源程序使用的标识符
- 收集每个标识符的各种属性信息
-
错误处理
- 词法分析检测出来的非法字符错误
- 语法分析出来的不符合语法规则错误
- 语义分析出来的操作无意义的结构
- 代码生成程序检测出来的目标程序区超范围,计算机容量限制等
-
其他概念:
- 前端:编译程序中与源程序语言有关,与目标机器无关的部分
- 后端:编译程序中与目标机器有关的部分
-
遍:对源程序或者中间形式从头到尾扫描一遍,并作加工处理,生成新的中间形式或者目标程序
-
预处理器:
- 宏处理器:主要处理宏定义和宏调用
-
文件包含:主要把文件的包含声明扩展为程序正文
- 例如用#include <stdio.h>时,就用stdio.h的内容替换此语句
- 语言扩充:用更先进的控制流和数据结构来增强原来的语言。
-
汇编程序
- 助记符表示操作码。标识符表示存储地址
-
连接装配程序:
-
读入:
- 读入可重定位的机器代码
- 修改重定位地址
- 把修改后的指令和数据存放在适当的地方或者形成可执行文件
-
连接
* –把几个可重定位的机器代码文件连接成一个可执行的程序
-
读入: