Skip to content

引论

编译器与解释器

  • 编译器:读入某种语言(源语言)编写的程序,输出等价的另一种语言(目标语言)编写的程序(目标程序通常是可执行的)
  • 解释器:利用用户提供的输入执行源程序中指定的操作。不生成目标程序,根据源程序的语义直接运行

  • 编译器的构造:

    • 分析部分(前端):把源程序分解成组成要素以及相应的语法结构;用这个结构创建源程序的中间表示;同时收集源程序相关的信息,存放在符号表;(机器无关)
    • 综合部分(后端):根据中间表示和符号表信息构造目标程序(机器相关)
    • image.png|525
  • 词法分析:

    • 读入源程序的字符流,输出为有意义的词素
    • 分解为 \
      • token-name 由语法分析步骤使用
      • attribute-value 指向相应的符号表条目,由语义分析/ 代码生成步骤使用
      • 符号表管理:记录源程序中使用的变量的名字,收集各种属性
      • image.png|500
  • 语法分析:

    • 根据各个词法单元的第一个分量来创建树型的中间表示形式,通常是语法树
    • image.png|350
  • 语义分析:
    • 使用语法树和符号表中的信息,检查源程序是否满足语言定义的语义约束
    • 同时收集类型信息,用于代码生成、类型检查、类型转换
    • image.png|375
  • 中间代码生成:
    • 据语义分析输出,生成类机器语言的中间表示
    • 生成三地址代码(每个指令最多单个运算分量,如 t3 = id2 + t2)很容易进一步生成机器语言指令
    • image.png|350
  • 中间代码优化:
    • 过对中间代码的分析,改进中间代码的质量(更快、更短、能耗更低)
    • image.png|400
  • 代码生成:

    • 把中间表示形式映射到目标语言(寄存器的分配&指令选择)
    • image.png|375
  • 趟:每趟读入一个输入文件,产生一个输出文件

    • 步骤是逻辑组织方式
    • 和具体的实现相关

程序设计语言与编译器

  • 程序设计语言的新发展向编译器的设计者提出新的要求(不断支持新的语言特性)
  • 降低高级语言的执行开销,推动高级语言的使用
  • 编译器设计者还需要更好地利用新硬件的能力

程序设计语言的基础概念

  • 静态与动态

    • 静态:支持编译器静态决定某个问题
    • 动态:只允许在程序运行时刻作出决定
  • 作用域

    • 静态作用域:通过静态阅读程序可决定
    • 动态作用域:运行时确定 x 的指向
  • 环境与状态

    • 环境:从名字到存储位置的映射
    • 状态:从存储位置到它们值的映射
    • image.png|300