绪论


目录
  • 1. 什么是编译
    • 编译器在语言处理系统中位置
  • 2. 编译系统的结构
  • 3. 词法分析/扫描(Scanning)
  • 4. 语法分析(parsing)
  • 5. 语义分析
  • 6. 中间代码生成概述
    • 常用的中间代码表示形式
    • 常用的三地址指令
    • 三地址指令的表示
    • 三地址指令的四元式表示
    • 中间代码生成的例子
  • 7. 编译器后端概述
    • 目标代码生成
    • 编译器的结构
  • 总结

1. 什么是编译

image-20211101164859067

编译: 将高级语言翻译成汇编语言机器语言(目标语言)的过程
(源语言) (目标语言)

编译器在语言处理系统中位置

image-20211101195402535

预处理器(Preprocessor):

  • 把存储在不同文件中的源程序聚合在一起
  • 把被称为的缩写语句转换为原始语句

可重定位(Relocation):

  • 在机器代码中存储的是相对地址
    起始位置 + 相对地址 = 绝对地址

链接器:

  • 将多个可重定位的机器代码文件(包括库文件)连接到一起
  • 解决外部内存地址问题

加载器:

  • 修改可重定位地址
  • 将修改后的指令和数据放到内存中适当的位置

2. 编译系统的结构

image-20211101195806053

image-20211101200242734

3. 词法分析/扫描(Scanning)

image-20211101200737048

image-20211101200837271

4. 语法分析(parsing)

image-20211101202456507

image-20211101202522471

image-20211101202735039

5. 语义分析

  • 收集标识符的属性信息
    • 种属(Kind)
    • 类型(Type)
    • 存储位置, 长度
    • 作用域
    • 参数和返回值信息
      • 参数个数, 参数类型, 参数传递方式, 返回值类型, ......
  • 语义检查
    • 变量或过程未经声明就使用
    • 变量或过程名重复声明
    • 运算分量类型不匹配
    • 操作符与操作数之间的类型不匹配
      • 数组下标不是整数
      • 对非数组变量使用数组访问操作符
      • 对非过程名使用过程调用操作符
      • 过程调用的参数类型或数目不匹配
      • 函数的返回类型有误

image-20211101204032515

6. 中间代码生成概述

常用的中间代码表示形式

image-20211101204330449

常用的三地址指令

image-20211101204401387

三地址指令的表示

image-20211101204715542

三地址指令的四元式表示

image-20211101204800881

中间代码生成的例子

image-20211101204903356

j: jump

7. 编译器后端概述

目标代码生成

image-20211101205320394

编译器的结构

image-20211101205449163

总结

  • 词法分析: 识别每个单词的类型, 给出
    token: < 种别码, 属性值 >
  • 语法分析: 根据文法规则, 构建语法分析树
  • 语义分析: 手机标识符的属性和构建符号表
  • 中间代码生成: 三地址指令的四元式表示
    x = y op z ===> (op, y, z, x)