编译原理第5章编译概述

编译原理第5章编译概述

不同语言的翻译

翻译:将一种语言编写的程序转换成完全等效的另一种语言编写的程序的过程称为翻译(translate);在计算机中,翻译由一个程序来实现,称为翻译程序(translator);

编译程序: 高级语言->低级语言
汇编程序: 汇编语言->机器语言

宿主语言:编写编译程序的语言称为宿主语言;源语言、目标语言、宿主语言通常是不同的语言;

宿主机:运行翻译程序的机器

自驻留: 编译程序能生成可供其宿主机执行的机器代码

自编译: 编译程序是用源语言写的

两种运行方式

编译执行

解释执行

解释:不将源程序翻译成目标程序,而是一边分析,一边执行,这种翻译方法称为解释。
实现解释的程序,称为解释程序。

编译步骤

  1. 词法分析: 输入字符串,根据词法规则识别出单词符号。

  2. 语法分析: 根据语法规则,将单词符号构成各类语法单位,并进行语法检查。

  3. 语义分析: 根据语义规则,进行初步编译。

  4. 优化:对中间代码进行等价变换,以使代码更有效。

  5. 目标代码生成:生成机器语言程序或汇编语言程序。

说明:
(1)实用的编译程序不一定总是分成5个阶段
(2)目标程序不一定能立即执行,可能还要经过连接、装入等阶段
(3)编译的各阶段均需要和符号表管理程序、出错处理程序打交道

词法分析

任务:输入源程序,对字符串扫描分解、识别出单词(或单词符号、或简称符号)。
单词是高级语言中有实在意义的最小语法单位,一般分为5类:保留字(begin、end、if、for、while等)、标识符、常数、运算符和分界符(标点符号、括号、注释符号等

依循原则:语言的词法规则 (或构词规则)

描述工具:正规式和有限自动机

语法分析

任务:在词法分析的基础上,根据语言的语法规则,从单词符号串中识别出各类语法单元(如:表达式、语句、程序段、程序等)并进行语法检查,即检查各种语法单位在语法结构上的正确性。通过语法分析,确定整个输入串是否构成语法上正确的“程序”。

依循原则:语言的语法规则

描述方法:上下文无关文法

识别标识符,因为标识符的结构是字母打头的字母和数字串,这只要顺序扫描输入流,遇到既不是字母又不是数字字符时,将前面所发现的所有字母和数字组合在一起而构成单词标识符

不能用于识别递归定义的语法成分,比如就无法仅用线性扫描去匹配表达式中的括号

语法分析所依据的是语言的语法规则,语言的语法规则通常是由递归规则来定义
如表达式和赋值语句可由下述递归规则来定义:
(1) 任何标识符是表达式;
(2) 任何常数是表达式;
(3) 若表达式1和表达式2都是表达式,则表达式1+表达式2,表达式1*表达式2都是表达式;
(4) 赋值语句就可以用规则:标识符 = 表达式;来定义。

语义分析与中间代码产生

任务:对语法分析所识别的各类语法范畴,分析其含义,并进行初步翻译(产生中间代码)。

依循原则:语言的语义规则

描述方法:属性文法

从这个阶段起,翻译工作开始

中间代码:一种含义明确,便于处理的记号系统,通常独立于具体的硬件,或者与现代计算机的指令形式接近或者容易变换成现代计算机的机器指令。

优化

任务:对中间代码加工变换,以期产生更为高效(时间、空间)的目标代码,公共子表达式的提取、循环优化、删除无用代码等。

依循原则:程序的等价变换规则。

目标代码生成

任务:把中间代码(或优化后)变换成特定机器上的低级语言代码。

非常复杂:最后的翻译,有赖于硬件系统结构和机器指令含义,涉及到硬件功能部件的运用,机器指令的选择,各种类型变量的空间分配,以及寄存器和后援寄存器的调度等。如何产生出足以发挥硬件效率的目标代码是一件非常不容易的事情。

某些情况下,为加速编译速度,某些阶段可省,某些阶段也可合并,但多数实用编译程序的工作过程大致都像这五个阶段。

表格与表格管理

出错处理

出错处理程序:发现源程序中的错误,把有关错误信息报告给用户

最大限度发现各种错误,准确指出其性质及地点,并将其影响限制在尽可能小的范围,使源程序其它部分能继续被编译,以进一步发现其它可能的错误。

发布了81 篇原创文章 · 获赞 27 · 访问量 1万+

猜你喜欢

转载自blog.csdn.net/qq_43309286/article/details/104793670