2020-05-13 编译原理 9 机器无关的优化引言 代码优化或代码改进 消除不必要 替换为更快的同功能指令 全局优化 具体的优化实现基于数据流分析计数 用以收集程序相关信息的算法 优化的来源 编译器只能通过一些相对底层的语义等价转换来优化代码 冗余的原因 源程序中的冗余 高级语言的副产品 语义不变的优化 公共子表达式的消除0 复制传播 死代码消除 常量折叠 全局公共子表达式 表达式E 如果某次出现之前必然... Continue reading...
2020-04-30 编译原理 8 代码生成 要解决的问题 正确性 易于实现, 测试和维护 输入IR的选择: 四元式, 三元式, 字节代码, 堆栈机代码, 后缀表示, 抽象语法树, DAG 输出: RISC, CISC, 可重定向代码, 汇编语言目标语言 目标机模型 使用三地址机器的模型 指令 加载: LD dst,addr addr内存的内容加载到dst寄存器 保存: ST x,r 寄存器r到x 计算: OP dst,s... Continue reading...
2020-04-21 编译原理 7 运行时刻环境 存储管理: 栈分配, 堆管理, 垃圾回收 对变量, 数据的访问 存储分配的典型方式 代码, 静态区, 堆区, 空闲内存, 栈区 静态分配 全局常量, 全局变量 动态分配 栈式存储: 和过程调用/返回同步, 值的声明周期与过程生命周期相同 堆存储: 数据对象比创建它的过程更加长寿 手工回收/垃圾回收机制栈式分配 活动树 在时间上是嵌套的: 后调用的先返回, 栈数据结... Continue reading...
2020-04-02 编译原理 6 第六章: 中间代码生成 中间代码表示 有向无环图DAG 三地址代码: x = y op z 类型检查: 类型, 类型检查, 表达式的翻译 中间代码生成: 控制流, 回填 编译器前端 与后端在中间代码分开 前端是机器无关的 词法语法->语义检查->中间代码生成 中间代码表示及其好处 形式: 抽象语法树, 三地址代码 重定位: 新的机器, 只需新的后端(中间代码到目标代码翻译... Continue reading...
2020-03-17 编译原理 5 第五章: 语法制导的翻译 翻译 CFG非终结符号代表了语言的某个构造 程序设计语言的构造由更小的构造组合而成 一个构造的语义可以由更小的构造的含义综合而来 也可以从附近的构造继承而来 语法制导定义: 将文法符号与某些属性相关联, 并用语义规则来描述如何计算属性的值 语法制导翻译: 在产生式体中加入语义动作, 并在适当时候执行动作语法制导的定义SDD 上下文无关文法和属性/规则的结合 关联... Continue reading...
2020-02-27 编译原理 4 第四章: 语法分析语法分析器 基本作用 从词法分析器获得词法单元序列, 判断能否由该语言的文法生成 错误, 则报错 正确, 则生成语法树 分类 自顶向下分析器: 根部开始构造(LL文法) 自底向上分析器: 从叶开始构造(LR文法) 总是从左到右扫描, 只处理特定类型的文法 上下文无关文法 终结符号: 组成串的基本符号 非终结符号: 表示串集合的语法变量 开始符号: 某个被指定的非... Continue reading...
2020-02-18 编译原理 3 第三章: 词法分析词法分析器作用(正则表达式) 读入: 字符流 处理: 组成词素 过滤: 空白, 换行, 制表符, 注释 符号: 词素添加到符号表 输出: 词法单元序列 独立的词法分析器 逻辑上独立于语法分析, 实践上与语法分析在同一趟 好处 简化编译器设计: 由词法分析器完成简单处理 提高效率: 词法简单, 高效实现, 用有穷自动机 可移植: 组合多个语法分析器 词法单元: ... Continue reading...