编译原理

第一章 引论

什么叫编译程序

翻译程序:把某一种语言程序(称为源语言程序)转换成另一种语言程序(称为目标语言程序)。

解释程序:以源语言写的源程序作为输入,但不产生目标程序,而是边解释边执行源程序本身。
优点:易于查错
缺点:效率低,运行速度慢

编译程序:源语言为高级语言,目标语言为汇编语言或机器语言之类的“低级语言”的翻译程序。
优点:只需分析和翻译一次,
缺点:在运行中发现的错误必须在源程序中查找

(运行编译程序的计算机称宿主机,运行编译程序所产生目标代码的计算机称目标机)

  • 诊断编译程序:专门用于帮助程序开发和调试
  • 优化编译程序:着重于提高目标代码效率
  • 交叉编译程序:产生不同于其宿主机的机器代码
  • 可变目标编译程序:不需重写编译程序中与机器无关的部分就能改变目标机

世界上第一个编译程序–FORTRAN编译程序是20世纪50年代中期研制成功的。

编译程序的结构

编译程序结构.png
词法分析器:又称扫描器,输入源程序,进行词法分析,输出单词符号。

语法分析器:简称分析器,对单词符号串进行语法分析(根据与法规则进行推导或归约),识别出各类语法单位,最终判断输入串是否构成语法上正确的“程序”。

语义分析与中间代码产生器:按照语义规则对语法分析器归约出(或推导出)的语法单位进行语义分析并把它们翻译成一定形式的中间代码。
中间代码可采用四元式、三元式、间接三元式、逆波兰记号和树形表示等等。
例如:许多编译程序采用四元序列形式:
Z := (X + 0.418)*Y/w 翻译成四元式为:
四元式.png

优化器:对中间代码进行优化处理。

目标代码生成器:把中间代码翻译成目标程序。

表格中最重要的是符号表,出错处理中出错处理程序

:具体实现编译过程时,受不同源语言、设计要求、使用对象和计算机条件(如主存容量)的限制,往往将编译程序组织为若干(Pass)。所谓“遍”就是对源程序或源程序的中间结果从头到尾扫描一次,并作有关的加工处理,生成新的中间结果或目标程序。

编译前端与后端:前端主要由与源语言有关但与目标机无关的那些部分(词法分析、语法分析、语义分析、中间代码产生)组成,后端反之,包括与目标机有关的代码优化和目标代码生成等。通常,后端不依赖于源语言而仅仅依赖于中间语言

Ada程序设计环境APSE中使用一种称为Diana的树形结构的中间语言;
Java语言环境中,虚拟机代码Bytecode。

程序设计环境:编译程序与编辑程序、连接程序、调试工具等一起构成。

编译程序的生成