编译原理 第1章+概述
编译原理第一章

常见的中间代码形式
探讨了常见的中间代码形式,包括三地址代码和抽 象语法树等,并讨论了它们的优缺点。
优化和目标代码生成
1 代码优化
讨论了编译器中的代码优化技术,以提高目 标代码的效率和执行速度。
2 目标代码生成
介绍了编译器如何生成目标代码,以便计算 机能够执行程序。
总结
编译原理是一门重要而有趣的课程,它为计算机科学学习者提供了深入了解计算机程序执行过程的机会。
编译原理第一章
编译原理是计算机科学中非常重要的一门课程,它涉及到如何将高级程序设 计语言转换为计算机能够执行的机器语言。
课程介绍
定义和重要性
介绍了编译原理的定义,并 阐述了编译器在计算机科学 中的作用和重要性。
概述
解释了编译过程的基本步骤, 并介绍了前端和后端之间的 区别。
词法分析
讨论了词法分析的概念,包 括词法单元的定义、正则表 达式和有限自动机的应用。
语法分析
论
语法制导翻译
2
了自顶向下和自底向上的语法分析方法。
解释了语法制导翻译的概念和使用,并
讨论了与语义动作相关的内容。
3
语义错误的处理
讨论了如何检测和处理语义错误,并介 绍了常见的错误处理机制。
中间代码生成
中间代码和中间表示
详细介绍了编译器生成的中间代码及其表示形式, 以及其在编译过程中的重要性。
编译原理--第一章.讲义

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)
源程序
词法分析 语法分析
单词符号 语法单位 中间代码
编译过程
中间代码生成 代码优化
中间代码(优化后)
目标代码
编译原理chapter1 编译概述

序
首先研究源程序的语法和语义及运行模
型,源是设计编译程序的出发点。
研究目标计算机,设计目标代码的指令 系统,它是由目标计算机扩充而成,扩 充后的计算机称作抽象计算机。目前的
通用计算机往往和源语言执行模型不一致。。
16
教和学的几个问题
重要性:处理字符串的一般方法;构造 大程序的方法;实用;研究课题:新的 语言及实现技术;并行编译技术。 学习方法 :(1)源程序是源泉;(2) 把每个阶段放到整个编译程序背景中学 习;(3)认真做作业。 每周有一次答疑。 参与网上教材的修改与创新。
仅依赖目标计算机
遍(PASS): 对输入文件(源程序或其等价
的中间形式)从头到尾扫视,完成预定的处
理。
输入文件
输出文件
遍
14
把前端组织成一遍扫描
错误的诊查处理
语法分析
源 程 序
词法 分析
语义分析和
中间代码生成
中 间 代
码
符号表管理 15
设计编译程序应首先研究的问题
源
目
程 序
编译程序
标 程
抽 目标 象
1d
b 变 量 real
1 d+4
c 变 量 real
1 d+8
12
错误的诊查处理
编译程序在各个阶段应诊断和报告源程 序中的错误,包括词法错误,语法错误, 语义错误。 编译程序应报告出错地点,并给出简明 准确的提示信息。
13
编译程序(器)的组织
前端和后端
源程序 前 中间代码 后
端
端
目标代码
仅依赖源程序
Techniques, and Tools, AddisonWesly,1986 。
编译原理第1章 概述

1.3 编译程序的生成
一、基本方法 1. 对源程序文本进行
认真分析(语法语 义理解) 2. 设计编译算法(前后 端、遍、算法等) 3. 选择语言,编制程序 4. 调试编译程序(测试) 5. 整理资料、形成文本
二.移植:将别的语言的编译移植过来 三. 自展:L0→L1+L0 →L2+L1+L0 → … →L 四. 编译程序的自动生成 1. 词法分析程序生成器----LEX 2. 语法分析程序生成器----YACC 3. 自动产生编译程序的工具 编译程序-编译程序 编译程序产生器 翻译程序脚本系统
随着并行技术和并行语言的发展,处理并行语言的并行 编译技术和将串行程序转换成并行程序的自动并行编译技术 正在深入研究之中。
优
码
程序
析
析
代 码
产
化
生 成
生
信息表管理程序
国防科技大学出版社 [3]杜淑敏著,编译程序设计原理、北京航空
航天大学出版社 [4]Aho ,编译原理技术工具(英文),1986 [5]形式语言与自动机理论(研究生教材)
第一章引论
1.1 什么是编译程序
编译程序是一种翻译程序,它将高级 语言所写的程序翻译成等价的机器语言 或汇编语言的目标程序。
源
编
其中的道理。 3、不得缺席:难学,自学花时间多 4、适当做笔记 5、意见反馈 6、作业:一定要独立完成
四、学时安排及评分标准
讲课42学时 12学时上机(词法、语法) 要交实验报告 考试占70% 平时占30%,{ 作业,考勤,实验} 只讲授部分章节
编译原理第一章PPT课件

掌握编译原理有助于提高程序员对程序性能、代码质量和软件
03
工程实践的理解。
编译原理的应用领域
编译器设计
编译原理的核心应用领域之一 是编译器设计,包括源代码到
目标代码的转换、优化等。
解释器设计
解释器是另一种将源代码转换 为机器码的程序,编译原理同 样适用于解释器的设计。
程序分析
编译原理中的一些技术可以用 于程序分析,例如静态分析、 动态分析和程序切片等。
从高级语言的设计开始,逐步向下设计低级语言和机器语言。
数据结构和算法选择
选择合适的数据结构和算法,提高编译器的性能和可维护性。
代码优化
在生成目标代码之前,对中间代码进行优化,以提高目标代码的性能 和质量。
04 语言与语法
语言的定义与分类
总结词
语言的定义与分类是编译原理的重要基础,它涉及到语言的语法、语义和语用等方面。
语言的语义分析
总结词
语义分析是编译过程中的重要环节,它涉及 到对语言意义的解释和理解。
详细描述
语义分析是对源代码进行静态分析的过程, 目的是理解源代码的意义和功能。在语义分 析阶段,编译器会检查源代码中是否有语法 错误、类型错误、逻辑错误等,并对其进行 相应的处理。同时,语义分析还会进行符号 表管理、类型检查、控制流分析等工作,以
详细描述
中间代码生成是编译过程的第三步,其主要任务是将抽象语法树转化为中间代码。中间代码是一种抽象的、与具 体机器无关的代码形式,通常采用三地址码、四元式等表示方式。中间代码的主要目的是为了方便后续的优化和 目标代码生成。
代码优化
总结词
对中间代码进行优化,提高执行效率。
详细描述
代码优化是编译过程中非常重要的一步,其主要任务是对中间代码进行优化,以提高生成的目标代码 的执行效率。常见的优化技术包括常量折叠、无用代码删除、循环展开等。
编译原理 第1讲(第一章)

•记录源程序中使用的名字 •收集每个名字的各种属性信息 类型、作用域、分配存储 信息 c 常量 值:35
x 变量 类型:实 层次:2
VAR procedure… var procedure var x:real;//层次为2 …. end ….. end
…..
解释程序直接将4的值输出(显示)。有些象单步调试
编
1)遍:指对源程序或其内部表示从头 到尾扫视一遍,并进行有关的加工处理。 2)一遍扫描:以语法分析程序为中心。 编译一次完成,但是运行效果不是很好。 3)多遍扫描:每遍扫描完成不同的任 务。优点: 功能独立;结构清晰;利于 优化;节省空间。 2~8遍。
–编译方式:首先由编译程序将程序翻译成为 机器语言(或者虚拟机的语言,如java),然 后执行。
•比较:
–编译的方式可以使得一次翻译过后,多次运 行。适于花较大的精力进行优化工作。
解释执行和编译执行的区别
如:… … b := 2 ; a := b+2 ; write a ; ……
编译程序
生成代码
Int 2 St b Ld b add 2 St a
赋值语句的语法树
赋值语句 标识符 := 表达式 表达式 + 表达式
标识符
表达式
*
表达式
标识符
整数
赋值语句的语法树另一种表达形式
id1:=id2+id3*N
:= id1 Position id2 initial
+
*
id3 rate N 60
(3)语义分析
•变量声明 •类型匹配 •类型转换 例: Program p(); Var rate:real; procedure initial; … position := initial + rate * 60 /* error */ /* error */ /* warning */; …
编译原理复习汇总

复习汇总一、第一章概述1.文法与自动机的等价1)0型文法—图灵机2)1型文法—线性有界非确定图灵机3)2型文法—非确定下推自动机4)3型文法—有限状态自动机2.编译技术的应用1)语法制导的结构化编辑器2)程序格式化工具3)软件测试工具4)程序理解工具5)高级语言的翻译工具6)等等3.从面向机器的语言到面向人类的语言(结合第二章第9小点理解)1)面向机器的语言:机器指令,汇编语言2)面向人类的语言:通用程序设计语言,数据查询语言,形式化描述语言(正规式,产生式)等等。
4.各语言的分类(结合第二章第9小点理解)1)过程式语言,面向对象语言:通用程序设计语言。
2)函数语言:面向特点领域的,递归特性。
例如LISP语言3)说明性,非算法式语言:LEX/YACC,SQL。
4)脚本式语言:Shell语言5.语言之间的转换(李静PPT41)1)高级语言之间的转换一般称为预处理或转换。
2)高级语言翻译成汇编语言或机器语言称之为编译。
3)把汇编语言翻译成机器语言称之为汇编。
4)将一个汇编语言程序汇编为可在另一台机器上运行的机器指令称之为交叉汇编。
5)把机器语言翻译成汇编语言称之为反汇编。
6)把汇编语言翻译成高级语言称之为反编译。
6.编译器和解释器1)编译器●源程序的翻译和翻译后的程序的运行是两个不同的阶段。
◆编译阶段:用户输入源程序,经过编译器的处理,生成目标程序。
◆目标程序的运行阶段:根据要求输入数据,得出结果。
2)解释器(凡是可以采用编译器的地方均可以采用解释器)●解释器把翻译和运行结合到一起,编译一段源程序,紧接着就执行它。
这种方式称为解释。
7.解释器的优点(对比与编译器)1)具有较好的动态特性。
2)具有较好的移植特性。
8.解释器的缺点(对比于编译器)1)相比于编译器需花费大量的时间。
2)占用更多的内存空间。
9.编译器的工作阶段(结合第二章6小点红色部分理解)1)源程序->词法分析器->语法分析器->语义分析器->中间代码生成器->代码优化器->目标代码生成器->目标代码2)工作过程中的每个阶段均采用了符号表管理器,出错处理器。
编译原理 第1章课件

第一章编译程序概述目录1.1 什么是编译程序1.2 编译过程概述1.3 编译程序的结构1.4 编译阶段的组合1.5 编译技术和软件工具1.1 什么是编译程序编译程序:是一个语言翻译程序,是将用高级语言书写的源程序翻译成等价的低级语言的翻译程序。
(C ,Pascal,Foxbase 等) (机器语言,汇编语言) 翻译程序:是把一种语言书写的程序(源程序)翻译成另一种语言(目标语言)的等价的程序。
编译程序的重要性:使得计算机用户不必考虑与机器有关的繁琐细节,使程序员和程序设计专家独立于机器。
编译程序的发展■第一个编译程序的出现:20世纪50年代早期,主要将算术公式翻译成机器代码■20世纪50年代中期,一批编译系统程序开发成功■20世纪50年代末,开始研究编译程序的自动生成工具(LEX 、Y ACC )■20世纪60年代,研究使用自展技术,1971年PASCAL 自展技术成功后,影响越来越大。
1.2 编译过程概述一个编译程序的整个工作过程是划分成阶段进行的,每个阶段将源程序从一种表示形式转换成另一种表示形式。
典型的划分方法:(下图)词法分析阶段:编译过程的第一个阶段从而识别出一个个单词。
(逻辑上紧密相连的一组字符,这些字符具有集体含义。
)单词:标识符,保留字,常数、算符,界符等语法分析:编译过程的第二个阶段依据语言的语法规则从单词符号串中识别出各种语法单位(如“程”,“语句”,“表达式”等)。
目的:检查各种语法单位在语法结构上的正确性。
例子中:符合赋值语句的语法规则,即:<变量>=<表达式>例:s=2*3.1416*r*(h+r)规则<赋值语句>::=<标识符>“=”<表达式> <表达式>::=<表达式>“*”<表达式> <表达式>::=<表达式>“+”<表达式> <表达式>::=“(”<表达式>“)”<表达式>::=<标识符> <表达式>::=<整数> <表达式>::=<实数> ■词法分析和语法分析本质上都是对源程序的结构进行分析。
编译原理王生原(第一章)

目标代码生成
目标代码表示形式
编译器需要将中间代码转换 为目标机器代码,以便在计 算机上运行。
目标代码优化
编译器可以使用各种技术进 行目标代码的优化,如指令 选择、寄存器分配等。
指令生成方法
编译器可以使用模板匹配等 技术生成目标机器指令。
总结
1
词法分析
将程序代码分解成一系列令牌或词法单元
2
语法分析
编译过程概述
编译过程由三个阶段组成:词法分析、语法分析和语义分析。在生成中间代码和目标代码之 前,还需要进行一些优化。
词法分析
目的和原理
将程序代码分解成一系列令牌或词法单元,以便进 行进一步的分析和转换。
识别标识符和关键字
编译器需要识别代码中的标识符和关键字,以便进 行进一步的语法分析。
识别常量
编译器需要将数字和字符串等常量识别并转换为内 部表示形式。
类型检查
编译器需要检查代码中的类型 错误,并将其转换为中间代码 表示形式。
处理语义错误
编译器需要对语义错误进行处 理,如输出错误消息或修复错 误。
中间代码生成
中间代码表示形式
编译器需要将语法树转换为中间代码表示形式,以 便进行后续优化可以使用各种技术进行中间代码的生成和优 化,如常量折叠、复写传播等。
语法分析
1 目的和原理
将词法单元组成的序列转换为语法分析树或语法树,以便进一步分析和转换代码。
2 生成语法规则
编译器需要根据语法规则生成语法分析树,以便进一步处理和转换代码。
3 生成语法树
编译器需要将语法树转换为中间代码表示形式,以便进一步优化和转换代码。
语义分析
目的和原理
检查代码中的语义错误,如类 型不匹配、未定义的变量等, 并生成符号表以便后续处理。
第1章编译原理概述

2、依循的原则:构词规则
3、描述工具:有限自动机
例如某程序片断:
begin var sum, first, count: real;
sum:= first+count*10 end.
简要说明为什么要使用编译程序:高级程序语言不能直接运行在机器上,而低级语言代码书写繁琐。
分析高级语言程序的典型处理过程,从中进一步了解编译程序的作用。
对照英文翻译成中文的过程来说明编译的具体过程。
通过源程序在不同阶段所被转换成的表示形式来介绍各阶段的主要任务。
5个字符b,e,g,i,n构成1个称为保留字的单词begin,这些单词间的空格在词法分析阶段都被过滤掉了。
2、目标代码的三种形式:
绝对指令代码:可直接运行
可重新定位指令代码:需要连接装配
汇编指令代码:需要进行汇编
编译的最后阶段与硬件系统结构和机器指令的含义有关。
1.2.2编译程序的结构
1、编译程序总框
编译过程除了上述六个主要阶段,还必须包括“表格管理程序”和“出错处理程序”。下图为一个典型的编译程序结构框图。
2、高级语言书写
优点:程序易读、易理解、容易维护、生产的效率高。
缺点:难以充分发挥计算机的系统功能,生成的程序效率低。
3、编译程序书写系统自动产生编译程序
1.4关于学习编译原理的意义
1、学习编译程序构造原理,技术
2、更好地理解高级语言
3、编译的原理和方法有助于构造一些实用的工具
本节教学目的:通过直观印象,引入编译程序概念
1、语言的结构化编辑器。
2、语言程序的调试工具。
编译原理第1章

编译原理第1章第一章编译概述2.典型的编译程序可划分为几部分?各部分的主要功能是什么?每部分都是必不可少的吗?答:编译程序主要由词法分析程序、语法分析程序、语义分析程序、中间代码生成程序、代码优化程序、目标代码生成程序、信息表管理程序、错误检查处理程序组成。
各部分的主要功能如下:词法分析程序又称扫描器。
进行词法分析时,依次读入源程序中的每个字符,依据语言的构词规则,识别出一个个具有独立意义的最小语法单元,即“单词”,并用某个单词符号来表示每个单词的词性是标识符、分界符还是数;语法分析程序的功能是:对词法分析的结果,根据语言规则,将一个个单词符号组成语言的各种语法类;语义分析的功能是确定源程序的语义是否正确;中间代码生成程序的功能是将源程序生成一种更易于产生、易于翻译成目标程序的中间代码;代码优化程序的功能是将中间代码中重复和冗余部分进行优化,提高目标程序的执行效率;目标代码生成程序的功能是将中间代码生成特定机器上的机器语言代码;符号表管理程序的功能是记录源程序中出现的标识符,并收集每个标识符的各种属性信息;错误处理程序的功能是应对在编译各个阶段中出现的错误做适当的处理,从而使编译能够继续进行。
编译程序的每部分都是必不可少的。
3.解释方式和编译方式的区别是什么?答:解释方式最终并不生成目标程序,这是编译方式与解释方式的根本区别。
解释方式很适合于程序调试,易于查错,在程序执行中可以修改程序,但与编译方式相比,执行效率太低。
4.论述多遍扫描编译程序的优缺点?答:优点:(1)可以减少内存容量的需求,分遍后,以遍为单位分别调用编译的各个子程序,各遍程序可以相互覆盖;(2)可使各遍的编译程序相互独立,结构清晰;(3)能够进行充分的优化,产生高质量的目标程序;(4)可将编译程序分为“前端”和“后端”,有利于编译程序的移植。
缺点是每遍都要读符号、送符号,增加了许多重复性工作,降低了编译效率。
编译原理(第一章)

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

如何学习构造编译程序
1、掌握源语言 2、掌握目标语言 3、掌握编译方法 编译程序是极其复杂的系统,学 习时将其分解开来学,但要注意前后 的联系、贯通。 作为编译基本原理和方法的学习, 不涉及具体的目标机和机器指令。
基本术语 1.源程序(Source program)
code) 3.翻译程序(Translator) 4.解释程序(Interpreter) 5.汇编程序(Assembler) 6.编译程序(Compiler) 7.编译系统(Compiler system)
2.目标程序(Object
相关概念
例如“四元式”即为一种中间代码,其形式为: (算符,运算对象1,运算对象2,结果)
赋值语句:Z:=(X+0.48)*Y/W
可以生成如下所示的四元式:
( + ( * ( / ( :=
, , , ,
X , 0.48 , t1) t1 , Y , t2 ) t2 , W , t3 ) t3 , — , Z )
1.3 编译程序的结构
一.编译程序总框
源程序
表 格 与 表 格 管 理
词法分析器(扫描器)
单词符号
语法分析器(分析器)
语法单位
错 误 检 测
语义分析及中间代码生成器
中间代码
优化器
中间代码
目标代码生成器
目标代码
1.词法分析器(扫描器) 2.语法分析器(分析器) 3.语义分析及中间代码生成器 4.优化器 5.目标代码生成器 6. 表格与表格管理 7.错误检测
6. 表格与表格管理:
编译程序在其工作过程中使用最多的数据结构形式就 是表格。各种各样的表格中记录着源程序的各种信息,以 便需要时可以随时查询使用。最重要的表格是符号表,其 主要用途为: 收集记录各类符号的属性信息:当分析到标识符的说明部 分时,在符号表中记录相关属性;当分析到标识符的使用 部分时,在符号表中查证相关属性; 语法分析时合法性检查的依据:同一个标识符可能在程序 的不同地方出现,语法分析需要检查标识符在上下文中的 一致性和合法性,而符号表正是进行这种检查的依据; 作为目标代码生成阶段地址分配的依据:每个变量在目标 代码生成时都需要确定其对应的存储地址,编译程序在完 成了对变量的地址分配后,将其存于符号表中,其后可以 通过符号表获取每个变量对应的存储地址。
编译原理第一章

2.翻译程序通常有两种方式:编译和解释
1.1 翻译程序与编译程序
三.编译方式和编译程序 1.编译方式 编译方式是一种分阶段进行的方式 。一般来说 ,首先进行“翻译”,把用高级语言或汇编语言程 序翻译成与之等价的机器语言程序,然后对翻译出 来的程序进行运行计算。前一阶段翻译工作由翻译 程序完成,后一阶段的运行计算需要由运行程序来 配合完成。 所谓运行程序是指运行目标程序时必须配置的各 种子程序全体,通常以库子程序的形式存在,如连 接装配程序及连接库等。
(1)任务
依据语言的语义规则对语法分析程序所识别出各类语法成分进行 静态语义检查,以保证源程序在语义上的正确性,然后分析其含 义,并用另一种语言形式表示出来,或直接用目标语言表示出来 。
(2)语义的分类
静态语义:指在编译阶段能检查出的语义。如确定类型、类型 和运算符合法性检查、识别语法成分含义与相应的语义处理、及 其他一些静态语义检查。 动态语义:则指只有在目标码的运行阶段才能检查出的语义。
出错处理:编译过程中,发现源程序有错误 (词法错误、语法错误、语义错误),编译程 序应报告错误的性质和出错的地点,并将错误 所造成的影响限制在尽可能小的范围内,使得 源程序的其余部分继续被编译下去。这些工作 称为出错处理(error handling)。
1.2 编译程序组成及逻辑结构
2.所谓趟或遍是指一个编译程序在编译过程把源程序或 源程序的等价物(中间程序)从头到尾扫描一遍并完成规
1.2 编译程序组成及逻辑结构
二、编译程序逻辑结构
1.典型的编译程序 结构
信 息 表 管 理 程 序
源程序
词法分析程序
单词符号
语法分析程序
语法单位
编译原理第一章_介绍

(1) (inttoreal 60 -
t1 )
(2) ( *
id3 t1 t2 )
(3) ( +
id2 t2 t3 )
(4) ( :=
t3 -
id1 )
变换
(1) ( * id3 60.0 t1 )
( 2)( + id2 t1 id1 )
31
1.3 编译程序的工作过程
1.3.5 代码生成
如果语义分析时把源程序表示成中间形式 而不是表示成目标指令,则由本部分完成从中 间形式到目标指令的转换。如果语义分析时, 已直接生成目标指令,则无需另外再做代码生 成工作。
)
Andrew W. Appel Modern Compiler Implementation in
Java, CambridgeUniversity Press, 2002. 2nd Ed. (Tiger Book,
虎书)
Michael L. Scott Programming Language Pragmatics, Second Edition,Morgan Kaufmann, 2005. (中译本: 《程序设计语言:实践 之路》裘宗燕,电子工业出版社)
6
第一章 引 论
本节内容: 翻译程序 为什么需要编译程序 编译程序的工作过程 编译程序的结构 编译程序的组织方式 编译程序的其它有关技术 ……
7
编译程序在计算机系统中的位置
分类
– 软件 – 系统软件 – 语言处理系统
编译系 统 操作系统
裸机
8
1.1 程序的翻译
1.1.1 程序设计语言 机器语言 001110010010 汇编语言 add R1 2 高级语言 begin x:=9+2 end
编译原理第一章

第一章概述1.1 编译程序的概念计算机硬件的最核心部件是CPU(Computer Processor Unit)即中央处理器,CPU能够执行的指令是二进制形式的指令即机器指令,机器指令的集合称机器语言。
用机器指令书写的程序可以说无法阅读,程序设计的效率极低甚至可以说无法进行程序设计。
机器指令的助记符形式称汇编指令,比如MOV是数据传送指令,助记符形式的汇编指令的集合称汇编语言。
汇编语言的出现使得程序设计的效率有所提高,即使现在,汇编语言仍是编制设备驱动程序的重要工具。
但是,汇编语言书写的程序不能直接在CPU中运行,需要汇编程序(Assembler)把汇编语言书写的源程序(Source Program)汇编成机器语言程序才能在CPU中运行。
汇编的过程可以用下图表示:(源程序)(目标程序)汇编语言与机器语言类似,仍然依赖于计算机,使用起来繁琐、易出错、可读必差、缺乏通用性,因此面向过程的高级语言、面向对象的高级语言相继出现了。
例如面向过程的高级语言:Basic、Pascal、Fortran、C语言等等;面向对象的高级语言Visual Basic、Visual C++、Delphi、PowerBuilder等等。
把高级语言翻译(Translator)成汇编语言程序或机器语言程序的程序称为编译程序(Compiler)。
汇编语言与机器语言亦称低级语言。
对高级语言书写的源程序进行编译的过程可以用下图表示:编译程序翻译目标程序(Object Program)一般指低级语言程序。
综上所述,可以看出编译程序在计算机系统中的重要地位。
不同的高级程序设计语言需要不同的编译程序,同一种高级程序设计语言在不同的计算机上需要不同的编译程序。
有了编译程序,程序设计人员就不需要考虑与计算机硬件有关的绝大部分甚至全部细节,使程序设计独立与计算机,即同一个高级语言源程序可以在不同的计算机上运行。
在计算机上运行一个高级语言源程序一般分为两步:第一步是通过编译程序把源程序翻译成目标程序;第二步是运行或称执行目标程序。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
③ COBOL语言(COmmon Business COBOL语言
Oriented Language 面向商业通用语言) 面向商业通用语言)
14
IBM公司程序师 IBM公司程序师 约翰·巴科斯(J.Backus) 约翰·巴科斯(J.Backus)
15
艾伦·佩利 (艾伦J .Perlis) 艾伦J
31
§1.2 编译过程概述
一、编译步骤 二、编译过程简述 三、趟程(遍)
32
一、编译步骤
类似于外文资料的翻译过程: 读一个个字母(字符) 构成独立单词 法关系 初步译成中文 加工修改
John von Neumann 冯•诺依曼
1949 EDSAC 冯·诺依曼计算机
9
1.机器语言(第一代语言) 1.机器语言(第一代语言)
(1)定义: (1)定义: 由机器指令构成的语言称机器语言,即用二进制 编码组成。如 01110101 机器指令:是二进制编码,基本上是由操作码和 地址码两部分组成,所以要用机器语言编程序一 定要知道多种不同的操作码。
18
1964年由美国达特茅斯大学研制,BASIC语言不仅用于科 1964年由美国达特茅斯大学研制,BASIC语言不仅用于科 学计算,还用于事务处理,且具有简单易学的特点。是许多 大中专院校的启蒙教学语言。
美国达特茅斯学院 约翰· 约翰·凯梅尼 (J. Kemeny) Kemeny) 和托马斯·卡茨(T.Kurtz) 和托马斯·卡茨(T.Kurtz)
10
1.机器语言(第一代语言) 1.机器语言(第一代语言)
(2)特点: 费时费事 难懂容易错 只能在一种型号计算机上运行 可以直接在计算机上运行
11
2.汇编语言(第二代语言:50年代中期出现) 2.汇编语言(第二代语言:50年代中期出现)
(1)定义 (1)定义
用容易记忆的符号来代替机器指令中操作码和地 址码的一种语言. 址码的一种语言. 如: ADD 代表“+” SUB代表“-” MOV代表“传递” 代表“+” SUB代表“MOV代表“传递” (2)特点 (2)特点 程序直观容易阅读 优点 编程工作量小 只能在一种型号机器上运行 缺点 不能直接在计算机上运行
24
翻译程序
翻译程序 将一种语言程序(称为源程序)改造成另一种等价 将一种语言程序(称为源程序)改造成另一种等价 的语言程序(称为目标程序)的程序。 的语言程序(称为目标程序)的程序。 源语言 书写源程序的语言称为源语言. 书写源程序的语言称为源语言. 目标语言 书写目标程序的语言称为目标语言. 书写目标程序的语言称为目标语言.
第四代语言主要包括 : 1)数据库及其查询语言,如;SQL; )数据库及其查询语言,如;SQL; 2)应用生成程序; 3)可执行规格说明语言。目前问世的第四代语言有ADF、MAPPER )可执行规格说明语言。目前问世的第四代语言有ADF、
(2)特点
1)语言功能强,效率高,使用方便 2)开发应用系统修改方便、维护容易 3)系统复杂,不但要编译还要生成程序。
7
二、程序设计语言简述
1.机器语言(第一代语言) 1.机器语言(第一代语言) 2.汇编语言(第二代语言:50年代中期出现) 2.汇编语言(第二代语言:50年代中期出现) 3.高级程序设计语言(第三代语言:50年代 3.高级程序设计语言(第三代语言:50年代 中期提出) 4.超高级程序设计语言(第四代语言) 4.超高级程序设计语言(第四代语言)
12
3.高级程序设计语言( 3.高级程序设计语言(第三代语言)
——50年代中期提出 ——50年代中期提出 1956年,第一个高级程序设计语言 1956年,第一个高级程序设计语言 FORTRAN(FORmulaTRANslator)正式开始使用。 FORTRAN(FORmulaTRANslator)正式开始使用。
16
商业通用语言语言开发小组
17
2)高级语言发展时期 2)高级语言发展时期
① LISP语言(LISt Processor 表处理) LISP语言(LISt ② APL语言(A Programming Language) APL语言(A ③ SNOBOL语言(String Oriented Symbol SNOBOL语言(String Language 面向字符串符号的语言) 面向字符串符号的语言) ④ PL/1语言(Pogramming Language) PL/1语言(Pogramming ⑤ SIMULA语言 (仿真语言) SIMULA语言 仿真语言) ⑥ BASIC语言(Beginner All-purpose Sybolic BASIC语言(Beginner AllInstructor Code 初学者通用符指令码)
28
三、编译程序
编译程序 是将高级语言写的源程序翻译成目标语言(汇编 语言、机器语言)的程序。这种翻译过程称为编 语言、机器语言)的程序。这种翻译过程称为编 译。 编译系统 目标程序,再加上运行系统(如服务子程序、动 态分配程序、装配程序等)就可获得计算结果, 整个系统称为编译系统。
29
编译程序执行过程
25
翻译程序
一、汇编程序 一、汇编程序 二、解释程序 三、编译程序
26
一、汇编程序
汇编程序:把汇编语言写的源程序翻译成机器语言的目标程序, 汇编程序:把汇编语言写的源程序翻译成机器语言的目标程序, 这个翻译过程称为汇编 这个翻译过程称为汇编。如下图: 汇编。如下图: 初始数据 汇编 源程序 汇编程序 目标程序 结果数据 汇编程序执行过程 汇编程序一般对源程序进行两遍扫描来完成。 第一遍:进行存贮分配,造出第二遍扫描时用的各种表格; 第二遍:用机器语言操作码来代替汇编符号操作码。
编
Compiler Principles
译
原
理
南京邮电大学软件学院 管有庆 guanyouq@
1
教材及参考资料
教材 王汝传. 编译技术原理及其实现方法. 王汝传. 编译技术原理及其实现方法. 成都: 成都科技大学出版社, 成都科技大学出版社, 1998. 参考书 [1] 吕映芝,张素琴,蒋维杜.编译原理. 北京:清华大学出版社,1998. 北京:清华大学出版社,1998. [2] 陈火旺等.程序设计语言编译原理. 北京:国防工业出版社,2000. 北京:国防工业出版社,2000.
(3)高级语言的特点 (3)高级语言的特点
1)直观、易写易读工作量小 2)不依赖于具体的机器 3)便于程序交流 4)不可直接在计算机上运行,经编译程序编译成 机器语言后方可运行。
22
4.超高级程序设计语言(第四代语言) 4.超高级程序设计语言(第四代语言)
(1)定义 只需指出所求问题、输入数据及输出形式,就能得出输出 结果,无需对算法和计算过程描述的语言。
8
电子计算机之父 计算机工作原理
计算机的两个基本能力:一是能够存储程序, 计算机的两个基本能力:一是能够存储程序,二是能 够自动地执行程序。 够自动地执行程序。 计算机是利用“存储器” 内存) 计算机是利用“存储器”(内存)来存放所要执行的 程序的,而称之为CPU的部件可以依次从存储器中取 程序的,而称之为CPU的部件可以依次从存储器中取 出程序中的每一条指令,并加以分析和执行, 出程序中的每一条指令,并加以分析和执行,直至完 成全部指令任务为止。 成全部指令任务为止。
目标程序 源程序 编译程序 (机器语言) 机器语言)
编译阶段
目标程序 源程序 编译程序 (汇编语言) 汇编语言) 汇编程序 目标程序 (机器语言) 机语言) 机器语言) 运行系统 可执行程序 结果数据
运行阶段
30
上述三种翻译程序,汇编程序最容易实现, 其次是解释程序,编译程序最难。所以只 要掌握了编译程序实现方法,汇编程序和 解释程序就迎刃而解了。下面我们就具体 介绍一下编译程序…… 介绍一下编译程序……
(1)定义
高级程序设计语言是一种面向过程语言 (不是面向机器),它用一些符号和数字对实 际问题进行描述的语言,也称过程化语言。
13
(2)分类(按发展时间) 1)高级语言初始时期 1)高级语言初始时期 ① FORTRAN语言 (FORmula FORTRAN语言 TRANslator 公式翻译 ) ② ALGOL语言 (ALGOrithmic Language 算 ALGOL语言
C
20
4)多范型程序设计语言时期 4)多范型程序设计语言时期 ① 函数式语言 典型函数式语言,如LISP、APL、ML等。 典型函数式语言,如LISP、APL、ML等。 ② 逻辑式语言 其代表语言是PROLOG 其代表语言是PROLOG ③ 面向对象式语言 smalltalk、C++、java、C#等都是面向对象式语言。 smalltalk、C++、java、C#等都是面向对象式语言。 C++
27
二、解释程序
解释程序:将高级语言写的源程序作为输入数据,但并不产生目标 解释程序:将高级语言写的源程序作为输入数据,但并不产生目标 程序,而是边解释边执行源程序本身的一种程序。如下图 源程序 解 结 释 果 程 数 初始数据 序 据 解释程序执行过程 解释程序适合于会话型 解释程序适合于会话型语言,如BASIC语言。解释程序主要优点是易 会话型语言,如BASIC语言。解释程序主要优点 优点是易 于为用户提供调试功能,对源程序的语法分析及出错处理都很及时,修 改调试也很方便,但是解释程序执行速度较慢,运行效率低。
19
3)结构程序设计时期 3)结构程序设计时期
① ② ③ ④ PASCAL语言 PASCAL语言 MODULA-2语言 MODULAAda语言 Ada语言 C语言
AT&T贝尔实验室的 AT&T贝尔实验室的 邓尼斯· 邓尼斯·里奇 (D.Ritchie) D.Ritchie) 和肯·汤姆森(K. Thompson) 和肯·汤姆森(K. Thompson)