编译程序总体结构

版权声明:本文为博主原创文章,遵循 CC 4.0 BY 版权协议,转载请附上原文出处链接和本声明。
本文链接: https://blog.csdn.net/qq_44721831/article/details/102751781

编译程序总体结构

在这里插入图片描述

1、词法分析

在这里插入图片描述
词法分析由词法分析器(Lexical Analyzer)完 成,词法分析器又称为扫描器(Scanner)
词法分析器从左到右扫描组成源程序的字符 串,并将其转换成单词(记号—token)串;同 时要:查词法错误,进行标识符登记——符 号表管理。
输入:字符串
输出:(种别码,属性值)——序对

  • 属性值——token的机内表示

2、语法分析

语法分析由语法分析器(Syntax Analyzer)完成,语 法分析器又叫Parser。

功能:

  • Parser实现“组词成句” :将词组成各类语法成分:表达式、因子、项,语句,子程序…
  • 构造分析树
  • 指出语法错误
  • 指导翻译

输入:token序列
输出:语法成分

在这里插入图片描述

3、语义分析

语义分析(semantic analysis)一般和语法 分析同时进行,称为语法制导翻译 (syntax-directed translation)

功能:分析由语法分析器识别出来的语 法成分的语义

  • 获取标识符的属性:类型、作用域等
  • 语义检查:运算的合法性、取值范围等
  • 子程序的静态绑定:代码的相对地址
  • 变量的静态绑定:数据的相对地址

4、中间代码生成

中间代码(intermediate Code)

波兰表示问题——Lukasiewicz1929年发明

  1. 中缀表示(Infix notation):(a+①b)*(-c+②d)+③e/f
  2. 波兰表示(Polish / Prefix / Parenthesis-free / Lukasiewicznotation)
    • ——也就是前缀表示 +③*+①a b+②@cd/ef
  3. 逆波兰表示(Reverse Polish / Suffix / Postfix notation)
    • ——也就是后缀表示 a b +①c@ d +②*ef/+ ③运算顺序从左向右

中间代码的特点:

  • 简单规范
  • 与机器无关
  • 易于优化与转换

5、代码优化

代码优化(optimization)是指对中间代码进 行优化处理,使程序运行能够尽量节省存 储空间,更有效地利用机器资源,使得程 序的运行速度更快,效率更高。当然这种 优化变换必须是等价的。

  • 与机器无关的优化
  • 与机器有关的优化

与机器无关的优化

局部优化 :

  • 常量合并:常数运算在编译期间完成,如8+9*4
  • 公共子表达式的提取:在基本块内进行的

循环优化:

  • 强度削减 ==>用较快的操作代替较慢的操作
  • 代码外提 ==>将循环不变计算移出循环

与机器有关的优化

寄存器的利用

  • 将常用量放入寄存器,以减少访问内存的次数

体系结构

  • MIMD、SIMD、SPMD、向量机、流水机

存储策略

  • 根据算法访存的要求安排:Cache、并行存储体 系——减少访问冲突

任务划分

  • 按运行的算法及体系结构,划分子任务(MPMD)

6、目标代码生成

将中间代码转换成目标机上的机器指令代码 或汇编代码

  • 确定源语言的各种语法成分的目标代码结构 (机器指令组/汇编语句组)
  • 制定从中间代码到目标代码的翻译策略或算法

目标代码的形式

  • 具有绝对地址的机器指令
  • 汇编语言形式的目标程序
  • 模块结构的机器指令(需要链接程序)

7、表格管理

管理各种符号表(常数、标号、变量、过程、 结构……),查、填(登记、查找)源程序 中出现的符号和编译程序生成的符号,为 编译的各个阶段提供信息。

  • 辅助语法检查、语义检查
  • 完成静态绑定、管理编译过程

Hash表、链表等各种表的查、填技术

“数据结构与算法”课程的应用

8、错误处理

进行各种错误的检查、报告、纠正,以及相 应的续编译处理(如:错误的定位与局部化)
词法:拼写……
语法:语句结构、表达式结构……
语义:类型不匹配、参数不匹配……

9、模块分类

分析:词法分析、语法分析、语义分析
综合:中间代码生成、代码优化、目标 代码生成
辅助:符号表管理、出错处理
8项功能对应8个模块

猜你喜欢

转载自blog.csdn.net/qq_44721831/article/details/102751781
今日推荐