【编译原理】1 绪论

1 程序设计语言和编译程序

1.1 相关定义

  • 一条指令:计算机所能执行的每一种操作
  • 指令系统:计算机能够执行的全部指令集合
  • 低级语言:面向机器
    (1)机器语言:二进制形式的指令
    【注意】计算机唯一可直接识别并接受的语言
    (2)汇编语言:用助记符代替机器语言的语言
    【注意】必须翻译成机器语言才可被计算机直接识别
    高级语言:面向应用
    (FORTRAN、PASCAL、C、ADA、半解释半执行Java、解释BASIC)
  • 汇编程序:将汇编语言翻译成机器语言的程序
  • 翻译程序
    (1)编译程序:高级语言(源程序)→ 低级语言(目标程序)→ 执行目标程序
    (2)解释程序:高级语言(源程序)→ 逐条读出源程序,并解释执行(不产生目标程序)
  • 编译程序的功能
    【编译原理】1 绪论

1.2 高级语言程序执行阶段

1.2.1 编译程序

  1. 编译阶段:源程序 → 目标程序
  2. 汇编阶段(可选):汇编语言目标程序 →(汇编程序)→ 机器语言目标程序
  3. 运行阶段:目标程序 + 数据 → 计算结果
  • 源程序的编译和运行阶段
    【编译原理】1 绪论
  • 源程序的编译、汇编和运行阶段
    【编译原理】1 绪论

1.2.2 解释程序

【编译原理】1 绪论

2 编译程序的历史及发展

  • 机器语言 → 汇编语言(汇编程序)→ 高级语言
  • 文法
    (1)0型
    (2)1型
    (3)2型(上下文无关文法)—— 最有用
      ① 有限自动机
      ② 正规表达式
    (4)3型
  • 编译程序的编译器(分析程序生成器):对编译程序的自动生成,仅能够自动完成编译器的部分工作
  • 语法分析器自动生成工具:YACC
    词法分析器自动生成工具:Lex
  • 交互开发环境IDE
    (1)编辑器
    (2)链接程序
    (3)调试程序
    (4)项目管理程序
  • 现代编译技术:并行编译

3 编译过程和编译程序结构

  • 编译程序的工作过程:从整个源程序开始到输出目标程序为止的整个过程
    一个编译过程可分为一遍或多遍完成,每一遍完成所规定的任务,使编译程序的结构更加清晰
  • 编译过程阶段
    (前端)
    1° 词法分析
    2° 语法分析
    3° 语义分析和中间代码生成
    (可选)
    4° 优化
    (后端)
    5° 目标代码生成
  • 编译程序的结构示意
    【编译原理】1 绪论

3.1 词法分析

  • 任务:源程序→单词符号流(内部码)
  • 规则:语言的构词规则

3.2 语法分析

  • 任务:单词符号流 → 各类语法单位(语法范畴)
  • 规则:语言的语法规则(文法规则)
  • 文法:上下文无关文法

3.3 语义分析和中间代码生成

  • 任务:对各类语法单位初步翻译
    (1)对每种语法范畴进行静态语言检查
    (2)检查正确后进行中间代码翻译
  • 规则:语言的语义规则
  • 中间代码:介于高级语言和低级语言之间的一种独立于具体硬件的记号系统
    (1)四元式
    (2)三元式
    (3)间接三元式
    (4)逆波兰记号

3.4 优化

  • 任务:对中间代码进行等价交换或改造或对目标代码进行优化→更高效的目标代码
  • 常用优化措施
    (1)删除冗余运算
    (2)删除无用赋值
    (3)合并已知量
    (4)循环优化
  • 规则:程序的等价交换规则

3.5 目标代码生成

  • 任务:中间代码→机器语言或汇编语言
  • 与目标机器的硬件结构有关

3.6 表格管理程序

  • 编译各阶段都涉及
  • 编译程序的绝大部分时间都用在造表、查表和更新表格的事务上

3.7 出错处理程序

  • 与编译各阶段都有联系,与前三个阶段联系尤为密切
  • 为了尽可能多地发现错误,应在发现错误后还能继续编译下去

4 编译程序的开发

【编译原理】1 绪论

其中,I是编译器所用语言

  • 编译开发过程中最关键的一步:确定编译程序的开发方案及方法
    作用:使编译程序具有易读性和易改性
  • 编译程序的开发技术
    (1)自编译
    (2)交叉编译
    (3)自展
    (4)移植

4.1 自编译

  • 定义:用某种高级语言编写自己的编译程序
  • 图示
    【编译原理】1 绪论

4.2 交叉编译

  • 定义:用A机器上的编译程序来产生可在B机器上运行的目标代码
  • 图示
    【编译原理】1 绪论

4.3 自展

  • 方法
    1° 确定一个非常简单的核心语言 L 0 L_0 L0
    2° 用机器语言或汇编语言编写出 L 0 L_0 L0的编译程序 T 0 T_0 T0
    3° 把 L 0 L_0 L0扩充到 L 1 L_1 L1,此时 L 0 ⊂ L 1 L_0⊂L_1 L0L1,并用 L 0 L_0 L0编写 L 1 L_1 L1的编译程序 T 1 T_1 T1(自编译)
    4° 把 L 1 L_1 L1扩充到 L 2 L_2 L2,此时 L 1 ⊂ L 2 L_1⊂L_2 L1L2,并用 L 1 L_1 L1编写 L 2 L_2 L2的编译程序 T 2 T_2 T2(自编译)
    ⋅ ⋅ ⋅ ⋅ ⋅ ⋅ ······ 不断扩展,直到完成所要求的编译程序

4.4 移植

  • 定义:A机器上的某种高级语言的编译程序稍加改动后能够在B机器上运行
  • 程序可移植:一个程序能较容易地从A机器上搬到B机器上运行
    移植具有一定的局限性

4.5 编译程序自动生成

【编译原理】1 绪论

5 构造编译程序所应具备的知识内容

  • 对被编译的源语言,要深刻理解其结构(语法)和含义
  • 必须对目标机器的硬件和指令系统有深刻的了解
  • 必须熟练掌握编译方法,编译方法掌握的如何将直接影响到编译程序的成败

6 补充概念

  • 趟(遍):在一个特定的实现中,多个步骤的活动可以被组合成一趟
  • 每趟读入一个输入文件并产生一个输出文件
  • 前端趟
    可选趟
    后端趟