编译原理第一章
编译原理第一章
常见的中间代码形式
探讨了常见的中间代码形式,包括三地址代码和抽 象语法树等,并讨论了它们的优缺点。
优化和目标代码生成
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)
源程序
词法分析 语法分析
单词符号 语法单位 中间代码
编译过程
中间代码生成 代码优化
中间代码(优化后)
目标代码
编译原理文档第一章
编译原理第一章编译程序概论使用过计算机的人都知道,多数用户是应用高级语言来实现他们所需要的计算的。
在计算机上执行高级语言程序一般分为两步:第一步,用一个编译程序把高级语言翻译成机器语言程序;第二步,运行所得的机器语言程序求得计算结果。
计算机语言由单一的机器语言发展到现今内容迥异的数千种高级语言,就是因为有了编译技术。
因此,对于计算机专业的学生来说,理解编译程序的工作原理显得尤其重要。
本章重点:编译程序概念、编译过程概述、编译程序的结构。
第一节什么是编译程序通常所说的翻译程序是指这样的一个程序,它能够把某一种语言(称为源语言)改造为另一种语言(称为目标语言),而后者与前者在逻辑上是等价的。
如果源语言是诸如FORTRAN、PASCAL、ALGOL或COBOL这样的“高级语言”,而目标语言是诸如汇编语言或机器语言之类的“低级语言”,这样的一个翻译程序就称为编译程序。
第二节编译过程概述编译程序完成从源程序到目标程序的翻译工作,是一个复杂的整体的过程。
从概念上来说,一个编译程序的整个工作过程是划分成阶段进行的,每个阶段将源程序的一种表示形式转换成另一种表示形式,各个阶段进行的操作在逻辑上是紧密连接在一起的,图1-2-1给出了一个编译过程的各个阶段,这是一种典型的划分方法。
事实上,某些阶段可能组合在一起,这些阶段间的源程序的中间表示形式就没必要构造出来了。
图1-2-1中将编译过程划分成了词法分析、语法分析、中间代码生成,代码优化和目标代码生成六个阶段,我们将分别介绍各阶段的任务。
另外两个重要的工作:表格管理和出错处理与上述六个阶段都有联系。
编译过程中源程序的各种信息被保留在种种不同的表格里,编译各阶段的工作都涉及到构造、查找或更新有关的表格,因此需要有表格管理的工作。
如果编译过程中发现源程序有错误,编译程Array序应报告错误的性质和错误发生的地点,并且将错误所造成的影响限制在尽可有小的范围内,使得源程序的其余部分能继续被编译下去,有些编译程序还能自动校正错误,这些工作称之为出错处理。
编译原理第1章
第1章 引 言 4.其他面向特定应用领域的语言 .
无法显示图像。计算机可能没有足够的内存以打开该图像,也可 能是该图像已损坏。请重新启动计算机,然后重新打开该文件。 如果仍然显示红色“x” ,则可能需要删除该图像,然后重新将其插 入。
随着计算机应用领域的不断拓展,先后出现了多种面向特 定应用领域的高级语言,如面向互联网应用的HTML、XML, 面向计算机辅助设计的MATLAB,面向集成电路设计的VHDL、 Verilog,面向虚拟现实的VRML等等。这些形形色色、多不胜 数的计算机语言推动了计算机应用的飞速发展,使得计算机成 为人类生活中不可缺少的重要部分。
第1章 引 言
无法显示图像。计算机可能没有足够的内存以打开该图像,也可 能是该图像已损坏。请重新启动计算机,然后重新打开该文件。 如果仍然显示红色“x” ,则可能需要删除该图像,然后重新将其插 入。
图1.2 编译器与解释器工作方式的对比 (a) 编译器的工作方式;(b) 解释器的工作方式
第1章 引 言
第1章 引 言 3.形式化描述语言 .
无法显示图像。计算机可能没有足够的内存以打开该图像,也可 能是该图像已损坏。请重新启动计算机,然后重新打开该文件。 如果仍然显示红色“x” ,则可能需要删除该图像,然后重新将其插 入。
形式化描述语言的代表之一是编译器构造中常用的工具 YACC的语言。这类语言的核心部分是基于数学基础的产生式, 设计人员只需利用产生式描述语言结构的文法,就可以构造出 识别该语言结构的识别器。
第1章 引 言
无法显示图像。计算机可能没有足够的内存以打开该图像,也可 能是该图像已损坏。请重新启动计算机,然后重新打开该文件。 如果仍然显示红色“x” ,则可能需要删除该图像,然后重新将其插 入。
编译原理 第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)规则<赋值语句>::=<标识符>“=”<表达式> <表达式>::=<表达式>“*”<表达式> <表达式>::=<表达式>“+”<表达式> <表达式>::=“(”<表达式>“)”<表达式>::=<标识符> <表达式>::=<整数> <表达式>::=<实数> ■词法分析和语法分析本质上都是对源程序的结构进行分析。
编译原理-第一章-习题解答
第一章习题解答2.编译程序有哪些主要构成成分?各自的主要功能是什么?编译程序的主要构成成分有:词法分析程序、语法分析程序、语义分析程序、中间代码生成程序、代码优化程序、目标代码生成程序、表格管理程序及出错处理程序。
(1)词法分析程序:从左到右扫描源程序,识别单词及其有关属性;(2)语法分析程序:分析源程序的结构, 判别它是否为相应程序设计语言中的一个合法程序;(3)语义分析程序:审查源程序有无语义错误,为代码生成阶段收集类型信息;(4)中间代码生成程序:将源程序变成一种内部表示形式;(5)代码优化程序:对前阶段产生的中间代码进行变换或进行改造,使生成的目标代码更为高效;(6)目标代码生成程序:把中间代码变换成特定机器上的绝对指令代码或可重定位的指令代码或汇编指令代码;(7)表格管理程序:保存编译过程中的各种信息;(8)出错处理程序:若编译过程中发现源程序存在错误,则报告错误的性质和错误发生的地点,有些还可以自动校正错误。
3.什么是解释程序?它与编译程序的主要不同是什么?解释程序接受某个语言的程序并立即运行这个源程序。
它的工作模式是一个个的获取、分析并执行源程序语句,一旦第一个语句分析结束,源程序便开始运行并且生成结果,它特别适合程序员交互方式的工作情况。
而编译程序是一个语言处理程序,它把一个高级语言程序翻译成某个机器的汇编或二进制代码程序,这个二进制代码程序再机器上运行以生成结果。
它们的主要不同在于:解释程序是边解释边执行,解释程序运行结束即可得到该程序的运行结果,而编译程序只是把源程序翻译成汇编或者二进制程序,这个程序再执行才能得到程序的运行结果。
(当然还有其他不同,比如存储组织方式不同)THANKS !!!致力为企业和个人提供合同协议,策划案计划书,学习课件等等打造全网一站式需求欢迎您的下载,资料仅供参考。
编译原理王生原(第一章)
目标代码生成
目标代码表示形式
编译器需要将中间代码转换 为目标机器代码,以便在计 算机上运行。
目标代码优化
编译器可以使用各种技术进 行目标代码的优化,如指令 选择、寄存器分配等。
指令生成方法
编译器可以使用模板匹配等 技术生成目标机器指令。
总结
1
词法分析
将程序代码分解成一系列令牌或词法单元
2
语法分析
编译过程概述
编译过程由三个阶段组成:词法分析、语法分析和语义分析。在生成中间代码和目标代码之 前,还需要进行一些优化。
词法分析
目的和原理
将程序代码分解成一系列令牌或词法单元,以便进 行进一步的分析和转换。
识别标识符和关键字
编译器需要识别代码中的标识符和关键字,以便进 行进一步的语法分析。
识别常量
编译器需要将数字和字符串等常量识别并转换为内 部表示形式。
类型检查
编译器需要检查代码中的类型 错误,并将其转换为中间代码 表示形式。
处理语义错误
编译器需要对语义错误进行处 理,如输出错误消息或修复错 误。
中间代码生成
中间代码表示形式
编译器需要将语法树转换为中间代码表示形式,以 便进行后续优化可以使用各种技术进行中间代码的生成和优 化,如常量折叠、复写传播等。
语法分析
1 目的和原理
将词法单元组成的序列转换为语法分析树或语法树,以便进一步分析和转换代码。
2 生成语法规则
编译器需要根据语法规则生成语法分析树,以便进一步处理和转换代码。
3 生成语法树
编译器需要将语法树转换为中间代码表示形式,以便进一步优化和转换代码。
语义分析
目的和原理
检查代码中的语义错误,如类 型不匹配、未定义的变量等, 并生成符号表以便后续处理。
编译原理(1)50页PPT
编译程序
将一种语言书写的程序翻译成另一种语 言的等价的程序。 编译程序的输入对象称为源程序。 编译程序的输出对象称为目标程序。
高级语言程序的处理过程
常用的翻译工具有3种
根据被翻译语言与执行方式的不同 1.汇编程序
用于特定计算机上的汇编语言的翻译程序。
2.编译程序 3.解释程序
对源程序进行翻译的程序
sum = first+count*10
id1∶=id2+id3*10 四元式(运算符,运算对象1,运算对象2,结果)
5.中间代码优化
任务:通过调整和改变中间代码中某些 操作的次序,最终产生更加高效率的目 标代码 优化所依循的原则是程序的等价变换规 则 其方法有:公共子表达式的提取、循环 优化、删除无用代码等。
任务:扫描源程序,根据语言的词 法规则,分解和识别出每个单词, 并把单词翻译成相应的机内表示。 单词是语言中最小的语义单位 在词法分析阶段工作所依循的是语 言的词法规则。描述词法规则的有 效工具是正规式和有限自动机。
Pascal源程序片断
position := initial + rate * 60
二.编译程序概述
源程序 词法分析 语法分析 语义分析 中间代码生成 代码优化 目标代码生成
目标程序
英译与编译的比较
1.识别出句子中的一个个单 1.词法分析 字
2.分析句子的语法结构
2.语法分析
3.初步翻译句子的含意
3.语义分析中间代码 生成
4.译文修饰
4.优化
5.写出最后译文
5.目标代码生成
1.词法分析
表格与表格管理
编译过程中源程序的各种信息被保留在 种种不同的表格里,编译各阶段的工作 都涉及到构造、查找或更新有关的表格, 因此需要有表格管理的工作
编译原理第1章
编译原理第1章第一章编译概述2.典型的编译程序可划分为几部分?各部分的主要功能是什么?每部分都是必不可少的吗?答:编译程序主要由词法分析程序、语法分析程序、语义分析程序、中间代码生成程序、代码优化程序、目标代码生成程序、信息表管理程序、错误检查处理程序组成。
各部分的主要功能如下:词法分析程序又称扫描器。
进行词法分析时,依次读入源程序中的每个字符,依据语言的构词规则,识别出一个个具有独立意义的最小语法单元,即“单词”,并用某个单词符号来表示每个单词的词性是标识符、分界符还是数;语法分析程序的功能是:对词法分析的结果,根据语言规则,将一个个单词符号组成语言的各种语法类;语义分析的功能是确定源程序的语义是否正确;中间代码生成程序的功能是将源程序生成一种更易于产生、易于翻译成目标程序的中间代码;代码优化程序的功能是将中间代码中重复和冗余部分进行优化,提高目标程序的执行效率;目标代码生成程序的功能是将中间代码生成特定机器上的机器语言代码;符号表管理程序的功能是记录源程序中出现的标识符,并收集每个标识符的各种属性信息;错误处理程序的功能是应对在编译各个阶段中出现的错误做适当的处理,从而使编译能够继续进行。
编译程序的每部分都是必不可少的。
3.解释方式和编译方式的区别是什么?答:解释方式最终并不生成目标程序,这是编译方式与解释方式的根本区别。
解释方式很适合于程序调试,易于查错,在程序执行中可以修改程序,但与编译方式相比,执行效率太低。
4.论述多遍扫描编译程序的优缺点?答:优点:(1)可以减少内存容量的需求,分遍后,以遍为单位分别调用编译的各个子程序,各遍程序可以相互覆盖;(2)可使各遍的编译程序相互独立,结构清晰;(3)能够进行充分的优化,产生高质量的目标程序;(4)可将编译程序分为“前端”和“后端”,有利于编译程序的移植。
缺点是每遍都要读符号、送符号,增加了许多重复性工作,降低了编译效率。
编译原理-第一章
本章主要介绍为什么需要编译程序以及编译程序的功 能、体系结构、工作过程、组织方式,编译程序与高级程 序设计语言的关系,以及编译自动化和并行编译程序等方 面的基本知识。
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章
【学习目标】◇ 明确编译程序的功能及其在计算机系统中的 作用。
◇ 了解源语言程序被编译为目标程序的整个过 程,这个过程一般划分为哪些阶段。
◇ 知道编译技术可用于哪类软件的设计和开发。
编译概述12【学习指南】编译程序是现代计算机系统的基本组成部 分之一。
编译程序一般由词法分析程序、语法 分析程序、语义分析程序、中间代码生成程序、 目标代码生成程序、代码优化程序、表格管理 程序和出错处理程序等成分构成。
通过课程的 学习应掌握各个成分的功能和设计原则,以及 在编译阶段的逻辑关系。
理解他们怎样作为一 个整体完成编译任务的。
知识体系 功能 翻译途径 翻译程序 编译方式 解释方式【难重点】应该说,本章没有难以理解的内容,主要对 编译程序的功能和结构做一综述。
3词法分析程序 语法分析程序 解释程序 语义分析程序 组成 中间代码生成程序 分类 中间代码优化程序 目标代码生成程序 表格管理程序 编译程序 出错处理程序 结构 单遍扫描的编译程序 4 多遍扫描的编译程序本章内容﹣什么是编译 ﹣编译过程概述 ﹣编译阶段的组合:通过描述编译程序的 各个阶段来介绍编译这个课题 ﹣构造编译程序的工具1.1 什么是编译程序一、程序设计语言的基础知识1、程序:一系列指令或语句,用来描述计算机依次要执行的一系列工作。
2、结构:基本符号(字母、数字、符号等)→单词(符号)→量(语法单位)→表达式→语句→分程序→程序3、程序设计语言的定义(指高级程序设计语言)分语法、语义和语用三部分。
§ 语法是描述程序的结构,根据它可以产生正确的程序。
§ (词法规则、语法规则) § 语义是语言成分的含义,由程序执行的效果来说明。
§ 语用:语言的实际应用。
如: x:=a+b*c56二、翻译和编译 § 什么是翻译程序– 翻译程序指的是这样一个程序,它能够把某 一种语言程序(源语言程序)改造成另一种语 言程序(目标语言程序),而两者在逻辑上是 等价的。
编译原理第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
编译原理_第1章(清华大学)
语义分析
语义审查(静态语义)
上下文相关性 类型匹配 类型转换
例: Program p(); Var rate:real; procedure initial; … position := initial + /* error */ /* error */ …
rate * 60 /* warning */;
编译程序结构(components) 词法分析程序 语法分析程序 语义分析程序 中间代码生成程序 代码优化程序 目标代码生成程序 符号表管理程序 出错处理程序
词法分析程序
语法分析程序
表 格 管 语义分析程序 中间代码生成程序 出 错 处
理
代码优化程序
功能:层次分析.依据源程序的语法规则把源程序 的单词序列组成语法短语(表示成语法树).
position := initial + rate * 60 ; 规则 <赋值语句>::=<标识符>“:=”<表达式> <表达式>::=<表达式>“+”<表达式> <表达式>::=<表达式>“*”<表达式> <表达式>::=“(”<表达式>“)” <表达式>::=<标识符> <表达式>::=<整数> <表达式>::=<实数>
又如: int arr [2],abc; abc = arr * 10;
… Program p(); Var rate:real; Var initial :real; Var position :real ; … position := initial +
编译原理第一章
第一章概述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章)
翻译程序
机器只能理解和执行机器语言.高级语言需转换成机器 语言才能执行.如何转换?
▪ 翻译 ▪ 解释
翻译程序:是指能够把某种语言的程序(源语言程序) 转换成另一种语言的程序(目标语言程序),而后者 与前者在逻辑上是等价的。
为什么要学习编译原理
编译程序构造是计算机学科中一个非常成功 的分支,也是最早获得成功的分支;
编译原理蕴涵着计算机学科中解决问题的思 路、抽象问题和解决问题的方法;
编译原理课程的学习有利于加深对程序语言 的理解,可以帮助你更加快速的掌握新的语 言工具;
课程中包含了很多软件技术,程序设计语言 编译程序构造的基本原理和实现方法是软 件的核心技术之一,这对于以后从事软件设 计是很有帮助的.
第一种情况:
初始数据
编
源程序
译 程
高级语言 序
程序
机器语言 目标程序
运行系统
结果
编译阶段
运行阶段
编译原理
18
第二种情况:
初始数据
编
源程序
译 程
高级语言 序
程序
编译阶段
汇编 汇 语言 编 目标 程 程序 序
机器 语言 目标 程序
结果
运行系统
汇编阶段
运行阶段
编译原理
19
1.2 编译程序的基本结构
例:将英文句子 “I wish you success ” 翻译成中文句子的大致过程是:
例如 float r,h,s;
s = 2*3.1416*r*(h+r);
编译原理
28
单词符号串 s=2*3.1416 * r *(h+r) 中,“s” 是<变量>,单词符号串
第1章 编译原理
7
编译技术的应用
编译并不限于程序设计语言的应用
– Text Formatters正文格式化程序
LATEX & TROFF Are Languages Whose Format Text
Commands
– Silicon Compilers硅片编译程序
Textual / Graphical: Take Input and Generate Circuit Design
8
编译程序的环境
为了建立一个可执行的程序,除了编译 程序本身之外还需要其他一些程序,它 们构成编译程序正常工作的环境,如下 图所示。
9
Source Program
1
Pre-Processor
2
Compiler
3
Assembler
4
Relocatable Machine Code Loader Link/Editor
initial
树的结点是利用该语言的文法来建造的
14
文法是规则的集合,它们支配了Tokens 中的相 互依赖和结构
statement 是 assignment statement, or while statement, or if statement, or ... identifier := expression ;
程序设计语言:用来编写计算机程序的语言。
高级语言
程序设 计语言
过程式语言 Fortran,Pascal,C 函数式语言 Lisp 逻辑式语言 Prolog 对象式语言 C++ 汇编语言
低级语言:面向机器的语言
机器语言
4
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
解释执行
① 不生成目标代码 ② 能支持交互环境(同增量式编译系统) 优点:交互方便,节省空间。 缺点:效率低。因对源程序的循环语句部分 要反复解释执行。 共同点:都需进行词法、语法、语义分析。 可比喻为: -编译是笔译(产生目标程序) -解释是口译(不产生目标程序) 很多语言如BASIC,LISP和PROLOG等等 最初都是解释执行的,后来也都有了编译系统 。号称最具生命力的JAVA环境同时需要解释 和编译系统的支持
特定机器上的绝对指令代码或可重定位的指令 代码或汇编指令代码。这是编译的最后阶段, 它的工作与硬件系统结构和指令含义有关,这 个阶段的工作很复杂,涉及到硬件系统功能部 件的运用、机器指令的选择、各种数据类型变 量的存储空间分配以及寄存器和后缓寄存器的 调度等。
23
24
上述编译过程的六个阶段的任务,再加上用表格
语法分析是编译过程的一个逻辑阶段。
语法分析的任务是在词法分析的基础上将单词序
列组合成各类语法短语,如“程序”,“语句”, “表达式”等等。语法分析程序判断源程序在结 构上是否正确。
源程序的结构由上下文无关文法描述。语法分析
程序可以用YACC等工具自动生成。
10
语法分析器的两个重要作用: ①根据词法分析器提供的记号流,为语法正 确的输入构造分析树(或语法树)。 ②检查输入中的语法(可能包括词法)错误, 并调用出错处理器进行适当处理。 下图是语法分析器在编译器模型中的位置:
式生成代码的,这种语言的编译程序至少分成两遍才容易
生成代码。另外机器的情况,即编译程序工作的环境也影 响编译程序的遍数的划分。一个多遍的编译程序可以较之
一遍的编译程序少占内存,遍数多一点,整个编译程序的
逻辑结构可能清晰些,但遍数多即意味着增加读写中间文 件的次数,势必消耗较多时间,显然会比一遍的编译要慢。
27
在实际的编译系统的设计中,编译的几个阶段的工作究竟
应该怎样组合,即编译程序究竟分成几遍,参考的因素主 要是源语言和机器(目标机)的特征。
比如源语言的结构直接影响编译的遍的划分; 像PL/1或
ALGOL68那样的语言,允许名字的说明出现在名字的使 用之后,那么在看到名字之前是不便为包含该名字的表达
高级语言书 写 的 程 序 (源程序) 编译程序 低级语言程序 (目标程序)
编译程序的重要性体现在它使得多数计算 机用户不必考虑与机器有关的烦琐细节,
使程序员和程序设计专家独立于机器。这
对于当今机器的数量和种类持续不断地增 长的年代尤为重要。
4
1.2编译过程和编译程序的结构
编译程序完成从源程序到目标程序的翻译工作,
语法分析的依据:语言的语法规则。
每种程序设计语言都有描述程序语法结构的规
则。例如,Pascal程序由程序块(又叫分程序) 构成,程序块由语句组成,语句由表达式组成, 表达式由记号组成等等。这些规则可以用上下 文无关文法或BNF范式(Backus-Naur Form) 描述。
15
具有集体含义。如:标识符、保留字(关键字
或基本字)、算符、界符等。
7
例. 某源程序片断如下: begin var sum , first , count : real ; sum := first + count * 10 end. 词法分析阶段将他们组成如 右图的单词序列.(注意:程 序代码中的空格在编译时 被过滤.) 如果使用id1,id2,id3分别表示 sum ,first ,count经过分 析后:sum := first + count * 10则表示为 id1:=id2+id3*10
本课程的考核:
平时作业:20% 平时考勤:10% 实验考核:20% 期末考试(闭卷):50%
2
第一章
引论
1.1 什么是编译程序? 从功能上看,一个编译程序就是一个语言翻译程序, 它把一种语言(称作源语言)书写的程序翻译成另一种 语言(称作目标语言)的等价的程序。 比如汇编程序是一个翻译程序,它把汇编语言程序翻 译成机器语言。如果把编译程序看成是一个“黑盒 子”,它执行的转化工作如下图:
17
又比如某些语言规定运算对象可以被强制,那么当二目运算
施于一整型和一实型对象时,编译程序将整型转化为实型而 不认为是源程序的错误,假如语句sum := first + count * 10中* 的两个运算对象: count是实型,10是整型,则在 语义分析阶段进行类型审查之后,在语法分析得到的分析 树上增加一语义处理结点,表示整型转化实型的一目运算 符inttoreal,其树如下:
19
20
5.代码优化
代码优化阶段的任务是对前阶段产生的中
间代码进行变换或进行改造,目的是使生 成的目标代码更为高效,即省时间和省空 间,或两者都有。
21
依据优化所涉及的程序范围,又可分为局部优化、 循环优化和全局优化三个不同的级别。
22
6.目标代码生成
目标代码生成阶段的任务是把中间代码变换成
16
3.语义分析
语义分析阶段的任务是审查源程序有无语义错误,为
代码生成阶段收集类型信息。比如,语义分析的一个 工作是进行类型审查。源程序中有些语法成分,按照 语法规则去判断,它是正确的,但它不符合语义规则。 比如使用了没有声明的变量;或者给一个过程名赋值; 或者调用函数时参数类型不合适或者参加运算的两个 变量类型不匹配等等。比如下边的程序片段: int arr[2],c; c = arr1 * 10 ; 其中的赋值语句是符合语法规则的,但是因为没有声 明变量arr1,而存在语义错。
(2) 语法树(syntax tree) 如果分析程序确实生成了语法树,它的构造通常
为基于指针的标准结构,在进行分析时动态分配 该结构,则整棵树可作为一个指向根节点的单个 变量保存。结构中的每一个节点都是一个记录, 它的域表示由分析程序和之后的语义分析程序收 集的信息。例如,一个表达式的数据类型可作为 表达式的语法树节点中的域。有时为了节省空间 ,这些域也是动态分配或存放在诸如符号表的其 他数据结构中,这样就可以有选择地进行分配和 释放。实际上,根据它所表示的语言结构的类型 (例如:表达式节点对于语句节点或声明节点都 有不同的要求),每一个语法树节点本身都可能 要求存储不同的属性。在这种情况下,可由不同 的记录表示语法树中的每个节点,每个节点类型 只包含与本身相关的信息。
1.3 解释程序和一些软件工具
1.3.1解释程序 为了实现在一个计算机上运行高级语言的程序,主要有两个途径: 第一个途径是把该程序翻译为这个计算机的指令代码序列,这就是我
们已经描述的编译过程。
第二个途径是编写一个程序,它解释所遇到的高级语言程序中的语句
并且完成这些语句的动作,这样的程序就叫解释程序。从功能上说, 一个解释程序能让计算机执行高级语言。它与编译程序的主要不同是 它不生成目标代码,它每遇到一个语句,就要对这个语句进行分析以 决定语句的含义,执行相应的动作。
又如一个C源程序片断: int a; a = a + 2; 词法分析后可能返回: 单词类型 保留字 标识符(变量名) 界符 标识符(变量名) 算符(赋值) 标识符(变量名) 算符(加) 整数 界符 单词值 int a ; a = a + 2 ;
2.语法分析(Syntax analysis或Parsing)
是一个复杂的整体的过程。从概念上来讲,一个 编译程序的整个工作过程是划分成阶段进行的, 每个阶段将源程序的一种表示形式转换成另一种 表示形式,各个阶段进行的操作在逻辑上是紧密 连接在一起的。
一般一个编译过程划分成词法分析、语法分析、
语义分析、中间代码生成,代码优化和目标代码 生成六个阶段,这是一种典型的划分方法。
5
编译程序的结构
源程序
词法分析器
单词符号
语法分析器
表 格 管 理
语法单位
语义分析与中间代码产生器
中间代码
出 错 处 理
优化器
中间代码
目标代码生成器
目标代码
1.词法分析
功能:从左到右读入源程序的每个字符,对构成
源程序的字符流进行扫描和分解,从而识别出 一个个单词(也叫单词符号或符号)。 单词:逻辑上紧密相连的一组字符 Nhomakorabea这些字符
管理程序建立变量、常量和过程标识符的说明与 引用之间的信息联系等,用出错处理程序对词法 和语法分析遇到的错误给出在源程序中出错的错 误性质、位置等,可分别由几个模块或程序完成, 它们分别称作词法分析程序、语法分析程序、语 义分析程序、中间代码生成程序、代码优化程序、 目标代码生成程序、表格管理程序和出错处理程 序。从而可给出一个典型的编译程序结构框图, 如图1-3-1所示
程序的结构通常是用递归规则表示的,例如: 表达式的表示: ①任何标识符是表达式。 ②任何常数(整常数、实常数)是表达式。 ③若表达式1和表达式2都是表达式,那么 表达式1+表达式2 表达式1*表达式2 (表达式1) 都是表达式。 类似地语句的表示: ①标识符:=表达式 是语句。 ②while (表达式) do 语句 和 if (表达式) then 语句 else 语句 都是语句。
26
遍
一个编译过程可由一遍、两遍或多遍完成。所谓
“遍”,也称作“趟”,是对源程序或其等价的中间 语言程序从头到尾扫视并完成规定任务的过程。每一 遍扫视可完成上述一个阶段或多个阶段的工作。例如 一遍可以只完成词法分析工作;一遍完成词法分析和 语法分析工作;甚至一遍完成整个编译工作。对于多 遍的编译程序,第一遍的输入是用户书写的源程序, 最后一遍的输出是目标语言程序,其余是上一遍的输 出为下一遍的输入。
1.4 编译器中的主要数据结构
(1) 记号(t o k e n)
当扫描程序将字符收集到一个记号中时,它通常