第一章 引论

1.1编译器概述

翻译器(translator)、编译器(compiler)、解释器(interpreter)编译器从逻辑上可以分成若干阶段每个阶段把源程序从一种表示变换成另一种表示,本章通过描述编译器的各个阶段来介绍编译这个课题。

编译各阶段

图片2.1

表达式的语法特征:

  • 任何一个标识符都是表达式
  • 任何一个数都是表达式
  • 如果e1和e2都是表达式,那么
    • e1 + e2
    • e1 * e2
    • (e1)
      也都是表达式

解释器和编译器的区别: 解释器不生成目标代码,而是直接执行源程序所指定的运算,解释器也需要对源程序进行词法,语法和语义分析,中间代码生成。

BASIC语言年代解释器

  • 功能:它将高级语言的源程序翻译成一种中间语言程序,然后对中间语言程序进行解释执行
  • 在那个年代,编译和解释两个功能是合在一个程序中,该程序被称为解释器
    Java语言年代解释器
  • 解释器的上述两个功能分在两个程序中
  • 前一个编译器,它把源程序翻译成一种叫做字节码的中间语言程序
  • 后一个叫做解释器,它对字节码程序进行解释执行

1.2编译器技术的应用

  • 高级语言的实现
    • 高级编程语言易于编程,但程序运行较慢
    • 低级语言编程时可实施更有效的控制方式,得到更有效的代码,但难编写、易出错、难维护
    • 流行编程语言的大多数演变都是朝着提高抽象级别的方向
    • 每一轮编程语言新特征的出现都刺激编译器优化的新研究
    • 每一轮编程语言新特征的出现都刺激编译器优化的新研究
    • 支持用户定义的聚合数据类型和高级控制流,如数组和记录、循环和过程调用:C、Fortran
    • 面向对象的主要概念是数据抽象和性质继承,使得程序更加模块化并易于维护:Smalltalk、C++、C#、Java
    • 类型安全的语言:Java没有指针,也不允许指针算术。它用无用单元收集机制来自动地释放那些不再使用的变量占据的内存
    • Java设计来支持代码移植和代码移动
  • 针对计算机体系结构的优化
    • 计算机体系结构的迅速演化引起对新的编译器技术一种不知足的需要
    • 并行化
      • 编译器重新整理指令,使得指令级并行更有效
      • 编译器从传统的串行程序自动生成并行代码,使之运行于多处理器上
    • 内存分层
      • 编译器优化历来集中在优化处理器的执行上,但是现在更强调要使内存分层更有效
  • 新计算机体系结构的设计
    • 现在计算机系统的性能不仅仅取决于它的原始速度,还取决于编译器是否能生成充分利用其特征的代码
    • 在现代计算机体系结构的研究中,在处理器的设计阶段就开发编译器,并将编译生成的代码在模拟器上运行,以评价拟采用体系结构的特征
    • 编译器技术影响计算机体系结构设计的一个著名例子是精简指令集计算机(RISC)的发明
  • 程序翻译
    • 二进制翻译
      • 编译器技术可用于把一种机器的二进制代码翻译成另一种机器的代码,以运行原先为别的指令集编译的代码
    • 数据库查询解释器
      • 数据库查询由一些谓词组成,这些谓词由包含关系运算的布尔表达式组成,可以被解释执行,也可以被编译成搜索数据库的命令
  • 提高软件开发效率的工具
    • 源于编译器中代码优化技术的程序分析一直在改进软件开发效率
    • 类型检查
      类型检查是一种捕捉程序中前后不一致的成熟并且有效的技术
    • 边界检查
      数据流分析技术可用来定位缓冲区溢出
    • 内存管理
      自动的内存管理删除内存泄漏等内存管理错误