【编译原理笔记】第一章 概论


程序设计语言与编译

编译的起源:程序设计语言

高级语言:比机器代码或汇编语言更接近于自然语言或数学语言的一种语言,包括很多编程语言,比如Fortran、Pascal、Java、C、C++、C#、python等等,是高度封装的编程语言。
特点:不依赖具体机器,移植性好、对用户要求低、 易使用、易维护等。
低级语言(Low level Language) :包括字位码、机器语言、汇编语言。
特点:与特定的机器有关,功效高,但使用复杂、繁琐、费时、易出错。
汇编语言:对机器语言的抽象,是一种用于电子计算机、微处理器、微控制器,或其他可编程器件的低级语言。 在不同的设备中,汇编语言对应着不同的机器语言指令集。 一种汇编语言专用于某种计算机系统结构,不像许多高级语言那样,可以在不同系统平台之间移植。
机器语言:用二进制代码表示的计算机能直接识别和执行的一种机器指指令系统令的集合。

编译程序的出现:用高级语言编制的程序,计算机不能立即执行, 必须通过一个“翻译程序”加工,转化为与其等价的机器语言程序,机器才能执行。将这种翻译程序称之为“编译程序”。
在计算机上执行一个高级语言程序统共分几步:
①把高级语言程序翻译成机器语言程序;
②运行所得的机器语言程序求得计算结果。


程序设计语言的转换

翻译:是指能把某种语言的源程序在不改变语义的条件下,转换成另一种语言程序——目标语言程序。它是指各种语言的翻译器,包括汇编程序编译程序, 是汇编程序、编译程序以及各种变换程序的总称。
源程序:用汇编语言高级语言编写的程序称为源程序。
目标程序:用目标语言所表示的程序。
目标语言:可以是介于源语言和机器语言之间的 “中间语言”,可以是某种机器的机器语言,也可以是某机器的汇编语言。
在这里插入图片描述
翻译过程的两种实现(实现机制不同,目的相似):

解释:接受某高级语言的一个语句输入,进行解释并控制计算机执行,马上得到这句的执行结果,然后再接受下一句。Basic语言敲一句解释一句。
过程:以源程序作为输入,不产生目标程序,一边解释一边执行。直观易懂,结构简单,易于实现人机对话,但效率偏低。
解释工作过程

编译:专指由高级语言转换为低级语言,把高级语言的程序整个翻译过来。C语言、Pascal语言一般是编译过程。
转换过程
两个阶段转换:编译——运行,编译直接产生机器语言
在这里插入图片描述
三个阶段转换:编译——汇编——执行,编译产生汇编语言程序,汇编语言经过汇编后才可拿去执行。
三个阶段
汇编程序:若源程序用汇编语言书写,经过翻译程序得到用机器语言表示的程序,这时的翻译程序就称之为汇编程序,这种翻译过程称为“汇编”(Assemble)。
编译程序:若源程序是用高级语言书写,经加工后得到目标程序, 这种翻译过程称“编译”(Compile)。
汇编程序与编译程序都是翻译程序,主要区别是加工对象的不同。由于汇编语言格式简单,常与机器语言之间有一一对应的关系,汇编程序所要做的翻译工作比编译程序简单得多。
编译-解释执行
编译程序的生成
直接用机器语言编写编译程序;
用汇编语言编写编译程序(编译程序核心部分常用汇编语言编写);
用高级语言编写编译程序(普遍采用)。

自编译(滚雪球)
编译工具:LEX(词法分析编辑器)、YACC(语法分析,自动产生LALR分析表)
移植:同种语言的编译程序在不同类型的机器之间移植。


PL/0 总体介绍(※实验)

参考:PL/0语言的语法描述

PL/0 编译程序总体结构

T-型图
在这里插入图片描述
PL/0编译程序的组织:一个以语法、语义分析程序为中心的单边编译程序。
PL/0语言的ENBF表示片段——确定构词规则——分支。
类型上下文约束与作用域规则——语义规则。
在这里插入图片描述

Pascal语言特点

语法清晰,语义直接。典型嵌套结构语言。允许嵌套的调用和定义,先声明后使用。
链接: 【转载】pascal语言入门

PL/0 程序样例

在这里插入图片描述
包括说明部分和过程部分:
-说明部分包括常量和变量定义(红框)和过程说明部分(蓝框)
-对于定义的主程序过程说明中仍可嵌套内层的局部过程(Q)
-过程部分为主程序入口,PL/0 程序执行从此开始(黄框)

var m,n,r,q;
{求最大公约数}
	procedure gcd;
	begin
		while r#0 do
			begin
				q:=m/n;
				r:=m-q*n;
				m:=n;
				n:=r;
			end;
	end;

begin
	read(m);
	read(n);
	if m<n then
	{为了方便规定m>=n}
		begin
			r:=m;
			m:=n;
			n:=r;
		end;
	begin
		r:=1;
		call gcd;
		write(m);
	end;
end.

类P-code虚拟机

PL/0编译器是非真实编译器,生成的目标代码不是真正的汇编(CPU指令),需要一个能看得懂指令的“CPU”,也就是类P-code虚拟机,也就是代码Interpreter函数部分。
在这里插入图片描述

(先写到这里,刚学,还没太看明白)


编译程序概述

类比自然语言的翻译。

编译程序的工作

习惯上是将编译过程划分为5个基本阶段:词法分析、语法分析、语义分析以及生成中间代码、代码优化、生成目标程序。
在这里插入图片描述

词法分析

分析扫描源程序(字符序列),根据语法的词法规则分析并识别单词,并以某种编码形式(转换成统一规格备用)输出。

单词:是语言的基本语法单位,具有实在意义。
一般语言有四大类单词:
	基本字:命令组成部分,语言定义的关键字或保留字(如BEGIN、END、IF)。
	标识符:用户自己定义的函数名、过程名、变量名和常量名。
	常数:整个程序运行中不变的部分。
	分界符:
			运算符:如+、-、*、/、;、(、) ……   
			界限符:分割开标识符、语句等,如分号和括号。

转换完成后格式:(类号、内码)
描述词法规则的有效工具:正规式(确定单词是否符合正规描述规范)和有限自动机(比较)。
转换规格在表的处理中描述。

语法分析

根据语法规则(即语言的文法,规定单词如何构成语法单位),把单词符号组合成各类的语法单位(短语、子句、语句、过程、程序),分析并识别出各种语法成分,如表达式、各种说明、各种语句、过程、函数等,并进行语法正确性检查
语法规则的表示:
BNF: A::=B|C (A定义为B或C)
在这里插入图片描述
语法分析方法:推导(derive)和规约(reduce)。最右推导,最左规约。也可以用语法树表示。
在这里插入图片描述

语义分析和中间代码的形成

对识别出的各种语法成分进行语义分析,并产生相应的中间代码。
中间代码:一种介于源语言和目标语言之间的中间语言形式,用于识别出语法范畴(短语、子句、语句、过程、程序)。
生成中间代码的目的: 便于做优化处理;便于编译程序的移植。
分为两个阶段工作
①静态语义检查:由语法分析识别出为赋值语句,语义分析首先要分析语义上的正确性,例如要检查表达式中和赋值号两边的类型是否一致。
②中间代码的翻译:根据赋值语句的语义,生成中间代码。即用一种语言形式来代替另一种语言形式,这是翻译的关键步骤。(翻译的实质:语义的等价性)
中间代码的形式:编译程序设计者可以自己设计,常用的有四元式、三元式、逆波兰表示等。
四元式(三地址指令)
在这里插入图片描述

代码优化程序

提高目标程序的质量。主要考虑公共子表达式的提取、合并已知量、删除无用语句、循环优化等。
原则:等价变换。
在这里插入图片描述

生成目标程序

由中间代码生成目标程序(地址指令序列)。
在这里插入图片描述

目标代码的形式:
-绝对指令代码:可以立即执行的目标代码。
-汇编指令代码:汇编语言程序,需要通过汇编程序汇编后才可运行。
-可重定位指令代码:先将各目标模块连接起来,确定变量、常数在主存中的位置,装入贮存后才能成为可以运行的绝对指令代码。

不同机器对应不同的绝对指令代码。

表格与表格管理

表格作用:用来记录源程序的各种信息以及编译过程的各种状况。及时地把源程序中的信息和编译过程中所产生的信息登记在表格中,在随后的编译过程中同时查找这些表格的信息。
与编译前三阶段有关的表格有:符号表、常数表、标号表、分程序入口表、中间代码表。

符号表管理
符号表:登记源程序中的常量名、变量名、数组名、过程名等,记录它们的性质、定义和引用情况。
常数表:每种类型的常数为一张表,登记各类常量值。
标号表:登记标号的定义与运用。
入口名表:登记过程的层号,分程序符号表入口等。
中间代码表:生成中间代码生成的表(例子中的四元式)。

出错处理

诊断出源程序错误,并报告用户错误的性质和位置,以便用户修改源程序。有专门的出错处理程序来完成。
错误类型
语法错误:在词法分析和语法分析阶段检测出来。
语义错误:一般在语义分析阶段检测。
逻辑错误:编译程序无法检测出来,编译当中不处理。比如死循环(循环条件永远为真或循环范围无限大)。


编译过程

遍(PASS)

对源程序(包括源程序中间形式)从头到尾扫描一次, 并做有关的加工处理 ,生成新的源程序中间形式或目标程序, 通常称之为一遍。
在这里插入图片描述
遍与基本阶段的区别

五个基本阶段:将源程序翻译为目标程序在逻辑上要完成的工作。 
遍:是指完成上述5个基本阶段的工作要经过几次扫描处理。

多变扫描可以节省内存空间,提高目标代码质量,使编译的逻辑结构更加清晰;但是编译时间较长。在内存许可的情况下尽量用更少的遍数。
一遍扫描即可完成整个编译工作的称为一遍扫描编译程序。单边扫描词法语法混合执行,逻辑上不是很清晰。
在这里插入图片描述


编译程序构造

要素:源语言、目标语言、编译方法。(类比外语的翻译)

前端和后端

根据编译程序各部分功能,将编译程序分成前端和后端。
在这里插入图片描述
分开原因:在多种源语言和目标语言的开发过程中,灵活搭配,消除工作量,提高开发效率。

中间表示的重要性

在这里插入图片描述

编译程序的前后处理器

源程序:多文件、宏定义和宏调用,包含文件。
目标程序:一般为汇编程序或可重定位的机器代码。
在这里插入图片描述


编译技术应用

语法制导的结构化编辑器
程序格式化工具
软件测试工具
程序理解工具
高级语言的翻译工具

猜你喜欢

转载自blog.csdn.net/qq_45973306/article/details/123152607