编译原理-第一章:引论

概述

本章主要说明一些编译原理的基本概念。参考书:编译原理(陈火旺,第三版),龙书,虎书等等一系列。

高级程序的执行

目前的高级程序执行过程主要分为两种:

  1. 先编译后执行

高级语言--(编译)-->机器语言--(执行,带上数据)-->结果

这时介绍两个概念:

  • 翻译程序:一个程序,将一种语言程序(源语言)转换成另一种语言程序(目标语言),且二者在逻辑上是等价的。
  • 编译程序:将高级语言转化为低级语言的翻译程序。
  1. 解释执行
    以该语言写的源程序作为输入,不产生目标程序,而是边解释边执行源程序本身。

我们主要讨论的是第一种

编译过程概述

编译器的工作可以分成若干阶段,每个阶段把源程序从一种表示变换成另一种表示。编译程序的工作过程一般也可以划分为五个阶段:词法分析、语法分析、语义分析、分析与中间代码产生、优化、目标代码生成。

  1. 第一阶段,词法分析。词法分析的任务是:输入源程序,对构成原程序的字符串进行扫描和分解,识别出一个个的单词(亦称单词符号或简称符号),如基本字(即关键字)、标识符、常数、算符和界符(标点符号、左右括号等等)。
  2. 第二阶段,语法分析。语法分析的任务是:在词法分析的基础上,根据语言的语法规则,把单词符号分解成各类语法单元。通过语法分析,确定整个输入串是否构成语法上正确的“程序”。语法分析所依循的是语言的语法规则。语法规则通常用上下文无关文法描述
  3. 第三阶段,语义分析与中间代码产生。这一阶段的任务是:对语法分析所识别出的各类语法范畴,分析其含义,并进行初步翻译(产生中间代码)。这一阶段通常包括两个方面的工作。首先,对每种语法范畴进行静态语义检查,例如,变量是否定义、类型是否正确等。如果语义正确,则进行另一方面工作,即进行中间代码的翻译。依循的是语言的语义规则。通常使用属性文法描述语义规则
  4. 第四阶段,优化。优化的任务在于对前端产生的中间代码进行加工变换,以期在最后阶段能产生出更为高效(省时间和空间)的目标代码。主要方面:公共子表达式的提取、循环优化、删除无用代码等等。
  5. 第五阶段,目标代码生成。这一阶段的主要任务是:把中间代码(或经优化处理之后)变换成特定机器上的低级语言代码。这阶段实现了最后的翻译,它的工作有赖于硬件系统结构和机器指令的含义

编译器结构

在这里插入图片描述

  1. 词法分析器,又称扫描器,输入源程序,进行语法分析,输出单词符号。
  2. 语法分析器,简称分析器,对单词符号串进行语法分析,识别出各类语法单位,最终输入串是否构成语法上正确的“程序”。
  3. 语义分析和中间代码生成器,按照语义规则对语法分析器归约出的语法单位进行语义分析并把它们翻译成一定形式的中间代码。
    • 有些编译程序在识别出各类语法单位后,构造并输出一棵表示语法结构的语法树,然后,根据语法树进行语义分析和中间代码生成。
    • 还有许多编译程序在识别出语法单位后并不真正构造语法树,而是调用相应的语义子程序。在这种编译器中,扫描器、分析器和中间代码产生器三者并非截然分开的,而是相互穿插的。
  4. 优化器,对中间代码进行优化处理。
  5. 目标代码生成器,把中间代码翻译成目标程序。
  6. 表格与表格管理
    • 编译程序在工作过程需要保持一系列的表格,以登记源程序的各类信息和编译各阶段的进展情况。在编译器中,最重要的表格是符号表,用来登记源程序中出现的每个名字以及名字的各种属性。
    • 当扫描器识别出一个名字(标识符)后,它把该名字填入到符号表中。
  7. 出错处理
    • 一个编译程序不仅应能对书写正确的程序进行翻译,而且应能对出现在源程序中的错误进行处理。如果有错误,发现错误并把错误信息报告给用户。由出错处理程序完成。
    • 编译过程的每一个阶段都可能检测出错误,绝大多数错误可以在前三个阶段检测出来。源程序的错误通常分为语法错误和语义错误。语法错误是指源程序中不符合语法规则的错误,可在词法分析或语法分析时检测出来。例如,词法分析能够检测“非法字符”错误;语法分析能检测出“括号不匹配”、“缺少”之类的错误。语义错误是指源程序中不符合语义规则的错误,在语义分析阶段检测出来,有些运行时才能检测出来。例如:说明错误、作用域错误、类型不一致等等。

编译器从逻辑上可以分为若干阶段,每个阶段把源程序从一种表示换成另一种表示
一般而言,我们把前三个部分(1-3)成为编译器的前端。其工作只和源程序有关,与目标机无关。把后两个部分(4-5)称之为编译器的后端,与源程序无关。这样一来可以提高编译器的开发效率,提高软件重用性。降低耦合度。
取一个编译器的前端,重写它的后端以产生同一源语言在另一机器上的编译器。
不同的前端使用同一个后端,从而得到一个机器上的几个编译器(采用同一中间语言)。

遍的概念

遍的定义:对源程序或源程序的中间结果从头到尾扫描一次,并作出有关的加工处理,生成新的中间结果或目标程序。
每遍的工作由从外存上获得的前一遍的中间结果开始(第一遍是源程序),完成工作后将结果记录于外存(最后一遍是目标程序)。
差别
遍数多:结构清晰,但时间效率不高。
遍数少,编译速度快,但机器内存要求高。

遍的概念,对于理解编译器来说很重要。可以理解为遍既可以说是编译器工作的方式,也可以说是编译器效率的体现。以叠衣服为例(你怎么扛着品如的衣柜 ),我们可以取下一件衣服(好比编译器1-3),叠好(4),放入衣柜(5)。这样可以称之为一遍。也可以先把所有衣服取下(重复1-3),算是一遍;然后全部叠好(4),算是第二遍;然后放入衣柜,算是第三遍。
遍的定义并不是固定的,遍的确定主要因素是源程序和机器(目标机)的特征。

编译器技术的应用

  • 高级语言的实现
    高级编程语言易于编程,但程序运行较慢。 低级语言编程时可实施更有效的控制方式,得到更有效的代码,但难编写、易出错、难维护。流行编程语言的大多数演变都是朝着提高抽象级别的方向。 每一轮编程语言新特征的出现都刺激编译器优化的新研究。

  • 程序翻译

    • 二进制翻译
      编译器技术可用于把一种机器的二进制代码翻译成另一种机器的代码,以运行原先为别的指令集编译的代码。
    • 数据库查询解释器
      数据库查询由一些谓词组成,这些谓词由包含关系运算的布尔表达式组成,可以被解释执行,也可以被编译成搜索数据库的命令。
  • 提高软件开发效率的工具
    源于编译器中代码优化技术的程序分析一直在改进软件开发效率。

    • 类型检查:类型检查是一种捕捉程序中前后不一致的成熟而有效的技术。
    • 边界检查:数据流分析技术可用来定位缓冲区溢出。
    • 内存管理:自动的内存管理删除内存泄漏等内存管理错误。
  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值