编译原理3.29


第一章 引论

1.1程序的翻译

翻译程序: 源语言->与之等价的目标语言
两种方式:1、编译 2、解释

编译方式

编译方式是一种分阶段进行的方式
翻译阶段:高级语言或汇编语言程序->汇编语言或机器语言的目标程序
运行阶段:输入数据–目标程序&系统子程序–>运行结果
特点:

  • 源程序的执行需要分阶段
    • 如果目标程序是机器语言程序,两大阶段:编译阶段和运行阶段。
    • 如果目标程序是汇编语言程序,三大阶段:编译阶段、汇编阶段和运行阶段。
  • 生成了目标代码,且可以多次执行。

说明:

  • 生成的目标程序不一定是机器语言的程序,也有可能是汇编语言程序;
  • 编译程序与具体的机器和语言有关,即任何一个具体的编译程序都是某一特定类型的计算机系统中关于某一特定语言的编译程序;
  • 对编译程序而言,源程序是输入数据,目标程序是输出结果

解释方式

解释程序将按源程序中语句的动态顺序,逐句地进行分析解释,并立即予以执行
特点:

  • 不生成目标代码,直接执行源程序本身。与前者方式的根本区别
  • 都需要进行词法、语法、语义分析
  • 更灵活,交互方便,节省空间
  • 效率低(时间开销、空间开销)

1.2编译程序的工作过程

  • 词法分析
  • 语法分析
  • 语义分析和中间代码生成
  • 中间代码优化
  • 目标代码生成

词法分析

依据语言词法规则,分析由字符组成的源程序,把它识别为一个一个具有独立意义的最小语法单位,即“单词”,并识别出与其相关的属性(如是标识符还是界限符,or数..)再转换成长度上统一的标准形式(这个形式既刻画单词本身,又刻画了它具有的属性,称为属性字),以供其他部分使用。

  • 扫描源程序的字符串,识别单词(关键字、标识符、常量、运算符、界限符)

eg:

属性字: <类别号class,自身值value>

语法分析

依据语法规则,逐一分析词法分析时得到的单词,把单词串分解成各类语法单位,即确定它们是怎样组成和语句,以及说明语句又是怎样组成程序的。分析时如发现有不合语法规则的地方,便将出错的位置及出错性质打印报告程序员。如无语法错误,则用另一种中间形式给出正确的语法结构,供下一阶段分析使用。

语义分析

依据语言的语义规则对语法分析得到的语法结构进行静态语义检查(确定类型、类型和运算合法性检查、识别含义与相 应的语义处理及其它一些静态语义检查),并用另一种内部形式表示出来,或者直接用目标语言表示出来。
凡在编译时可以确定的内容称为“静态”的;凡必须推迟 到程序运行时才能确定的内容称为“动态”的

代码优化

依据程序的等价变换规则,尽量压缩目标程序运行所需的 时间和所占的存储空间,以提高目标程序的质量。
优化的是中间代码/目标代码的质量,而非编译程序的质量

代码生成

如果语义分析时把源程序表示成中间形式而不是表示成目标指令,则由本部分完成从中间形式到目标指令的转换。如果语义分析时,已直接生成目标指令,则无需另外再做代码生成工作。
目标指令可能是绝对指令代码,或可重新定位的指令代码 或汇编指令代码。该阶段的工作有赖于硬件系统结构和机器指令含义。

表格管理

登记源程序中出现的每个名字以及名字的各种属性。有些名字的属性需要在各个阶段才能填入。

出错处理

源程序中的错误有语法错误和语义错误两种。

语法错误:源程序中不符合语法(或词法)规则的错误,它们可在词法分析或语法分析时检测出来。

语义错误:源程序中不符合语义规则的错误,一般在语义分析时检测出来,有的语义错误要在运行时才能检测出来。通常包括:说明错误、作用域错误、类型不一致等等。

1.3编译程序的结构

1.4编译程序的组织形式

遍(趟,趟程)

所谓一趟或一遍是指一个编译程序在编译时刻把源程序或源 程序的等价物(中间程序)从头到尾扫描一遍并转换成另一紧邻的 等价物的全过程。

根据编译程序在完成翻译任务的过程中需要对源程序或其中间等价物扫描的遍数,可以把编译程序分为单遍扫描的编译程序 (只需扫描一遍)和多遍扫描的编译程序(需扫描多遍)。

多遍的特点:
优点:

  • 节省内存空间
  • 提高目标程序质量
  • 缩短Compiler的开发周期

缺点:

  • 重复性工作
  • 延长了编译时间,降低了编译效率

并非单遍/多遍一定就好,视情况而定。
选择编译的“遍”数的原则:

  • 语言的大小、结构
  • 机器的规模
  • 设计的目的(如:编译速度、目标程序的运行速度)
  • 设计人员素质多少

编译的前端和后端

  • 前端主要由与源语言有关但与目标机器无关的那些部分组成, 如词法分析、语法分析、语义分析与中间代码生成及部分代码优 化工作。
  • 后端主要包括编译中与目标机器有关的那些部分,如与目标 机有关的代码优化和目标代码生成等。后端不依赖于源语言而仅 依赖于中间语言。

1.5编译程序的构造

高级语言的自编译性高级语言的自编译性

构造编译程序可以用机器言语、汇编语言和高级语言
高级语言的自编译性:一个语言可以用来编写自己的编 译程序。

编译的自展技术

即通过一系列自展途径而形成编译程序的过程。
先对语言的核心部分构造一个小小编译程序(可用低级语 言实现),再以它为工具构造一个能够编译更多语言成分的较大编译程序。如此扩展下去,越滚越大,最后形成所期望的整个编译程序。

编译的移植

即将一个机器(宿主机)上的一个具有自编译性的高级语 言编译程序移植到另一个机器(目标机)上。
利用A机器上的高级语言L编写能在B机器上运行的高级语言L的编译程序。

编译程序的自动化

小结

  • 什么是编译程序
  • 编译方式的特点
  • 解释方式的特点
  • 编译方式与解释方式的根本区别
  • 编译程序的工作过程
  • 编译程序的结构
  • 遍与编译程序的组织形式
  • 编译程序的构造方法

Author: 寒风渐微凉
Reprint policy: All articles in this blog are used except for special statements CC BY 4.0 reprint policy. If reproduced, please indicate source 寒风渐微凉 !
 Previous
Next 
  TOC