1. 编译器的作用


<aside> 💡 编译器 Compiler

<aside> 💡 解释器 Interpreter

2. 编译器的结构


<aside> 💡 Frontend → 分析部分:跟机器无关

<aside> 💡 Backend → 综合部分:跟机器相关

2.1 Phases 步骤

Untitled

  1. 词法分析/扫描 Lexical analysis/scanning

    1. 读入源程序的字符流,输出为有意义的词素 Lexeme
    2. <token-name, attribute-value>
      1. token-name 由语法分析步骤使用
      2. attribute-value 指向相应的符号表条目,由语义分析/ 代码生成步骤使用
  2. 语法分析 Syntax analysis/parsing

    1. 根据各个词法单元的第一个分量来创建树型的中间表示形式,通常是语法树 (Syntax tree)
    2. 中间表示形式指出了词法单元流的语法结构

Untitled

  1. 语义分析 Semantic analysis
    1. 使用语法树和符号表中的信息,检查源程序是否满足语言定义的语义约束
    2. 同时收集类型信息,用于代码生成、类型检查、类型转换

Untitled

  1. 中间代码生成
    1. 根据语义分析输出,生成类机器语言的中间表示
    2. 三地址代码
      1. 每个指令最多包含三个运算分量
      2. 易于生成机器语言指令
  2. 中间代码优化
    1. 通过对中间代码的分析,改进中间代码的质量
  3. 代码生成
    1. 把中间表示形式映射到目标语言
  4. Others
    1. 符号表管理:记录源程序中使用的变量的名字,收集各种属性
    2. 趟 Pass
    3. 编译器构造工具

3. 程序设计语言的基础概念