编译原理
王道论坛bilibili
原创总结
基础知识
文法
词法分析
理论模型
- 正规文法
- 有限自动机
实现
- 词法分析程序
语法
理论模型
-
自下而上
- 下推自动机
-
自上而下
- 优先分析
- LR分析
实现
- 递归下降分析法
- YACC
中间代码生成
语法制导翻译
- 三元式
- 四元式
运行时的数据区管理
栈式存储结构
-
顺序
- 数据区
- cpp 建立活动记录
- top :临时工作单元
- 内情向量
- 简单变量
- 参数列表 所占的大小 N个
- 参数个数
- 返回地址
- *sp:老SP
-
嵌套过程 递归
-
层次显示表 display表
- 只允许直系的调用
- 抄写父亲 display 表
- 加上自己的sp
-
建立display表
-
-
子主题 3
堆 存储管理
-
对象 全局的
- 碎片化
-
对策
-
分配
-
固定长块管理
- 固定划分、链表回收 再利用
-
可变长块
-
固定划分没用完 内部碎片:原因
-
搜词匹配 堆管理策略
-
最优匹配
- 遍历查找最优 速度慢
-
最差匹配
- 最大的一块切掉
-
-
-
-
释放
-
free
-
无用单元的搜集
- 碎片整理
- 执行时机
- 收集过程
-
代码优化
介绍
-
复杂度
-
级别
- 语言
- 算法
- 中间代码级
- 目标代码级
-
实质
- 精简代码 存储
-
优化代价
- 汇编 最优化的
- 接近汇编即可
优化分类
-
顺序
局部优化- 拆解 删除公共子表达式
-
循环优化
全局优化
关联参数 replace-
循环不变 代码外提
-
降低运算强度 乘法变为加减
-
变换循环控制变量 并删除自增赋值狮
- for(int i=0;sum < 10;){}
-
-
顺序
基本块内的优化-
划分皆基本块
- 顺序执行的 语句段 程序流图的框框
- 四元程序 / 汇编样式
- 子函数
-
块内优化
-
-
顺序
基本块的DAG 表示-
定义 - 树的构建
- 无环路有向图
- 叶子节点 :参数
- 内部节点:运算符
- 附标 :赋值
-
优化方法
- 合并已知量
- 删除无用赋值
- 检查公众表达式
-
自下而上还原回去 四元式子
-
进一步优化
-
删除无用赋值
- 后面的代码用不到 变量
- 节点不附带任何标识符 运算
-
-
-
循环
-
循环查找算法
-
找到 程序流图 循环
-
必经节点集
- 入度
- 迭代
-
DFS 深度为主的节点排序
-
回边找循环
-
-
控制流程分析
-
-
全局优化
-
循环优化
XMind - Trial Version