编译原理 第一章
编译程序在计算机系统中的所在层
2、高级语言程序的处理过程
⑴ ⑵ ⑶ ⑷ 预处理:将源程序汇集在一起,如文件合并,宏展开等任务。 编译生成目标程序 汇编程序翻译成机器代码 装配/连接库程序生成可运行代码
3、编译程序技术的发展
推动编译技术发展的因素 语言范型(计算模式) 计算机体系结构 编译实现方式的发展 -手工 机器语言 汇编 系统程序设计语言 -自动构造工具lex yacc gcc
编译过程的6 编译过程的6个阶段:
1、 词法分析 是从左到右逐个读取源程序字符进行扫描和分解, 是从左到右逐个读取源程序字符进行扫描和分解,从而识别成一个个 单词。 单词。 2、 语法分析 是编译过程的第二个阶段。 是编译过程的第二个阶段。在词法分析的基础上将当单词序列分解成 各类语法短语(语法单位) 其本质上是对源程序进行结构分析, 各类语法短语(语法单位)。其本质上是对源程序进行结构分析,确定 输入串是否构成一个语法上正确的程序。 输入串是否构成一个语法上正确的程序。 应用语法树表示语法单位。 应用语法树表示语法单位。 语法分析的依据是语言的语法规则,即描述程序结构的规则。程序 语法分析的依据是语言的语法规则,即描述程序结构的规则。程序 结构通常是由递归规则表示的。例如表达式、语句的定义。 结构通常是由递归规则表示的。例如表达式、语句的定义。
低级语言程序 (目标程序)
来自计算机百科全书的定义
软件:计算机系统中的程序及其文档。 系统软件:居于计算机系统中最靠近硬件的一层,其他软件一般都 通过系统软件发挥作用。他和具体的应用领域无关,如编译系 统和操作系统等。 语言处理系统:把软件语言书写的各种程序处理成可在计算机上执 行的程序。 软件语言:用于书写软件的语言。它主要包括需求定义语言,功能 性语言,设计性语言,程序设计语言以及文档语言。
课程要求
学生要求: 学生要求:
程序设计语言(基本概念、语法规则、主要机制及语义)及 其编程能力 数据结构
课程学习要求: 课程学习要求:
编译程序的技术和方法需要从理论和实践两个环节学习和掌 握,对理论学习部分要做一些笔头练习,也要掌握应用这些理论的 工具的使用。课程提供的PL/0编译程序一定要理解透彻。 工具的使用。课程提供的PL/0编译程序一定要理解透彻。 ① 首先花功夫将PL/0编译程序读懂,最好用一些例子运行它。 首先花功夫将PL/0编译程序读懂,最好用一些例子运行它。 ② FA、LL(1)和LR部分多做一些练习题。 FA、LL( LR部分多做一些练习题。 ③ 使用Lex(或Flex),Yacc(或Bison)做一些小型编译器, 使用Lex( Flex),Yacc( Bison) 最好支,循环和函数调用等语句时,四元式的生成 通常要比上述例子复杂些。比如源程序: if ( a <= b) a = a – c; c = b * c; 翻译成的四元式: t1 = a > b if t1 goto L t2 = a – c a = t2 L : t3 = b * c c = t3
例如上述的中间代码生成如下的汇编代码: 例如上述的中间代码生成如下的汇编代码
MOV MUL MOV ADD MOV
id3, #10.0, id2, R1, R1,
R2 R2 R1 R2 id1
1.2.2 编译程序结构
编译过程的6 编译过程的6个阶段的任 务,可以分别由6 务,可以分别由6个模块完 成,即词法分析程序、语法 分析程序、语义分析程序、 中间代码生成程序、优化代 码生成程序。另外还包括表 格管理程序和出错处理程序, 他们与6 他们与6个阶段都有联系。 编译过程中源程序的各 种信息被保留在种种不同的 表格里,编译的各个阶段都 涉及到相关表格的构造、查 找或更新。
1.3 编译程序和一些软件工具
1.3.1 解释程序
1、编译和运行是两个独立分开的阶段,不太适合交互环境。 2、在交互环境下,可由解释程序来实现边翻译边执行。 解释程序接受某个语言的源程序并立即运行。 解释程序接受某个语言的源程序并立即运行。其工作模式是一个个 的获取、分析并执行源程序语句,一旦第一个语句分析结束, 的获取、分析并执行源程序语句,一旦第一个语句分析结束,源程序 开始运行。 开始运行。 例如:BASIC语言解释程序、LISP语言解释程序、UNIX命令语言( 例如:BASIC语言解释程序、LISP语言解释程序、UNIX命令语言(shel l)解释程序、数据库查询语言SQL解释程序、Java 语言BYTECODE 解释 解释程序、数据库查询语言SQL 解释程序、Java语言BYTECODE解释 程序等。 程序等。 3、 编译和解释程序的工作模式与存储组织
5、代码优化 是对前阶段产生的中间代码进行变换或进行改造, 是对前阶段产生的中间代码进行变换或进行改造,目的是使生成的目标 代码更为高效,省时间和省空间。 代码更为高效,省时间和省空间。 采用公共表达式的删除、强度削弱、循环优化等方法进行优化。 采用公共表达式的删除、强度削弱、循环优化等方法进行优化。 上述中间代码生成的实例可优化为: (*,id3,10.0,t1) id3 10. (+,id2,t1,id1) id2 id1 6、目标代码生成 其任务是把中间代码变换成特定机器上的绝对指令代码或可重定位的指 其任务是把中间代码变换成特定机器上的绝对指令代码或可重定位的指 令代码或汇编指令代码。这是编译的最后阶段, 令代码或汇编指令代码。这是编译的最后阶段,它的工作与硬件系统结 构和指令含义有关,涉及到硬件系统的功能部件的应用、 构和指令含义有关,涉及到硬件系统的功能部件的应用、机器指令的选 择和各种数据类型变量的存储空间分配以及寄存器和后援存储器的调度 等。
交叉编译
编译程序在一个机器(宿主机)上运行,产生另一个机器(目标机)的汇 编语言。嵌入式系统中的应用程序正是借助这样的编译程序生成。
并行编译技术
高级语言之间转换工具
编译技术在其它软件中的应用
1.2 编译过程和编译程序的结构
1.2.1 编译过程概述
一个编译程序整个过程是划 分阶段进行的,每个阶段将源程 序的一种表示形式转换成另一种 表示形式,各个阶段进行的操作 在逻辑上是紧密连接在一起的。 源程序 词法分析 语法分析 语义分析 中间代码生成 代码优化 目标程序
1.1 什么是编译程序
1、编译程序的定义和功能
编译程序就是一个语言翻译程序,把一种语言(源语言) 编译程序 书写的程序翻译成另一种语言(目标语言)的等价程序。 源语言通常是一个高级语言,如FORTRAN,C 或Pascal。 目标语言通常是一个低级语言,如汇编或机器语言。
高级语言程序 (源程序)
编译程序
编 译 原 理
(第2版)
张素琴、吕映芝等编著 清华大学出版社出版
课程目标
清楚地理解编译程序是如何工作的。 清楚地理解编译程序是如何工作的。 基本掌握程序设计语言的主要特性和实现途径。 基本掌握程序设计语言的主要特性和实现途径。 学习使用编译构造工具如Lex Yacc。 学习使用编译构造工具如Lex、Yacc。 Lex、 学习应用一些标准的分析算法和技术解决相关软件的问题。 学习应用一些标准的分析算法和技术解决相关软件的问题。
1.2.3 编译阶段的组合
1、前端:这些阶段的工作主要依赖于源语言,而与及 前端:这些阶段的工作主要依赖于源语言,而与及 其目标机器无关,如词法、语法、语义分析和中间 代码和代码优化阶段。 后端:代码生成阶段依赖于目标机。 2、后端:代码生成阶段依赖于目标机。 3、编译程序前端加上相应不同的后端则可以为不同的 机器构成同一个源语言的编译程序。 4、不同语言编译的前端生成同一种中间语言,再使用 一个共同的后端,则可为同一机器生成不同语言的 编译程序。
第1章 引 论
【学习目标】 学习目标】
◇ 明确编译程序的功能及其在计算机系统中的作用。 ◇ 了解源语言程序被编译为目标程序的整个过程,这个过程一 般划分为哪些阶段。 ◇ 知道编译技术可用于哪类软件的设计和开发。
【本章重点】 本章重点】
◇ ◇ ◇ ◇ 编译程序的概念、功能 编译6个过程 编译6 编译程序结构 解释程序的概念、特点
图1.4 语句id1:=id2+id3*10的语法树
图1.5 语句id1:=id2+id3*10的语法树的另一种形式
3、语义分析 其任务是审查源程序有无语义错误,为代码生成阶段收集类型信息。 其任务是审查源程序有无语义错误,为代码生成阶段收集类型信息。 源程序中有些语法成分,按照语法规则去判断,它是正确的, 源程序中有些语法成分,按照语法规则去判断,它是正确的,但它 不符合语义规则。 不符合语义规则。比如使用了没有声明的变量;或者给一个过程名赋 值;或者调用函数时参数类型不合适或者参加运算的两个变量类型不 匹配等等。 匹配等等。比如下边的程序片段: Int arr[2],c; arr[2],c; c = arr1 * 10 ; arr1 其中的赋值语句是符合语法规则的,但是因为没有声明变量arr1 其中的赋值语句是符合语法规则的,但是因为没有声明变量arr1,而 存在语义错。 存在语义错。
源程序 初始数据 图 解释程序的工作模式
解释程序
计算结果
编译和解释程序存储组织图
源程序缓冲区 名字表 目标代码缓冲区 编译用源程序中间表示 各种表格
目标代码区 数据区
(A)编译阶段存储区内容 解释系统 源程序
(B)运行阶段存储区内容
工作单元名字表 标号表 缓冲区(输入输出) 栈区 (C)解释程序的存储区内容
图1.6 插入语义处理结点的树
语义分析主要的任务
完成静态语义审查和处理 上下文相关性审查 类型匹配审查 类型转换
4、 中间代码生成 在进行了语法和语义分析阶段工作之后, 在进行了语法和语义分析阶段工作之后,便将源程序变成一种内部表示 形式,这种内部表示形式叫做中间语言或中间代码。它是一种结构简单、 形式,这种内部表示形式叫做中间语言或中间代码。它是一种结构简单、 含义明确的记号系统。 含义明确的记号系统。 记号系统的设计原则:容易生成和将它翻译成目标代码。 记号系统的设计原则:容易生成和将它翻译成目标代码。很多编译程序 采用的三指令四元式中间代码: 采用的三指令四元式中间代码: (运算符,运算对象1,运算对象2,结果) 运算符,运算对象1 运算对象2 结果) 例如源程序,sum=first+count*10 例如源程序,sum=first+count*10 生成的四元式如下: (inttoreal,10,-,t1) inttoreal,10, (* ,id3,t1,t2) id3 (+ ,id2,t2,t3) id2 (:= ,t3,-,id1) id1