440 likes | 609 Views
编译原理. 西安电子科技大学 计算机学院 田聪 c.tian.xdu@gmail.com ctian@mail.xidian.edu.cn tico_tools@163.com. http://web.xidian.edu.cn/ctian/en/index.html. http://web.xidian.edu.cn/ctian/index.html. 每次课后更新. 教和学两方面互相影响和促进,都得到提高。. 引言. 程序设计语言 C, C++, Java, … 语法有相似处,也有不一样的地方 都属于高级语言 计算机只能识别低级的机器语言.
E N D
编译原理 西安电子科技大学 计算机学院 田聪 c.tian.xdu@gmail.com ctian@mail.xidian.edu.cn tico_tools@163.com
引言 程序设计语言C, C++, Java, … 语法有相似处,也有不一样的地方 都属于高级语言 计算机只能识别低级的机器语言 高级程序设计语言 C C++ Java 处 理 过 程 处 理 过 程 处 理 过 程 处 理 过 程 编译 (解释) 计算机能够识别的语言 6
引言 翻译
引言 高级程序设计语言 C C++ Java 自己的编程 语言MPL 处 理 过 程 处 理 过 程 处 理 过 程 处 理 过 程 处 理 过 程 编译 (解释) 计算机能够识别的语言
引言 编译原理课程目标: 能够自己定义一个程序设计语言 并实现该语言的编译器
引言 介绍编 译器的 原理和 基本实 现方法 10
课程简介 • 相关知识点 • 程序设计基础:程序设计基本结构、算法、数据结构、递归等 • 程序设计语言:程序设计语言概论、虚拟机、语言翻译、声明和类型、抽象机制、面向对象程序设计、函数程序设计、类型系统、程序设计语言的语义等
课程简介 • 效果 • 了解程序设计语言的基本要素、工作原理、语言翻译的基本方法 • 用不同的程序设计语言进行程序设计,即自学计算机语言的能力 • 课程特点 • 提高自学能力 • 理论与实践并重 • 理论基础是相通的,相同的原理可应用于不同的技术 • 注重基础理论学习
课程简介 • 教材 • 刘坚 编译原理基础 西电出版社 • 习题册 • 参考书目 • A. V. Aho, M. S. Lam, R. Sethi, and J. D. Ullman, Compilers: Principles, Techniques, and Tools , 2nd edition, Addison-Wesley, 2007 • 陈意云、张昱,编译原理,高等教育出版社,2008 • Hopcroft等,自动机理论、语言和计算机导论,机械工业出版社(中英文)
课程简介 • 学习方法 • 预习 • 作笔记 • 多思考,勤发问 • 多实践、以用促学 • 合理使用参考解答 • 作业与上机 • 课后作业+随堂练习 • 上机作业:现场验收+上机报告
往届学生报告 编译原理是四大天书中的天书,事实上没有那么恐怖。 第二、三章只要多看书,勤做作业,学好也不难。第四、五章尽管没有涉及算法,但是它与程序的运行方面有很大关系,理解起来比较吃力。 由于平时编程方面的欠缺,对于程序如何组织,如何编写,总感觉无从下手。
程序设计语言的发展 1.1 从面向机器的语言到面向人类的语言(高级语言) 机器语言(0、1序列) 运算很低层:把数据从一个位置移到另一个位置,把两个寄存器中的值相加,比较等… 缺点:编程慢且枯燥、易出错,写出的程序难理解,难修改 汇编语言(机器指令的助记表示+宏指令) 高级语言 Fortran(科学计算),Cobol(商业数据处理),Lisp(符号处理) 很多带有新特性的语言(编程更加自然、容易,功能也更强大) C, C++,Java,C#,Prolog等 16
程序设计语言的设计和编译器紧密相关, 程序设计语言的发展会对 编译器的设计者提出新的要求。
程序设计语言的发展 • 当前有( ? )种程序设计语言 • 几千种! • 对语言的分类也有多种方式 • 通过语言的代来分类 • 第一代:机器语言 • 第二代:汇编语言 • 第三代:高级程序设计语言(Fortran,Cobol, Lisp,C, C++,C#和Java等) • 第四代:特定应用设计的语言(生成报告的NOMAD,数据库查询SQL和文本编排Postscript) • 第五代:基于逻辑和约束的语言(Prolog等)
程序设计语言的发展 • 另一种分类方式 • 强制式(Imperative)语言 • 程序中指明如何完成一个计算任务的语言 • C, C++, C#, Java等 • 声明式(Declarative)语言 • 程序中指明要进行那些计算 • ML, Haskell和Prolog
1.1 从面向机器的语言到面向人类的语言 按范型划分的程序设计语言 Simple Procedural Languages:FORTRAN C Block-Structured Procedural Languages:Pascal Object-Based Languages:Ada C++ Smalltalk Functional Languages:LISP ML Logic Programming Languages:Prolog 20
1.1 从面向机器的语言到面向人类的语言 CC2002-PL 过程式语言、面向对象语言:通用程序设计语言,如FORTRAN、Pascal、C/C++、Ada83/Ada95、Java等; 函数语言:面向特点领域的、递归特性,如Lisp; 说明性、非算法式语言:浓厚的数学特征,如LEX/YACC、SQL等; 脚本式语言:仅是一种安排,没有复杂的逻辑关系,如shell语言,XML等。 其他面向特定应用领域的语言 计算机辅助设计:MATLAB 集成电路设计:VHDL、Verilog 虚拟现实与人机交互:VRML …… 21
程序设计语言的发展 • 计算机语言举例 [例1]通用程序设计语言与汇编语言(包括机器指令) Pascal语句: x := a+b; C++语句: x = a+b; 汇编指令: 十六进制代码汇编指令 A10002 MOV AX, [A] 8B1E0202 MOV BX, [B] 01D8 ADD AX, BX A30402 MOV [X], AX
程序设计语言的发展 [例2]SQL:查询003号学生所选课程与成绩 SELECT 学号, 姓名, 课程名, 成绩 FROM 学生, 选课 WHERE 学生.学号="003";
程序设计语言的发展 [例3] Lex和Yacc Lex的正规式:char(char|digit)* return id Yacc的产生式:E : E '+' E | E '*' E | id [例4]Unix的shell命令 SHELL=/bin/sh # include env_precomp.mk CPDIR = /u/pbsrc/chp ORAHOME = /oracle/app/oracle/product/734 .....
现阶段编译器的挑战: 多核并发程序设计 (如何充分利用计算机硬件资源)
1.2 语言之间的翻译 习惯称法 • 汇编语言-机器指令:汇编(或交叉汇编) • 程序设计语言-汇编语言或机器指令:编译(或解释) • 高级语言之间:转换(或预编译) • 逆向:反汇编、反编译
编译器 源程序 目标程序 源程序 解释器 输出 输入数据 目标程序 输入数据 输出 编译器 目标程序 P P 解释器 x=3 目标程序 3 x=3 3 1.3 编译器与解释器 • 语言翻译的两种基本形态 先翻译后执行 边翻译边执行 [例5]假设有源程序P:x=3;
编译器 源程序 目标程序 源程序 解释器 输出 输入数据 目标程序 输入数据 输出 1.3 编译器与解释器 • 特点 • 编译器:工作效率高,即时间快、省空间;交互性与动态特性差、可移植性差。被大多数PL的翻译所采用; • 解释器:工作效率低,即时间慢、费空间;交互性与动态特性好、可移植性好。早期的Basic和现在的Java等。 • 基本功能:二者相同; • 采用技术:从翻译的角度来讲,两种方式所涉及的原理、方法、技术相似。
1.4 编译器的工作原理与基本组成 • 通用程序设计语言的主要成份 • 从语言抽象的演变看: 过程→抽象数据类型(ADT,程序包)→ 类 • 共同特点:两大部分组成,声明+操作=完整定义 • 以过程式语言为例: • 声明性语句:提供操作对象的性质,如数据类型、值、作用域等; • 操作性语句:确定操作的计算次序,完成实际操作。 • 过程头+过程体=过程定义 • 编译器对两类语句的翻译: • 声明:生成相应的环境,一般是配置存储空间; • 操作:生成可执行的代码序列。
1.4 编译器的工作原理与基本组成 [例6] 一Pascal的过程如下: (1) procedure sample(y: integer); {过程头} (2) var x : integer; {过程体(开始)} (3) begin x := y; (4) if x>100 then x := 0 (5) end; {过程体(结束)} (1):声明,提供调用信息,如过程名、参数、返回值等。(接口) (2)至(5):过程体,可含声明或操作。(实现)。 编译器对声明性语句的处理一般是生成相应的环境(存储空间),对操作性语句则是生成此环境中的可执行代码序列。 为便于编译器的处理,操作性语句中使用的每个操作对象,均应在使用前声明,即符合先声明后引用的原则。
1.4 编译器的工作原理与基本组成 • 以阶段划分编译器 • 自然语言的翻译过程: • 识别单词 • 识别句子结构 • 理解意思 • 译成中文并修饰 • 编译器的工作过程: • 词法分析 • 语法分析 • 语义分析 • 目标代码生成 • 编译器的阶段(逻辑模块) • 中间代码的重要作用
1.4 编译器的工作原理与基本组成 C语言赋值语句: position = initial + rate 60
C语言赋值语句: position = initial + rate 60 符 号 表 . . . 1 position . . . 2 initial . . . 词法分析器 3 rate id, 1=id, 2+id, 360 1.4 编译器的工作原理与基本组成 字符流 记号流 词法分析:扫描构成源程序的字符流,按词法规则把它们组成记号流
1.4 编译器的工作原理与基本组成 • 记号是一个二元组: <记号名,属性值> • 记号名是同类词法单元公用的名称 • 属性值是一个词法单元有别于同类词法单元的特征值
position = initial + rate 60 符 号 表 . . . 1 position . . . 2 initial . . . 词法分析器 3 rate id, 1=id, 2+id, 360 1.4 编译器的工作原理与基本组成 • 标识符position形成的记号是<id, 1> • id是标识符的总称 • 1代表position在符号表中的条目 • 符号表的条目用来存放标示符的各种属性 • 赋值号=形成的记号是<assign> • 该记号只有一个实例,不需要属性值来区分实例 • 为了直观,记作<=> • 标识符initial形成的记号是<id,2> • 加号形成的记号是<+> • 标识符rate形成的记号是<id,3> • 乘号*形成的记号是<*> • 60形成的记号是<60>
id, 1=id, 2+id, 360 语法分析器 语法树 1.4 编译器的工作原理与基本组成 语法分析按照语言的语法规则检测词法分析输出的记号流是否符合语法规则,并用树的形式描述该记号流的语法结构 记号流
id, 1=id, 2+id, 3 60 符 号 表 . . . 1 position 语法分析器 . . . 2 initial . . . 3 rate = + id, 1 id, 2 60 id, 3 1.4 编译器的工作原理与基本组成 记号流 语法树
1.4 编译器的工作原理与基本组成 语义分析阶段使用语法树和符号表中的信息, 依据语言定义检测源程序的语义一致性,以保 证程序各部分能有意义地结合在一起。 • 语义分析的一个重要内容是类型检查 例如:当实数作为数组下标时,编译器报错 • 运算类型隐式转换 例如:算数运算作用于一个整数和一个实数时, 编译器会把其中的整数转换为实数
符 号 表 . . . 1 position . . . 2 initial 语义分析器 . . . 3 rate = = + + id, 1 id, 1 id, 2 id, 2 60 inttofloat id, 3 id, 3 60 1.4 编译器的工作原理与基本组成 语法树 语法树
1.4 编译器的工作原理与基本组成 • 中间表示需要具备的性质:易于产生,易于翻译成目标程序 • 三地址代码(常用的中间表示) • 三地址代码由三地址指令序列组成,每条指令最多有三个操作数 中间代码生成:将源程序表示为更低级的显式中间表示
= + id, 1 id, 2 符 号 表 inttofloat id, 3 . . . 1 position . . . 60 2 initial 中间代码生成器 . . . 3 rate t1 = inttofloat(60) t2 = id3 t1 t3 = id2 + t2 id1 = t3 1.4 编译器的工作原理与基本组成 语法树 三地址中间代码
t1 = inttofloat(60) t2 = id3 t1 t3 = id2 + t2 id1 = t3 符 号 表 . . . 1 position . . . 2 initial . . . 3 rate 代码优化器 t1 = id3 * 60.0 id1 = id2 + t1 1.4 编译器的工作原理与基本组成 代码优化:试图改进中间代码,以便产生较好 的目标代码 三地址中间代码 三地址中间代码
t1 = id3 * 60.0 id1 = id2 + t1 符 号 表 . . . 1 position 代码生成器 . . . 2 initial . . . 3 rate MOVF id3, R2 MULF #60.0, R2 MOVF id2, R1 ADDF R2, R1 MOVF R1, id1 1.4 编译器的工作原理与基本组成 代码生成:把中间代码映射到目标程序 三地址中间代码 汇编代码
作业 • 解释下列名词 • 源语言、目标语言、翻译器、编译器、解释器 • 典型的编译器可以划分成几个主要的阶段?各阶段的功能是什么?