编译原理

概论

2020-02-08 10:00 CST
2020-03-27 23:21 CST
CC BY-NC 4.0

评分标准

  • 书面作业 10%
    • 2% 按时提交
    • 2% 提交内容
    • 6% 作业得分
    • 提交截止24小时前联系老师得到许可可以在3天内缓交并得到2%+6%的分数
  • 上机实验 30%
    • 6% 按时提交
    • 6% 提交内容(说明不能超过3页,否则倒扣分)
    • 18% 实验得分
    • 组队调整
      • 单人模式:1.10倍
      • 两人合作:组长1.05倍,组员1.00倍
      • 三人合作:组长0.95倍,组员0.90倍
    • 额外奖励:第3次实验进行编译效率PK
    • 实验内容:全部
    • 给分规则:
      • 一次实验100分,四次400分
      • 编译效率Bonus先判定,然后判定组队加成
      • 额外分数计入所有平时分(40%)
  • 期末考试 60%

编译器的作用

编译器:

  • 输入源语言的程序
  • 输出目标语言编写的程序
  • 通常目标程序是可以执行的

解释器:

  • 利用输入执行源程序中指定的操作
  • 不生成目标程序,而是根据源程序的语义直接运行
  • 运行中出现错误修复后无法从断点直接继续

编译器的结构

  • 分析部分(前端)
    • 分析语法和词法
    • 收集信息存放到符号表
    • 与机器无关
  • 综合部分(后端)
    • 根据中间表示和符号表信息构造目标程序
    • 与机器相关

编译器执行的7个步骤:输入字符流(token)

  1. 词法分析器 -> 符号流
    • 读入字符流,输出为有意义的词素(Lexeme)
    • token_name:语法分析
    • attribute_name:语义分析、代码生成
  2. 语法分析 -> 语法树 (语法错误?)
    • 根据词法单元的第一个分量来创建树形的中间表示形式(如语法树),指出了词法单元流的语法结构
  3. 语义分析 -> 语法树 (类型错误?)
    • 使用语法树和符号表中的信息,检查源程序是否满足语言定义的语义约束,同时收集类型信息
  4. 中间代码生成器 -> 中间表示形式
    • 根据语义分析输出,生成类机器语言的中间表示
    • 三地址代码:
      • 每个指令最多包含三个运算分量
      • 线性指令、结构简单,易于生成机器指令
  5. 机器无关代码优化器 -> 中间表示形式
    • 通过对中间代码的分析,改进中间代码的质量(快、短、耗能少……嗯?)
  6. 代码生成器 -> 目标机器语言
    • 把中间表示形式映射到目标语言
    • 寄存器的分配、指令选择
  7. 极其相关代码优化器 -> 目标机器语言

其他概念

  • 符号表管理:记录源程序中使用的变量的名字,收集各种属性
  • 趟(Pass)(没有展开讲)
  • 编译器构造工具
    • 扫描器(Lex/Flex)
    • 语法分析器(Yacc/Bison)
    • 语法制导的翻译引擎