编译原理PrinciplesofCompiling大连理工大学软件学院什么是编译器?2019/12/2022019/12/203编译过程--视频2019/12/204空调设为25度词法分析语法分析语义分析识别过程中间代码生成5编译原理课程在计算机科学技术中的地位:程序设计语言离散数学数据结构编译原理操作系统系统软件应用软件软件工程信息系统电子商务6编译理论与方法计算机科学与技术中理论和实践相结合的最好典范ACM图灵奖,授予在计算机技术领域作出突出贡献的科学家•程序设计语言、编译理论与方法约占1/3课程简介7课程内容介绍编译器构造的一般原理和基本实现方法介绍的理论知识:形式语言和自动机理论、语法制导的定义和属性文法、类型论等课程特点强调形式化描述技术强调对编译原理和技术的宏观理解,不把注意力分散到枝节算法,不偏向于某种源语言或目标机器课程简介8if(c==5)then…if(c=5)then…编译器不报错,但实际上错了if(5==c)then…if(5=c)then…编译器报错学习的意义计算机专业的核心课程。深刻的理解编程语言的设计和实现,有利于学习编程语言,知其然知其所以然。课程简介9学习的意义从软件工程看,编译器是一个很好的实例(基本设计、模块划分等),所介绍的概念和技术能应用到一般的软件设计之中。编译器也许是在本科阶段分析最透彻的实例。能了解到软件工程中的一些技术(如基于事件驱动的编程)。大多数程序员同时是语言的设计者,虽然是一些简单的语言(如输入输出),本课程的学习有助于提高对这些语言的设计水平。课程简介10学习的意义可以肯定地说,你们中的95%以上的人在一辈子的生涯中都没有机会去实现一个真正的复杂语言的编译器。但是每一个人都绝对遇到需要使用编译技术的项目。以下就是一些小的“编译器”.课程简介11普通计算器可编程计算器学习的意义课程简介12自动聊天机器人学习的意义课程简介13各种数据库查询语言及专家系统select课程fromtable课程表where任课老师=陈意云学习的意义课程简介14本讲纲要课程简介编译技术概述15编辑器源程序编译器操作系统可执行程序.exe解释器C,C++,Pascal,Delphi,VC,BCEdit,Word,Notepad,Vigcc,vc,bc31虚拟机集成开发环境编译技术研究对象:编译器的构造与分析16BASIC年代的解释器功能:它将高级语言的源程序翻译成一种中间语言程序,然后对中间语言程序进行解释执行在那个年代,编译和解释两个功能是合在一个程序中,该程序被称为解释器Java年代的解释器解释器的上述两个功能分在两个程序中前一个叫做编译器,它把源程序翻译成一种叫做字节码的中间语言程序后一个叫做解释器,它对字节码程序进行解释执行课程简介17第一章引论翻译器:把一种语言变换到另外一种语言的软件。这两种语言分别称为源语言和目标语言。编译器:一种翻译器,它的目标语言比源语言低级。编译器处理的对象:编程语言18编程语言演义编程语言机器语言汇编语言高级语言(Fortran,C,Java,…)19编程语言演义机器语言特点0,1串打卡输入c70600000002•movx,c其中符号x的地址是0000,c=2计算机可以直接理解机器语言程序机器语言缺点可读性差可维护性差机器语言汇编语言高级语言20编程语言演义汇编语言形式movx,2c70600000002变量x的地址可以由汇编器维护,而不需要固定到某个绝对地址机器语言汇编语言高级语言21编程语言演义高级语言形式赋值语句:x=2贴近人类思维方式,贴近实际问题描述形式计算机无法直接理解需要编译器辅助,将其转换为机器语言形式机器语言汇编语言高级语言22编译器功能完成从源语言到目标语言的转换源语言:通常是高级语言(C,Java,…)目标语言:汇编语言,或者其他形式的低级语言(如Java字节码)编译器实现技术已经发展成熟,并且划分为功能相对明确的多个功能模块23词法分析器语法分析器语义分析器源程序中间代码生成器代码优化器代码生成器目标程序出错管理器符号表管理器编译器编译器从逻辑上可以分成若干阶段,每个阶段把源程序从一种表示变换成另一种表示翻译家词法分析语法分析语义分析汉语文本英语文本生成英语文本改进日语文本生成日语文本出错纪录词典第一章引论24第一章引论FORTRAN(FORmulaTRANslation)第一个实用的高级语言擅长于数学函数运算常用于科学计算中第一个编译器历史上第一个实用的编译器(JohnBackus):FortrancompilerfortheIBM704/709/7090/7094JohnBackus,引入了编译器的“阶段”或称为“遍”的概念,是编译设计的模块化的开始25遍编译的几个阶段常用一遍(pass)扫描实现,一遍扫描包括读一个输入文件和写一个输出文件。第一章引论词法分析器语法分析器语义分析器源程序中间代码生成器代码优化器代码生成器目标程序出错管理器符号表管理器26遍类比:刷墙艺术中的“遍”的概念网线水泥瓷砖任务:在一面墙上布置网线,并粉刷水泥,然后贴上瓷砖第一章引论27遍类比:刷墙艺术中的“遍”的概念方法一:第一遍:布上全部网线网线水泥瓷砖第一章引论28遍类比:刷墙艺术中的“遍”的概念方法一:第二遍:粉刷全部墙面的水泥网线水泥瓷砖第一章引论29遍类比:刷墙艺术中的“遍”的概念方法一:第三遍:给整个墙面贴上瓷砖网线水泥瓷砖第一章引论30遍类比:刷墙艺术中的“遍”的概念方法二:一遍:一边布网线,一边粉刷水泥,一边贴瓷砖网线水泥瓷砖第一章引论31遍(趟):一遍或一趟:是指编译程序在编译时刻把源程序或源程序的等价物(中间程序)从头到尾扫描一遍并转换成另一紧邻的等价物的全过程。单遍扫描与多遍扫描:每一遍的扫视可完成上述一个阶段或多个阶段的工作。每一遍的输入都是上一遍的输出,第一遍的输入是源程序正文,最后一遍的输出是目标代码。单遍与多遍的比较:•遍数多:编译器结构清晰,但时间效率不高•遍数少:编译速度快,但对机器的内存要求高遍数的确定:主要因素是源程序和机器(目标机)的特征。第一章引论32符号表positioninitialrate.........123词典你们大工学子.........123词法分析名词1动词形容词名词2你们是优秀的大工学子。词法分析:源程序-〉词法记号(token)流词法分析器id,1=id,2+id,360position=initial+rate60第一章引论33任何一个标识符都是表达式;任何一个数都是表达式;如果e1和e2都是表达式,那么e1+e2e1*e2(e1)也都是表达式表达式表达式表达式标识符表达式表达式(initial)标识符(rate)数(60)*+语法分析:词法记号(token)流-〉语法短语•任何名词都可以作宾语;•如果e1和e2都是宾语,那么e1和e2e1与e2也都可以作宾语•如果e1是定语,e2是宾语,那么e1e2也可以作宾语。宾语定语宾语形容词(优秀的)名词(大工学子)第一章引论34语法分析器id,1=id,2+id,360:=+*60id1id2id3语法分析:词法记号(token)流-〉语法短语名词1动词形容词名词2语法分析(优秀的)名词(大工学子)宾语定语宾语形容词语句谓语动词(是)主语名词(你们)符号表positioninitialrate.........123词典你们大工学子.........123第一章引论35语义分析器:=+*60id1id2id3:=+*60id1id2id3inttoreal语义分析:检查程序的语义正确性,如类型检查等你们是优秀的大工学子你们是一个优秀的大工学子。第一章引论36词法分析器语法分析器语义分析器源程序中间代码生成器代码优化器代码生成器目标程序出错管理器符号表管理器前三个阶段完成对源程序的分析第一章引论37中间代码生成器temp1:=inttoreal(60)temp2:=id3*temp1temp3:=id2+temp2id1:=temp3:=+*60id1id2id3inttoreal(优秀的)名词(大工学子)宾语定语宾语形容词语句谓语动词(是)主语名词(你们)英语文本生成YouaregoodDLUTers.第一章引论38代码优化器temp1:=inttoreal(60)temp2:=id3*temp1temp3:=id2+temp2id1:=temp3temp1:=id3*60.0id1:=id2+temp1YouaregoodDLUTers.英语文本改进YouareexcellentDLUTers第一章引论39temp1:=id3*60.0id1:=id2+temp1代码生成器MOVFid3,R2MULF#60.0,R2MOVFid2,R1ADDFR2,R1MOVFR1,id1日语文本生成YouareexcellentDLUTers君たちは大連理工大学の優秀な学生なんです。第一章引论40词法分析器语法分析器语义分析器源程序中间代码生成器代码优化器代码生成器目标程序出错管理器符号表管理器后三个阶段对源程序进行综合第一章引论41词法分析器语法分析器语义分析器源程序中间代码生成器代码优化器代码生成器目标程序出错管理器符号表管理器第一章引论42词法分析器语法分析器语义分析器源程序中间代码生成器代码优化器代码生成器目标程序出错管理器符号表管理器前端后端前端:依赖于源语言,独立于目标机器。后端:依赖于目标机器,独立于源语言。第一章引论43前端和后端:把编译过程分成前端和后端两部分前端:只依赖于源程序,独立于目标机器(生成中间代码)后端:依赖于目标机器,与源程序无关,只与中间语言有关(从中间代码生成目标代码)好处:提高开发编译器的效率•取一个编译器的前端,重写它的后端以产生同一源语言在另一机器上的编译器•不同的前端使用同一个后端,从而得到一个机器上的几个编译器(采用同一中间语言)第一章引论44源程序目标机器1目标机器2目标机器3目标机器n编译器不区分前端和后端的编译器源程序目标机器1目标机器2目标机器3目标机器n编译器前端编译器后端区分前端和后端的编译器第一章引论45高级语言的实现高级编程语言易于编程,但程序运行较慢低级语言编程时可实施更有效的控制方式,得到更有效的代码,但难编写、易出错、难维护流行编程语言的大多数演变都是朝着提高抽象级别的方向每一轮编程语言新特征的出现都刺激编译器优化的新研究1.2编译器技术的应用46程序翻译二进制翻译编译器技术可用于把一种机器的二进制代码翻译成另一种机器的代码,以运行原先为别的指令集编译的代码数据库查询解释器数据库查询由一些谓词组成,这些谓词由包含关系运算的布尔表达式组成,可以被解释执行,也可以被编译成搜索数据库的命令1.2编译器技术的应用47提高软件开发效率的工具源于编译器中代码优化技术的程序分析一直在改进软件开发效率类型检查类型检查是一种捕捉程序中前后不一致的成熟而有效的技术边界检查数据流分析技术可用来定位缓冲区溢出内存管理自动的内存管理删除内存泄漏等内存管理错误1.2编译器技术的应用48语法制导的结构化编辑器程序格式化工具软件测试工具程序理解工具高级语言的翻译工具等等。编译技术的应用49本讲纲要课程简介编译技术概述50课程简介教材和参考书陈意云、张昱,编译原理,高等教育出版社,2008年第二版陈火旺、刘春林等编著程序设计语言编译原理(第3版),国防工业出版社,2001年4月蒋立源等主编编译原理(第2版),西北工业大学出版社,2002年1月。张素琴,吕映芝等编著编译原理,清华大学出版社,2005年胡伦骏等《编译原理》电子工业出版社2005年51课程简介教材和参考书Compilers:Principles,Techniqu