编译原理(第四版)第1章 绪论

合集下载

编译原理复习材料

编译原理复习材料
a+b=5 a=7 x=5 y=3 b=3 z=7
(4) 所谓传名是在进入调用段之前不对实在参数预先进行计值,而 是过程中每当使用到相应的形参时才对它实行计值。因序),每当过程体中使用到相应 形参时就调用这个子程序。 因此,过程体执行y:=y+1;语句,实现时处理成为: a=a+1; 过程体执行z:=z+x;语句,实现时处理成为: a=a+(a+b); 执行上述两语句后,a的值是 9。因此,程序执行后输出 a的值是 9。 综上所述程序执行时a的输出: (1)传值:2 (2)传地址:8 (3)得结果:7 (4)传名:9 5、几个基本概念 考虑一个有穷字母表∑字符集,其中每一个元素称为一个符号,∑上的
程序是由函数或过程构成的,程序的任务是通过函数或过程之间的 协作(相互调用)l来完成的,函数或过程的调用有以下4种方式:传地 址(call-by-reference)、得结果(call by result)、传值(call-byvalue)和传名(call by name)。 定义函数Swap,其中M、N是形式参数,简称形参。 Void Swap(int M,int N) { int t; t=N; N=M; M=t; } 函数调用: Swap(I,J);其中I和J是实在参数,简称实参。下面我们以下面的 程序为例分别讨论4种参数传递的方式。
(2)这种类型的数据对象可以具有的值; (3)可以作用于这种类型的数据对象的操作。 一个程序语言必须提供一定的初等数据类型,包括这些数据类型上能 进行的运算的定义。不同的语言含有不同的初等数据成分。常见的初等 数据类型有: (1)数值类型:整型、实型、复数、双精度, 运算:+,-,*,/等 (2)逻辑类型:布尔运算:∨,∧,┑ (3)字符类型:符号处理 (4)指针类型:指针式把内存地址作为其值的数据类型,通过指针可 以操作内存空间。 程序语言中的各种名字都是用标识符表示的。标识符是指由字母、 下划线和数字组成的,以字母或下划线为开头的一个字符串。名字和标 识符在形式上难于区别,标识符是一个没有意义的的字符序列,而名字 则有明确的意义和属性。用计算机术语来说,每个名字可看成是代表一 个抽象的存储单元,这个单元可含有一位、一字节或相继的多个字节。 该单元的内容则被认为是名字的值。仅把名字看成代表一定的存储单元 还是不够的,我们还必须同时指出它的属性(数据类型)。只有指定了 属性的存储单元,其值才是可以理解的。 一个名字的属性包括类型和作用域。名字的类型决定了它能具有什 么样的值, 值在计算机内部的表示方式,以及对它能施加什么运算。 名字的作用域规定了它的值的存在范围。 除了初等数据类型外,有些语言还提供了由初等数据构造复杂数据 的手段。常见的复杂数据类型有: (1)数组。一个数组是由同一类型数据所组成的某种n维矩形结 构。数组在内存中占有一块连续的空间,系统采用基地址加偏移量的方 式来访问数组元素。 (2)记录。从逻辑上讲,记录是由已知的数据组合起来的一种结 构。一个记录通常含有若干个分量,每个分量称为记录的一个栏(或域 field)。每个分量都是一个确定类型的数据,不同的分量的数据类型可 以不同。 (3)字符串、表格、栈和队列。 (4)抽象数据类型。抽象数据类型封装了数据和操作,在面向对象 程序设计语言中,Ada通过程序包(package)提供了数据封装的支持, Smalltalk、C++和Java语言则通过类(class)对抽象数据类型提供支 持。 4、函数调用的方式

编译原理第1章绪论

编译原理第1章绪论

第1部分 绪论
第1部分 绪论
4.优化 . 优化的任务是对前阶段产生的中间代码进 行等价变换或改造,以期获得更为高效( 行等价变换或改造,以期获得更为高效(节省 时间和空间)的目标代码。 时间和空间)的目标代码。 常用的优化措施有删除冗余运算、 常用的优化措施有删除冗余运算、删除无 用赋值、合并已知量、循环优化等。 用赋值、合并已知量、循环优化等。 例如, 例如,其值并不随循环而发生变化的运算 可提到进入循环前计算一次, 可提到进入循环前计算一次,而不必在循环中 每次循环都进行计算。 每次循环都进行计算。 优化所遵循的原则是程序的等价变换规则。 优化所遵循的原则是程序的等价变换规则。
第1部分 绪论
如果编译生成的目标程序是汇编语言形式, 如果编译生成的目标程序是汇编语言形式,那么在 编译与运行阶段之间还要添加一个汇编阶段, 编译与运行阶段之间还要添加一个汇编阶段,它将编 译生成的汇编语言目标程序再经过汇编程序变换成机 器语言目标程序,如图1–3所示。 所示。 器语言目标程序,如图 所示
第1部分 绪论
汇编语言代码程序
MAIN: CLR P1.0 MOV TMOD , #00H MOV TH0 , #0DDH MOV TL0 , #18H SETB TR0 LOOP: JNB TF0 , $ CLR TF0 SETB P1.0 CLR P1.0 MOV TH0 , #0DDH ;重装载TH0和TL0 重装载TH0和 ;产生2µs正脉冲 产生2µs正脉冲 ;启动T0工作 启动T0工作 ;$为当前指令指针地址 ;设定T0的工作方式 设定 的工作方式 ;给定时器T0送初值 给定时器 送初值
return (id,指向 的符号表入口指针 的符号表入口指针); ,指向id的符号表入口指针

编译原理--第一章.讲义

编译原理--第一章.讲义

2018/11/14
2
编译原理
第一章 引论
2.编译理论与其他课程关系
操作系统
控制对象
数据结构
编译理论
基础
素材
离散数学
自动机和形式语言
2018/11/14 3
编译原理
第一章 引论
3.编译理论的应用
编译理论 的许多想法和技术可用于一般软件的设计:
文本编辑程序 有穷状态技术 上下文无关文法 语法制导翻译 代码优化技术
2018/11/14
目标程序代码
6
编译原理
第一章 引论
6.翻这种变换程序称为翻译程序
高级语言源程序
编译为
面向机器代码
这种变换程序称为编译程序 编译程序 有一些限制 (针对输入、输出)
2018/11/14 7
编译原理
第一章 引论
1.编译过程的组成 源程序
编译原理
第一章 引论
5.代码优化
任务
对于代码(主要是中间代码)进行加工变换, 以期能够产生更为高效(省时间和空间)的 目标代码 。
所做转换
中间代码
中间代码(优化后)
依据
程序等价变换规则
2018/11/14
主要理论基础
数据流方程
15
编译原理
第一章 引论
5.代码优化
示例
(1) M := I (2) N := J (3) K := 1 (4) if 100<K goto (9) (5) (6) (7) (8) (9)
源程序
词法分析 语法分析
单词符号 语法单位 中间代码
编译过程
中间代码生成 代码优化
中间代码(优化后)
目标代码

编译原理(第四版)第1章 绪论

编译原理(第四版)第1章 绪论

2.语法分析
语法分析的任务是在词法分析的基础上,根据语言的语法 规则(文法规则)把单词符号流分解成各类语法单位(语法范畴), 如“短语”、“子句”、“句子(语句)”、“程序段”和“程 序”。通过语法分析可以确定整个输入串是否构成一个语法上 正确的“程序”。语法分析所遵循的是语言的语法规则,语法 规则通常用上下文无关文法描述。
5.目标代码生成
这一阶段的任务是把中间代码(或经优化处理之后)变换成特 定机器上的机器语言程序或汇编语言程序,实现最终的翻译工作。 最后阶段的工作因为目标语言的关系而十分依赖硬件系统,即如 何充分利用机器现有的寄存器,合理地选择指令,生成尽可能短 且有效的目标代码,这些都与目标机器的硬件结构有关。
(6)现代编译技术已转向并行编译的研究。
1.3 编译程序的工作过程与结构
1.词法分析
词法分析的任务是输入源程序,对构成源程序的字符串 进行扫描和分解,识别出一个个单词符号,如基本字(if、for、 begin等)、标识符、常数、运算符和界符(如“(”、“)”、“=”、 “;”)等,将所识别出的单词用统一长度的标准形式(也称内 部码)来表示,以便于后继语法工作的进行。因此,词法分析 工作是将源程序中的字符串变换成单词符号流的过程,词法 分析所遵循的是语言的构词规则。
出错处理与编译的各个阶段都有联系,与前三个阶段的联 系尤为密切。出错处理程序应在发现错误后,将错误的有关信 息如错误类型、出错地点等向用户报告。此外,为了尽可能多 地发现错误,应在发现错误后还能继续编译下去,以便发现更 多的错误。
1.4 编译程序的开发
编译程序的开发常常采用自编译、交叉编译、自展和移植等 技术实现。
第1章 绪论
1.1 程序设计语言和编译程序 1.2 编译程序的历史及发展 1.3 编译程序的工作过程与结构 1.4 编译程序的开发 1.5 构造编译程序所应掌握的内容 习题一

编译原理第一章 编译引论

编译原理第一章 编译引论
静态存储分配
动态存储分配
1> 静态存储分配
若在编译时能完全确定程序所需空间大小,并能确定每个数 据项的地址,就可在编译时分配所需空间,这种分配方法称为静态 存储分配.
内情向量表组织如下:
L1
u1
d1
L2
u2
d2
Ln
un
dn
a
c
n
elemlength
17
整理课件
3)结构类型------- 记录
是由多种类型的数据组合起来的一种数据结构。Pascal 语 言中,可如下定义一种记录类型
type < 记录类型名> = record <域名 1>:<类型1>; <域名 2>:<类型2>;
26
整理课件
1>传值 调用程序把实际参数的值传递到形式参数的空间中.
a1 1 b1 1 a2 4 b2 5
x1 1 y1 1 x2 4 y2 5
主程序空间
子程序空间
这种方式,子程序一般不改变实际参数的值.
27
整理课件
2>传地址 调用程序把实际参数的地址传递到形式参数的空间中.
a1 1 b1 1 a2 4 b2 5
type <类型名> = set of <基类型>; <类型名> = array of <基类型>; <类型名> = record
end;
21
整理课件
2> 变量说明段 var <变量名表<类型2>;
<变量名表n>:<类型n>; 3> 函数及过程定义
function <函数名> (参数说明):<函数类型>; <函数体>; procedure <过程名> (参数说明) ; <过程体>; 4> 赋值句

《编译原理教程》习题解析与上机指导(第四版) 胡元义章 (12)

《编译原理教程》习题解析与上机指导(第四版) 胡元义章 (12)

第一章 绪论
1.2 计算机执行用高级语言编写的程序有哪些途径?它 们之间的主要区别是什么?
【解答】 计算机执行用高级语言编写的程序主要有两种 途径:解释和编译。
在解释方式下,翻译程序事先并不采用将高级语言程序全 部翻译成机器代码程序,然后执行这个机器代码程序的方法, 而是每读入一条源程序的语句,就将其解释(翻译)成对应其功 能的机器代码语句串并执行,然后再读入下一条源程序语句并 解释执行,而所翻译的机器代码语句串在该语句执行后并不保 留。这种方法是按源程序中语句的动态执行顺序逐句解释(翻 译)执行的,如果一语句处于一循环体中,则每次循环执行到 该语句时,都要将其翻译成机器代码后再执行。
特性是无法改变的
第一章 绪论
(2) 将编译过程分成若干“遍”是为了

A.提高编译程序的执行效率
B.使编译程序的结构更加清晰
C.利用有限的机器内存并提高机器的执行效率
D.利用有限的机器内存但降低了机器的执行效率
(3) 构造编译程序应掌握

A.源程序
B.目标语言
C.编译方法

D.A~C项
第一章 绪论
(4) 编译程序绝大多数时间花在
第一章 绪论 图1-1 编译程序总框图
第一章 绪论 感谢
第一章 绪论
谢谢,精品课件 资料搜集
第一章 绪论
感谢
第一章 绪论
谢谢,精品课件
资料搜集
第一章 绪论
在编译方式下,高级语言程序的执行是分两步进行的: 第一步首先将高级语言程序全部翻译成机器代码程序,第二步 才是执行这个机器代码程序。因此,编译对源程序的处理是先 翻译,后执行。
从执行速度上看,编译型的高级语言比解释型的高级语言 要快,但解释方式下的人机界面比编译型好,便于程序调试。

编译原理复习

编译原理复习

编译原理复习《编译原理》第⼀章:绪论1.翻译器:把⼀种语⾔变换到另外⼀种语⾔的软件。

这两种语⾔分别称为源语⾔和⽬标语⾔。

2.编译器:⼀种翻译器,它的⽬标语⾔⽐源语⾔低级。

3.典型的编译器可以划分成6个逻辑阶段:词法分析,语法分析,语义分析,中间代码⽣成,代码优化,代码⽣成。

4.按照对⽬标机器的依赖性,把编译过程分成前端(依赖于源语⾔,独⽴于⽬标机器)和后端(依赖于⽬标机器,独⽴于源语⾔,只与中间语⾔有关(从中间代码⽣成⽬标代码))。

5.前端包括:词法分析,语法分析,语义分析,中间代码⽣成。

6.后端包括:代码优化,代码⽣成。

7.解释器:不同于编译器的另⼀类语⾔处理器,直接执⾏源程序所指定的运算。

解释器的执⾏效率⽐编译器低,因为解释器⽆法解开循环。

8.遍:编译的⼏个阶段常⽤⼀遍(pass)扫描实现,⼀遍扫描包括读⼀个输⼊⽂件和写⼀个输出⽂件。

《编译原理》第⼆章:词法分析⼀些概念:1.词法单元:⼜称单词,是编程语⾔中合法的字符串。

2.词法记号:满⾜某种规则的词法单元,采⽤同⼀种记法——词法记号。

该规则称为模式。

3.模式:描述词法单元与词法记号对应关系的规则。

是描述源程序中某个记号的词法单元集合的规则。

4.字母表:符号的有限集合,例:∑={0,1}串:符号的有穷序列,例:0110,ε语⾔:字母表上的⼀个串集{ε,0,00,000,…},{ε},?正规式(运算符的优先级:*>连接运算>|)N F A是这样⼀个数学模型,包括1)状态集合S2)输⼊字母表∑3)转换函数m o v e:S?(∑?{ε})→P(S)4)唯⼀的初态s∈S5)终态集合F?SD F A是这样⼀个数学模型,包括1)状态集合S2)输⼊字母表∑3)转换函数m o v e:S?∑→S4)唯⼀的初态s∈S5)终态集合F?S第三章语法分析3.1 上下⽂⽆关⽂法上下⽂⽆关⽂法是四元组(V T , V N, S , P )1) V T: 终结符集合(⾮空有限集合,记号名是其同义词)2) V N: ⾮终结符集合(⾮空有限集合)3) S : 开始符号4) P : 产⽣式集合,产⽣式形式 : A →α上下⽂⽆关⽂法没有强制的顺序关系。

编译原理练习题及答案

编译原理练习题及答案

第一章练习题(绪论)一、选择题1.编译程序是一种常用的软件。

A) 应用B) 系统C) 实时系统D) 分布式系统2.编译程序生成的目标代码程序是可执行程序。

A) 一定B) 不一定3.编译程序的大多数时间是花在上。

A) 词法分析B) 语法分析C) 出错处理D) 表格管理4.将编译程序分成若干“遍”将。

A)提高编译程序的执行效率;B)使编译程序的结构更加清晰,提高目标程序质量;C)充分利用内存空间,提高机器的执行效率。

5.编译程序各个阶段都涉及到的工作有。

A) 词法分析B) 语法分析C) 语义分析D) 表格管理6.词法分析的主要功能是。

A) 识别字符串B) 识别语句C) 识别单词D) 识别标识符7.若某程序设计语言允许标识符先使用后说明,则其编译程序就必须。

A) 多遍扫描B) 一遍扫描8.编译方式与解释方式的根本区别在于。

A) 执行速度的快慢B) 是否生成目标代码C) 是否语义分析9.多遍编译与一遍编译的主要区别在于。

A)多遍编译是编译的五大部分重复多遍执行,而一遍编译是五大部分只执行一遍;B)一遍编译是对源程序分析一遍就立即执行,而多遍编译是对源程序重复多遍分析再执行;C)多遍编译要生成目标代码才执行,而一遍编译不生成目标代码直接分析执行;D)多遍编译是五大部分依次独立完成,一遍编译是五大部分交叉调用执行完成。

10.编译程序分成“前端”和“后端”的好处是A)便于移植B)便于功能的扩充C)便于减少工作量D)以上均正确第二章练习题(文法与语言)一、选择题1.文法 G 产生的 (1) 的全体是该文法描述的语言。

A.句型B. 终结符集C. 非终结符集D. 句子2.若文法 G 定义的语言是无限集,则文法必然是 (2) A递归的 B 上下文无关的 C 二义性的 D 无二义性的3. Chomsky 定义的四种形式语言文法中, 0 型文法又称为(A)文法;1 型文法又称为(C)文法;2 型语言可由(G) 识别。

A 短语结构文法B 上下文无关文法C 上下文有关文法D 正规文法E 图灵机F 有限自动机G 下推自动机4.一个文法所描述的语言是(A);描述一个语言的文法是(B)。

编译原理(第一章引论)

编译原理(第一章引论)

• 1.1程序设计语言与编译 • 2)程序设计语言的转换(续) • 编译的转换过程
– 两阶段转换:编译----运行 – 三个阶段的转换:编译----汇编----运行
1.1程序设计语言与编译 • 2)程序设计语言的转换(续)翻译 • 编译 • 解释
– 以源程序作为输入,不产生目标程序,一边解 释一边执行。 – 优点:直观易懂,结构简单,易于实现人机对 话 – 缺点:效率低
学习任务
• 1、掌握编译的理论基础和形式化系统 • 2、了解编辑的全过程以及具体实现方法
学习方法
• 1、认真听课,认真理解书中的基本概念、 基本原理与基本算法 • 2、弄懂书中的例题与习题 • 3、在看书时或理解立体时,一定要划出相 应的细节变化过程,通过画图来加深理解 • 4、在理解的基础上记忆 • 5、理论与实践结合
• 1.2编译程序概述 • 编译程序的工作 • 先看自然语言的翻译
– 1、识别出句子中的一个个单词 – 2、分析句子的语法结构 – 3、根据句子的含义进行初步翻译 – 4、对译文进行修饰 – 5、写出最后译文
• 1.2编译程序概述 • 编译程序的工作
– 词法分析 – 语法分析 – 语义分析和中间代码生成 – 优化 – 目词法分析(续) • 词法分析依照词法规则,识别出正确的单词,转 换成统一规格,备用。 • 转换
– – – – 对基本字、运算符、界限符的转换 标示符的转换 常数的转换 转换完成后的格式(类号+内码)
• 描述词法规则的有效工具是正规式和有限自动机
• 1.2编译程序概述 • 2、语法分析 • 任务:在词法分析的基础上,根据语言的 语法规则,把单词符号组成各类的单词单 位:短语、子句、语句、过程、程序。 • 语法规则:语言的规则,称为文法;规定 单词如何构成短语、语句、过程和程序。 • 语法规则的表示: • BNF A :: = B | C

编译原理-第一章

编译原理-第一章
第一章 引论
本章主要介绍为什么需要编译程序以及编译程序的功 能、体系结构、工作过程、组织方式,编译程序与高级程 序设计语言的关系,以及编译自动化和并行编译程序等方 面的基本知识。
1.1 翻译程序
1.1.1 程序设计语言 介绍了程序设计语言的发展
1.1.2 翻译语言 翻译程序将高级语言编写的程序翻译成机器语言
1. 自动产生编译程序的“编译程序的编译程序” (Compiler-Compiler)。只要给出某一高级程序语 言的语法规则和语义描述,这类程序就能自动地生成 相应语言的编译程序。
2. 面向语法的符号加工程序。这类程序比较通用。 3. 由可扩充语言组成的集合。这类TWS允许程序员利用
已有的数据类型和语句去定义新的数据类型和语句。
编译总控
Comp1



Comp1
覆盖
Comp2


Compn
扫描对象
部分处理结束
加工 结果
输入 对象
编译程序组织方式
1.6 编译程序的其他有关技术
❖ 编译程序的自展技术 ❖ 编译程序的移植 ❖ 编译程序的自动化 ❖ 程序的可再入性
编译程序的自展技术
按照自展技术,需要把源语言L分解成一个核心部分L0 与扩充部分L1,L2,…,Ln。
编译程序的自动化
❖ 在编译程序自动化进程中,开发早且应用广泛的 是词法分析程序生成器和语法分析程序生成器。
❖ 词法分析程序生成器:LEX(详见第13章)。它输入的是
正规表达式,输出的是词法分析程序。LEX的基本思想是由正规表 达式构造有穷自动机。
❖ 语法分析程序生成器:基于LALR(1)文法的YACC(Yet
1.5 编译程序的组织方式

编译原理(第一章)

编译原理(第一章)

语法分析器通常采用自顶向下的分析 方法,从源代码的起始位置开始,逐 步向下解析,直到找到完整的语法结 构或遇到语法错误。
语法分析是编译器的基础,它决定了 源代码的结构和含义,并为编译器提 供了理解和处理源代码的框架。
语法分析的任务
确定词法单元
语法分析器需要将源代码分解 成一个个的词法单元或符号, 如关键字、标识符、运算符等
对优化后的代码进行评估,包括性能测试、空间占用测试 等,以确定优化的效果是否达到预期目标。
THANKS FOR WATCHING
感谢您的观看
优化的分类
根据优化涉及的方面不同,优 化可以分为局部优化和全局优 化。
局部优化是指在单个函数或代 码块范围内进行的优化,通常 关注单个语句或表达式的优化。
全局优化是指在程序的全局范 围内进行的优化,通常关注函 数或模块之间的优化,以提高 整个程序的性能。
优化技术
在此添加您的文本17字
常见的优化技术包括常量折叠、死代码消除、循环展开、 循环优化、函数内联等。
在此添加您的文本16字
常量折叠是指在编译过程中将常量表达式的结果进行计算 并替换掉原来的表达式,以减少程序运行时的计算量。
在此添加您的文本16字
死代码消除是指删除程序中永远不会被执行到的代码,以 减少程序的空间占用和提高程序的运行效率。
在此添加您的文本16字
循环展开是指将循环体中的代码复制到循环外部,以减少 循环次数和减少循环开销。

识别语法结构
语法分析器需要识别出源代码 中的各种语法结构,如表达式 、语句、程序等。
建立语法树
语法分析器需要将识别的语法 结构按照一定的规则组织起来 ,形成一棵语法树。
语义检查
语法分析器在识别语法结构的 同时,还需要进行一些语义检 查,如类型检查、变量声明等

编译原理第1章

编译原理第1章

功能:依据源语言的语法规则把源程序的单词序列组成语法短语
(表示成分析树/语法树)。
17
What is a Grammar?

语法分析所依据的是语言的语法规则,文法是规则的集合,它们 支配了tokens 中的相互依赖和结构。

语言的语法规则通常是由递归规则来定义,如上述例子中表达式 和语句可由下述递归规则来定义:
t1 = inttofloat(60) t2 = id3 * t1 t3 = id2 + t2 id1= t3
25
Phase 5. Code Optimizer (代码优化)

代码优化的任务是:对产生的中间代码进行等 价变换,使生成的目标代码更为高效(时间和 空间)。优化的目的主要是提高运行效率,节 省存储空间。优化主要有两类,一是与机器有 关的优化,主要设计如何分配寄存器,如何选 择指令,这类优化是在生成目标代码时进行的; 另一类优化与机器无关,主要是对中间代码的 优化。主要有局部优化、循环优化等。
语义审查---上下文相关性、类型匹配、类型转换
例:
void p(); float: rate; void initial(); … position = initial + rate * 60 /* error */ /* error */ /* warning */; …
21
= position initial rate + * 60 position
19
(initial) <id,3> (rate) 树的结点是利用该语言的文法来建造的
语法树是分析树的一种压缩表示
=
position
+
* rate 60

编译原理chapter1 编译概述

编译原理chapter1 编译概述

精品文档
7
赋值语句经语法分析生成分析树
赋值语句
变量 a
:= 表达式
表达式
+



* 因子
因子 因子
60
b
c
精品文档
8
赋值语句经语义分析生成语法树
:=
a
+
b
*
c
inttoreal
精品文档
60 9
生成中间代码
temp1:=inttoreal(60); temp2:=c * temp1; temp3:=b +temp2; a :=temp3;
仅依赖源程序 仅依赖目标计算机
遍(PASS): 对输入文件(源程序或其
等价的中间形式)从头到尾扫视,完成
预定输的入处文理件。

输出文件
精品文档
14
把前端组织成一遍扫描
错误的诊查处理
语法分析
源 程 序
词法 分析
语义分析和 中间代码生 成
中 间 代 码
符号表管理
精品文档
15
设计编译程序应首先研究的问题


程 序
编译程序
标 程
抽 象目标

首先研究源程序的语法和语义及运行模
型,源是设计编译程序的出发点。
研究目标计算机,设计目标代码的指令
系统,它是由目标计算机扩充而成,扩
充后的计算机称作抽象计算机。目前的
通用计算机往往和源语言执行模型不一
致。。
精品文档
16
教和学的几个问题
重要性:处理字符串的一般方法;构造 大程序的方法;实用;研究课题:新的 语言及实现技术;并行编译技术。

《编译原理》第一、二章 绪 论

《编译原理》第一、二章   绪 论
• 优化:对前阶段产生的中间代码进行加工变幻, 以期产生出更高效的目标代码。 优化的主要方面有:公共子表达式的提取,循环 优化,算符规约等等。它所依循的原则是等价变 换规则。 • 目标代码产生:把中间代码变换成特定机器上的 绝对指令代码或汇编指令代码。 许多编译程序采用“四元式”作为中间代码, 它的形式为: 算符 左操作数 右操作数 结果
上下文无关文法
• • 文法G = ( T, V, S, P ) 所谓终结符号T乃是组成语言的基本符号,在程 序语言中就是单词符号. 非终结符号V(也称语法变量)用来代表语法范 畴。例如,“算术表达式”,“布尔表达式”等等。 开始符号是一个特殊的非终结符,它代表所定义 的语言中的“句子”. 产生式是定义了语法范畴的一种书写规则.
一个上下文无关文法的例子
An Example of CFG
• 数学表达式: G = ( { id, +, *, (, ) }, { E }, E, P ) 其中P包括下列规则: E id EE+E EE*E E(E) 定义:“若变量是一个算术表达式,则E + E, E * E 和( E )也是算术表达式” 或者写为:
复合数据类型
• 用户用复合数据类型来描述复杂的数据 对象。一个复合数据类型的成分是由一 些基本数据类型或是递归定义的。如: • Pascal中有数组(array)、记录(record)、等; • C语言中有数组(array)、结构(struct)、联合 类型(union)等。 • 它由有限个成分构成,每个成分都可以 通过一个选择器来得到。
2、操作
• 传名(call by name):把被调用段的过程体 抄到调用出现的地方,但把其中任一出 现的形式参数都替换成相应的实在参数 (文字替换)。
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

3.语义分析和中间代码生成
这一阶段的任务是对各类不同语法范畴按语言的语义进行初 步翻译,包含两个方面的工作:一是对每种语法范畴进行静态语 义检查,如变量是否定义、类型是否正确等;二是在语义检查正 确的情况下进行中间代码的翻译。注意,中间代码是介于高级语 言的语句和低级语言的指令之间的一种独立于具体硬件的记号系 统,它既有一定程度的抽象,又与低级语言的指令十分接近,因 此转换为目标代码比较容易。把语法范畴翻译成中间代码所遵循 的是语言的语义规则,常见的中间代码有四元式、三元式、间接 三元式和逆波兰记号等。
(3) 1954~1957年,IBM John Backus带领的一个研究小组对 FORTRAN语言及其编译器进行了开发。但是,由于对编译程 序的理论及技术研究刚刚开始,这个语言的开发付出了巨大 的辛劳。与此同时, 波兰语言学家Noam Chomsky开始了他的 自然语言结构研究。Noam Chomsky根据文法(Grammar,产 生语言的规则)的难易程度及识别它们所需的算法对语言进 行了分类,定义了0型、1型、2型和3型这四类文法及其相应 的形式语言,并分别与相应的识别系统相联系。
图1–3 源程序的编译、汇编和运行阶段
用高级语言编写的程序也可通过解释程序来执行。解释程 序也是一种翻译程序,它将源程序作为输入,一条语句一条语 句地读入并解释执行,如图1–4所示。解释程序与编译程序的主 要区别是:编译程序将源程序翻译成目标程序后再执行该目标 程序;而解释程序则逐条读出源程序中的语句并解释执行,即 在解释程序的执行过程中并不产生目标程序。典型的解释型高 级语言是BASIC语言。
第1章 绪论
1.1 程序设计语言和编译程序 1.2 编译程序的历史及发展 1.3 编译程序的工作过程与结构 1.4 编译程序的开发 1.5 构造编译程序所应掌握的内容 习题一
1.1 程序设计语言和编译程序
计算机的诞生是科学发展史上的一个里程碑。经过半个 多世纪的发展,计算机已经改变了人类生活、工作的各个方 面,成为人类不可缺少的工具。计算机之所以能够如此广泛 地被应用,应当归功于高级程序设计语言。计算机语言之所 以能由最初单一的机器语言发展到现今数千种高级语言,就 是因为有了编译程序。没有高级语言,计算机的推广应用是 难以实现的;而没有编译程序,高级语言就无法使用。编译 理论与技术也是计算机科学中发展得最迅速、最成熟的一个 分支,它集中体现了计算机发展的成果与精华。
(6)现代编译技术已转向并行编译的研究。
1.3 编译程序的工作过程与结构
1.词法分析
词法分析的任务是输入源程序,对构成源程序的字符串 进行扫描和分解,识别出一个个单词符号,如基本字(if、for、 begin等)、标识符、常数、运算符和界符(如“(”、“)”、“=”、 “;”)等,将所识别出的单词用统一长度的标准形式(也称内 部码)来表示,以便于后继语法工作的进行。因此,词法分析 工作是将源程序中的字符串变换成单词符号流的过程,词法 分析所遵循的是语言的构词规则。
一个高级语言程序的执行通常分为两个阶段,即编译阶段 和运行阶段,如图1–2所示。编译阶段将源程序变换成目标程序; 运行阶段则由所生成的目标程序连同运行系统(数据空间分配子 程序、标准函数程序等)接受程序的初始数据作为阶段
如果编译生成的目标程序是汇编语言形式的,那么在编译 与运行阶段之间还要添加一个汇编阶段,它将编译生成的汇编 语言目标程序再经过汇编程序变换成机器语言目标程序,如图 1–3所示。
(4)20世纪70年代后期和80年代初,大量的研究都关注于编 译器其他部分的自动生成,其中包括代码生成。
(5)现今编译器的发展包括了更为复杂的算法应用程序, 它用于简化或推断程序中的信息,这又与具有此类功能的更 为复杂的程序设计语言发展结合在一起。其中典型的有用于 函数语言编译Hindley-Milner类型检查的统一算法。目前,编 译器已经越来越成为基于窗口的交互开发环境(Interactive Development Environment,IDE)的一部分,这个开发环境包 括了编辑器、链接程序、调试程序以及项目管理程序。尽管 近年来对IDE进行了大量的研究,但是基本的编译器设计在近 20年中都没有多大的改变。
4.优化
优化的任务是对前阶段产生的中间代码进行等价变换或改 造,以期获得更为高效(节省时间和空间)的目标代码。常用的优 化措施有删除冗余运算、删除无用赋值、合并已知量、循环优 化等。例如,其值并不随循环而发生变化的运算可提到进入循 环前计算一次,而不必在循环中每次循环都进行计算。优化所 遵循的原则是程序的等价变换规则。
图1–4 解释程序解释执行过程示意
1.2 编译程序的历史及发展
(1) 20世纪40年代,由于冯·诺伊曼在存储-程序计算机方面 的开创性工作,计算机可以执行编写的一串代码或程序,这 些程序最初都是用机器语言(Machine Language)编写的。
(2)用机器语言编写程序很不方便且容易出错,因此这种 代码形式很快就被汇编语言(Assembly Language)取代。在 汇编语言中,指令和存储地址都以符号形式给出。
5.目标代码生成
这一阶段的任务是把中间代码(或经优化处理之后)变换成特 定机器上的机器语言程序或汇编语言程序,实现最终的翻译工作。 最后阶段的工作因为目标语言的关系而十分依赖硬件系统,即如 何充分利用机器现有的寄存器,合理地选择指令,生成尽可能短 且有效的目标代码,这些都与目标机器的硬件结构有关。
2.语法分析
语法分析的任务是在词法分析的基础上,根据语言的语法 规则(文法规则)把单词符号流分解成各类语法单位(语法范畴), 如“短语”、“子句”、“句子(语句)”、“程序段”和“程 序”。通过语法分析可以确定整个输入串是否构成一个语法上 正确的“程序”。语法分析所遵循的是语言的语法规则,语法 规则通常用上下文无关文法描述。
相关文档
最新文档