01第01章 编译概述

合集下载

01第一章 编译简介 编译原理课件

01第一章 编译简介 编译原理课件

怎样发现语法错误? 怎样发现语法错误? 若某语句不能生成语 法树则出现语法错误。 法树则出现语法错误。 如语句: 如语句:

表达式 fact
* (
表达式 表达式
res=fact*)(term1+ term2;
表达式
+
表达式 term2
Li ww, School of Software
term1
Compiling Principle
码外提









与机器有关的优化:寄存器分配、存储策略、
任务划分
Compiling Principle Li ww, School of Software
符 号 表




1.2 编译器组成 续) 编译器组成(续
代码生成(code generation) 代码生成
源 程 序
词法 分析 程序
目标 代码 生成
目 标 代 码









Compiling Principle
Li ww, School of Software
符 号 表




1.2 编译器组成 续) 编译器组成(续
源 程 序
词法 分析 程序
语法 分析 程序
语义 分析 程序
中间 代码 生成
代码 优化 程序
目标 代码 生成
2.计算机辅助设计:MATLAB、AutoCAD 计算机辅助设计:MATLAB、 集成电路设计:VHDL、 3.集成电路设计:VHDL、Verilog 虚拟现实: 4.虚拟现实:VRML ……

第01章_编译程序概述

第01章_编译程序概述

本文由419380142贡献 ppt1。

李红军 E-mail: fengqu77@126.com Tel: 88150636 2011-2-26 1/38 课程简介 课程内容 介绍编译器构造的一般原理和基本实现方法 介绍的理论知识:形式语言和自动机理论、语 法制导的定义和属性文法、类型论等 强调形式描述技术和自动生成技术 强调对编译原理和技术的宏观理解,不把注意 力分散到枝节算法,不偏向于某种源语言或目 标机器 2011-2-26 2/38 为什么要学习编译原理 是计算机学科中一个非常成功的分支 蕴涵着计算机学科中解决问题的思路、抽象问题 和解决问题的方法 有利于加深对程序语言的理解 是一个很好的软件工程实例,所介绍的概念和技 术能应用到一般的软件设计之中 在软件逆向工程、程序理解和软件安全等方面有 着广泛的应用。

2011-2-26 3/38 教材和参考书 教材 《程序设计语言编译原理》. 陈火旺著,国防科技 大学出版社。

 参考书 COMPILER CONSTRUCTION-Principles and Practice. Kenneth C. Louden著(San Jose State University) 《编译原理》. (美)阿霍(Aho, A. V.)等著. 李建中等译. 北京:机械工业出版社, 2003.8 《编译原理考研辅导教程》. 电子科技大学出版社 2011-2-26 4/38 课程要求 目标:相互交流,共同进步 课时:64 课程学分:4 先修课程:《离散数学》《数据结构与算法》 《程序设计语言》 考核:考试(50%)+作业(30%)+出勤(20%) 作业:每章至少1题 2011-2-26 5/38 第一章 编译程序概论 编译原理这门课程主要介绍设计 和构造编译程序的基本原理以及常用 的技术和方法。

 本章重点介绍编译程序的基本概念。

什么是编译程序 编译的过程 编译程序的结构 2011-2-26 6/38 程序设计语言 计算机可以直接接收的语言是机器语言 机器语言,由二进 机器语言 制(0、1序列)组成,唯一可以在机器上直接执行 的语言。

第一章 概述

第一章 概述

第一章概述1.1什麽是编译程序什么是编译程序(compiler)编译程序是现代计算机系统的基本组成部分.从功能上看,一个编译程序就是一个语言翻译程序,它把一种语言(称作源语言)书写的程序翻译成另一种语言(称作目标语言)的等价的程序. (1)软件分类软件:计算机系统中的程序及其文档系统软件:居于计算机系统中最靠近硬件的一层,其他软件一般都通过系统软件发挥作用。

他和具体的应用领域无关,如编译系统和操作系统等。

语言处理系统:把软件语言书写的各种程序处理成可在计算机上执行的程序。

软件语言:用于书写软件的语言。

它主要包括需求定义语言,功能性语言,设计性语言,程序设计语言以及文档语言。

(2)什么是编译程序语言转(变)换系统(3)术语编译程序(compiler)编译程序的源语言(源程序) (source language)(source program)编译程序的目标语言(目标程序) (object or target language)(object or target program) 编译程序的实现语言(implementation language)语言处理程序(language processor)语言转(变)换(language transformation)1.2 编译过程和编译程序的结构1.编译程序的结构(1)词法分析从左至右读字符流的源程序、识别(拼)单词有关术语词法分析(lexical analysis or scanning) --The stream of characters making up a source program is read from left to right and grouped into tokens,which are sequences of characters that have a collective meaning.单词---token保留字---reserved word标识符 ---identifier(user-defined name)(2)语法分析功能:层次分析.依据源程序的语法规则把源程序的单词序列组成语法短语(表示成语法树).术语语法分析(syntax analysis or parsing)The purpose of syntax analysis is to determine the source program’s phrase structure.This process is also called parsing.The source program is parsed to check whether it conforms to the source language’s syntax,and to construct a suitable representation of its phrase structure.语法树(推导树)(parse tree or derivation tree)(3)语义分析语义分析术语语义分析(semantic analysis)The parsed program is further analyzed to determine whether it conforms to the source language’s contextual constraints:scope rules, type rulese.g. To relate each applied occurrence of an identifier in the source program to thecorresponding declaration.(4)中间代码生成中间代码生成(intermediate code generation)This is where the intermediate representation of the source program is created.We want this representation to be easy to generate,and easy to translate into the target program.The representation can have a variety of forms,but a common one is called three-address code or 4- tuple code.(5)代码优化代码优化(code optimization)Intermediate code optimizationThe optimizer accepts input in the intermediate representation and output a version still in the intermediate representation .In this phase,the compiler attempts to produce the smallest,fastest and most efficient running result by applying various techniques.Object code optimization(6)目标代码生成(7)符号表管理记录源程序中使用的名字收集每个名字的各种属性信息类型、作用域、分配存储信息符号表(symbol table)Symbol table is a data structure which is employed to associate identifiers with their attributes .An identifier’s attribute consists of information relevant to contextual analysis,and is obtained from the identifier’s declaration.(8)出错处理检查错误、报告出错信息、排错、恢复编译工作出错处理(error handling)(error reporting and error recovery)The compiler should report the location of each error,together with some explanation. The major categories of compile-time error: syntax error, scope error, type error. After detecting and reporting an error,the compiler should attempt error recovery,means that the compiler should try to get itself into a state where analysis of the source program can continue as normally as possible.2。

编译原理课件-第1章编译简介

编译原理课件-第1章编译简介

Identifier a Array of integer
Identifier index integer
Number 4 integer
Number 2 integer
● The source code optimizer
Assign-expression
Subscript-expression integer
8
1.3 编译器的实例
例:a[index] = 4 + 2
The scanner (Lexical analysis ):
Input: a stream of characters, Output: a , [ , index , ], = , 4, + , 2 (Tokens)
The parser ( Determine the structure of the program ):
● The target code optimizer
MOV R0 , index MUL R0 , 2 MOV R1, &a ADD R1 , R0 MOV *R1, 6
2023/6/1
MOV R0, index SHL R0 MOV &a[R0],6
12
1.4 与编译相关的数据结构
● 枚举类型:记号(tokens)种类、语法单位等的命名; ● 结构体:分析树(parser tree) 、语法树(syntax tree)的
Identifier a
2023/6/1
Identifier index
Additive-expressive
Number 4
Number 2
10
● The semantic analyzer

第1章 编译概述

第1章  编译概述

2015/9/26
编译原理
29
1.4 编译技术在软件开发中的应用
例如,设计词法分析器的串匹配技术 已用于正文编辑器、信息检索系统和模 式识别程序; 上下文无关文法和语法制 导定义已用于创建诸如排版、绘图系统 和语言结构化编辑器中,代码优化技术 已用于程序验证器和从非结构化的程序 产生结构化程序的编程之中。
2015/9/26 编译原理 30
本章小结 编译程序是一种翻译程序,它将高 词法分析、语法分析、语义分析和
中间代码生成、代码优化、目标代 级语言所写的源程序翻译成等价的 机器语言或汇编语言的目标程序。 码生成


2015/9/26
什么是编译程序
编译过程的五个阶段 编译程序的结构框图
编译原理 31
本章小结
源程序 ( 字符串) 表 格 管 理 代码优化程序 程 目标代码生成程序 序 目标程序
2015/9/26 编译原理 32
词法分析程序
语法分析程序 语义分析和中间代码生成程序



理 程 序
例如 计算圆柱体表面积的程序 片断如下: float r,h,s; s = 2*3.1416 * r *(r+h);
2015/9/26
编译原理
12
1. 词法分析
词法分析阶段的任务是对构成 源程序的字符串从左到右进行扫描 和分解,根据语言的词法规则,识 别出一个一个具有独立意义的单词 ( 也称单词符号, 简称符号 )。
2015/9/26
2, T1, h, T2, T4,
3.1416, r, r, T3, __,
编译原理
T1 ) T2 ) T3 ) T4 ) s)
20
4. 代码优化

第1章编译程序概论

第1章编译程序概论

第1章编译程序概论编译程序是一种将高级语言转化为机器语言的工具。

它是理解和操作计算机的重要组成部分,对于程序员来说至关重要。

本章将介绍编译程序的基本概念和功能,以及编译过程的各个阶段。

编译程序是将高级语言代码转化为低级机器语言代码的工具。

高级语言是以人类易于理解和编写的方式编写的,而机器语言则是计算机理解和执行的方式。

编译程序的作用是将高级语言代码转化为机器语言代码,以便计算机能够理解和执行。

编译程序的主要功能可以分为三个阶段:词法分析、语法分析和代码生成。

词法分析的目标是将源代码分解为一个个的词法单元,如关键字、标识符、常量和运算符等。

语法分析的目标是根据词法单元构建出语法树,以检查源代码的语法正确性。

代码生成的目标是将语法树转化为机器指令或者字节码,以便计算机执行。

编译过程可以进一步细分为以下几个阶段:预处理、编译、汇编和链接。

预处理的目标是对源代码进行处理,如展开宏定义、处理条件指令等。

编译的目标是将预处理后的代码转化为汇编语言代码。

汇编的目标是将汇编语言代码转化为机器语言代码。

链接的目标是将各个编译单元之间的引用解析,并生成可执行文件。

在编译过程中,还会遇到一些常见的错误和警告。

错误是指源代码中的语法错误或语义错误,如拼写错误、语法结构错误等。

警告是指在编译过程中出现的一些潜在的问题,如未使用的变量、未定义的函数等。

程序员需要根据编译器的输出信息对源代码进行修正,以保证代码的正确性和可靠性。

除了编译程序外,还有一种常见的方式将高级语言转化为机器语言,即解释执行。

解释执行是一种逐行解析和执行源代码的方式。

与编译程序不同,解释执行不需要将源代码转化为机器语言,而是在运行时逐行解析和执行。

解释执行的优点是方便调试和修改,但其执行效率相对较低。

总结起来,编译程序是将高级语言转化为机器语言的工具。

它包括词法分析、语法分析和代码生成等功能,并经过预处理、编译、汇编和链接等阶段。

编译过程中会出现一些错误和警告,程序员需要根据输出信息对源代码进行修正。

CH01--编译概述

插入转换符的语法树
total:=total+rate*4 的各分析步骤及其中间结果
total:=total+rate*4
词法分析
id1:=id1+id2* 4
语法分析
:=
id 1
+
id 1
*
id 2
4
语义分析
:=
id 1
+
id 1
*
id 2
inttoreal
4
二、综合阶段
任务:根据所制定的源语言到目标语言的对应关系, 对分析阶段所产生的中间形式进行综合加工,从而 得到与源程序等价的目标程序。
二、翻译程序
翻译程序扫描所输入的源程序,并将其转换为目标 程序,或将源程序直接翻译成结果。
源程序
翻译程序
目标程序或执行结果
编译器(即编译程序):把源程序翻译成目标程序的 翻译器
解释器(即解释程序):直接执行源程序的翻译器
编译程序
源程序是用高级语言或汇编语言编写的,目标程序 是用目标语言表示的。
编译程序的设计涉及到的知识:
–程序设计语言 –形式语言与自动机理论 –计算机体系结构 –数据结构 –算法分析与设计 –操作系统 –软件工程等
1.1 翻译和解释
一、程序设计语言 二、翻译程序
一、程序设计语言
低级语言
–机器语言 –符号语言 汇编语言
高级语言
–过程性语言—面向用户的语言 如:C、Pascal –专用语言—面向问题的语言 如:SQL –面向对象的语言 如:Java、C++
一、分析阶段
任务:根据源语言的定义,对源程序进行结构分析 和语义分析,从而把源程序正文转换为某种内部表 示。

编译原理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.2编译程序的发展

【第1章编译概述】1.2编译程序的发展1.3 编译程序的发展1.编译程序历史编译程序是系统软件中资格最⽼的成员之⼀。

译理论和技术近30年来发展⼗分迅速、成熟现已形成⼀套较为系统化的编译理论和技术2.编译理论与其他课程关系3.编译理论的应⽤编译理论的许多想法和技术可⽤于⼀般软件的设计。

4.翻译程序翻译程序(Translator) 是⼀种程序,其输⼊是某种语⾔的⼀系列语句,⽽其输出则是另⼀语⾔的语句序列。

5.编译程序编译程序(Compiler)是⼀种程序。

它把⽤⾼级语⾔写的源程序作为数据输⼊,经过翻译转换,产⽣⾯向机器的代码作为输出。

这当中代码还可能要由汇编程序或装配程序作进⼀步加⼯,得出⽬标程序,交给计算机执⾏。

6.翻译与编译这种变换程序称为翻译程序编译程序有⼀些限制(针对输⼊、输出)编译过程概述1.编译过程的组成编译过程概述2.词法分析3.语法分析此时可以看出,上述结果符合F 0 R循环语句的语法定义,故语法分析成功完成4.中间代码⽣成5.代码优化6.⽬标代码⽣成三.编译程序的结构1.编译程序总框2.表格与表格管理编译各阶段均须维持表格并进⾏表格管理建表的技术⽀持是数据结构表格的分类、结构、处理⽅法决定于语⾔及机器,还有优化措施编译程序涉及的表格有:符号名表循环表常数表等价名表标号表公⽤链表⼊⼝名表格式表过程引⽤表中间代码表3.出错处理⼀个好的编译程序应该:全⼤限度发现错误准确指出错误的性质和发⽣地点局部化错误的影响限制在尽可能⼩的范围内若能⾃动校正错误则更好,但其代价⾮常⾼源程序中的错误通常分为:语法错误 不符合语法( 或词法)规则的错误【单词拼写错误、括号不匹配】语义错误 不符合语义规则的错误【说明错误、作⽤域错误、类型不匹配】遍 是对源程序或源程序的中间结果从头到尾扫描⼀次,并作有关的加⼯处理,⽣成新的中间结果或⽬标程序。

5.编译前端与后端 编译前端要由与源语⾔有关但与⽬标机⽆关的那些部分组成 编译后端括编译程序中与⽬标机有关的那些部分四、编译程序⽣成1.编译程序的构造⼯具 以往编译程序的构造⼤多采⽤机器语⾔或汇编语⾔ 现在编译程序的构造越来越多采⽤⾼级语⾔有时为了充分发挥效率或满⾜不同需求,仍然采⽤机器语⾔或汇编语⾔构造编译程序(或其核⼼部分)2.构造⼯具 构造编译程序的⼯具称为编译程序产⽣器或翻译程序书写系统⾃动产⽣扫描器 LEX FLEX⾃动产⽣语法分析器 YACC BISON。

第1章-编译概述


解释器
程序规模 规模较大
中小规模
内部形式 机器代码(低级) 数据结构(高级)
运行机构 硬件CPU
软件系统
运行速度 相对较快
相对较慢
2. 编译器的功能分解和组织结构
表处理





































错误处理
2. 编译器的功能分解和组织结构
编译器的前端:一般包括词法分析、语法分析、 符号表构造、语义分析、中间代码生成、代码 优化和错误处理等。此部分工作的特点是不依 赖于具体机器。
编译原理
第一章 编译概述
编译器和解释器 编译器的功能分解和组织结构 编译器的伙伴程序 编译器的实现途径 编译技术的作用
1. 编译器和解释器
程序设计语言的历史 机器语言:能够被计算机的硬件系统直
接执行的指令程序。 汇编语言:将硬件指令用一些助记符表
示。如ADD表示加法操作, SUB表示减法操作等等 高级语言:使用便于理解的自然语言。
移植法
同一语言的编译器在不同机器间的移植。方法:
a 目标代码的转换 b 修改中间代码到目标代码的转换
自展法 工具法 理论法
自我扩展,自己编写自己的编译器。
利用编译阶段各个部分的自动生成工具自动生成。 利用形式化描述理论,实现自动化。
5. 编译技术的作用
理解语言,编写出高效的代码 灵活设计实现自定义语言 提高软件设计技术 应用于涉及元级操作的实现 其它领域
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

add $x, $a, $b Loop: slt $_t1, $y, $z beq $_t1, 1, where_true j where_false where_true: add $y, $x, $y j Loop where_false: …
School of Information and Software Engineering Zhou, Erqiang
6
引言
程序设计语言
编写一个高级语言的编译或解释程序
对该语言的实现
编译还是解释?
Pascal、C/C++、Object-C、Java、C#、Go
编译的:Fortran、Vala 解释的:Python、JavaScript、PHP等
School of Information and Software Engineering
中间代码生成
Loop: if y < z goto where_true; goto where_false; where_true: t1 = a + b; x = t1 t2 = x + y; y = t2 goto Loop; where_false: …
School of Information and Software Engineering Zhou, Erqiang
词法分析 语法分析 语义分析
中间代码生成
中间代码优化 目标代码生成
目标代码优化
18
目标代码生成
while (y < z) { int x = a + b; y += x; }
add $x, $a, $b Loop: slt $_t1, $y, $z beq $_t1, 1, where_true j where_false where_true: add $y, $x, $y j Loop where_false: …
School of Information and Software Engineering Zhou, Erqiang
25
出错处理
为什么需要出错处理? 编译各个阶段都可能发现错误 出错处理的内容 报告错误的性质、位置 尽量缩小范围、查找出更多的错误
School of Information and Software Engineering
sub $s1,$s2,$s3
bne $s4,$s5,Label
$s1 = $s2 – $s3
下一条指令在 Label if $s4 ≠ $s5
beq $s4,$s5,Label
j Label
下一条指令在 Label if $s4 == $s5
下一条指令在 Label
slt: Set on less than
int
int
ห้องสมุดไป่ตู้
int
a b
int
y
Zhou, Erqiang
x
int int
School of Information and Software Engineering
int int
中间代码生成
while (y < z) { int x = a + b; y += x; }
词法分析 语法分析 语义分析
Zhou, Erqiang
26
源程序
词法分析
编 译 器 的 结 构
单词符号串
源程序的分析
语法分析
符 号 表 管 理
语法树
语义分析和中间代码生成
中间代码
优化
出 错 处 理
经优化的中间代码
目标程序的合成
代码生成
目标程序
School of Information and Software Engineering Zhou, Erqiang
blt
School of Information and Software Engineering
词法分析 语法分析 语义分析
中间代码生成
中间代码优化 目标代码生成
目标代码优化
$y, $z, where_true
Zhou, Erqiang
19
关于“绑定”
实体:程序的组成部分 是否要保存实体与属性的绑定信息?
04 AL
05 EAX
School of Information and Software Engineering
imm8
imm16/32
Zhou, Erqiang
3
引言
程序设计语言
机器语言(Machine Code / Machine Language )
难写、难懂
改进:指令符号化 例如:00,01,02,03,05 ==> ADD
名字 属性信息
(key, value) 符号表的实现 线性表、Hash表
School of Information and Software Engineering Zhou, Erqiang
23
符号表
属性域
多个子域及标志位
单词记号:标识符、数字、符号 标识符:变量?函数名?标号? 变量:类型?有初值? 函数:返回类型?参数个数、类型等 标号:标号地址、转移地址
汇编语言
解决了一小部分问题 依然和机器相关,指令级编写、读取 机器不能直接运行
低 级 语 言
汇编程序:汇编语言程序==>机器语言程序
School of Information and Software Engineering Zhou, Erqiang
4
引言 程序设计语言
高级语言
直观、自然、易于理解 易读,易写,易于交流、存档 独立于机器的,易于移植
11
词法分析
T_While T_LeftParentheses T_Identifier y T_Less T_Identifier z T_RightParentheses T_OpenBrace
while (y < z) { int x = a + b; y += x; }
T_Int T_Identifier x T_Assign T_Identifier a T_Plus T_Identifier b T_Semicolon
School of Information and Software Engineering Zhou, Erqiang
词法分析 语法分析 语义分析
中间代码生成
中间代码优化 目标代码生成
目标代码优化
16
目标代码生成
MIPS Instructions add $s1,$s2,$s3 Meaning $s1 = $s2 + $s3
20
符号表
需要检查 变量是否被声明或声明多次 变量在声明前被赋值或被引用 操作符与变量类型兼容 等等 需要数据结构保存实体属性信息 符号表
School of Information and Software Engineering Zhou, Erqiang
int a; b = 1; a = “hello”;
高级语言==>低级语言
编译程序/编译器 解释程序/解释器
School of Information and Software Engineering Zhou, Erqiang
5
引言
源程序 数据
解释器 输出 在线
数据
源程序 编译器 可执行 离线 文件 输出
School of Information and Software Engineering Zhou, Erqiang
2
引言
程序设计语言
机器语言(Machine Code / Machine Language )
能够被CPU直接理解并运行
直接和硬件相关
指令 op1
00 r/m8 01 r/m16/32 02 r8 03 r16/32
op2
r8 r16/32 r/m8 r/m16/32
op1 = op1+op2
指令集
分析 (前端)
中间代码生成
中间代码优化 目标代码生成
目标代码优化
School of Information and Software Engineering Zhou, Erqiang
机器代码
9
编译的步骤 源 程 序
词法分析 语法分析 语义分析
中间代码生成
合成 (后端)
School of Information and Software Engineering
12
语法分析
while 顺序 < y z x = = while (y < z) { int x = a + b; y += x; }
词法分析 语法分析 语义分析
+
中间代码生成 中间代码优化 目标代码生成 目标代码优化
13
+
y
a
School of Information and Software Engineering
中间代码优化 目标代码生成
目标代码优化
15
中间代码优化
while (y < z) { int x = a + b; y += x; } t1 = a + b; x = t1 Loop: if y < z goto where_true; goto where_false; where_true: t1 = a + b; x = t1 t2 = x + y; y = t2 where_false: goto Loop; …
Zhou, Erqiang
7
编译的步骤 源 程 序
相关文档
最新文档