《《哈工大编译原理》课件.pptx》由会员分享,可在线阅读,更多相关《《哈工大编译原理》课件.pptx(27页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、哈工大编译原理ppt课件目录CONTENTS编译原理概述词法分析语法分析中间代码生成代码优化目标代码生成01编译原理概述编译原理简介编译原理是计算机科学中的一个重要分支,主要研究如何将高级语言程序翻译成低级语言程序,并优化生成的目标程序。编译原理涉及多个领域,如语言学、计算机体系结构、算法等,是一门综合性很强的学科。编译原理的应用非常广泛,如编译器设计、程序分析、软件工程等。编译过程的基本概念源程序用高级语言编写的程序,也称为源代码。目标程序编译后的程序,也称为目标代码或机器代码。编译程序将源程序翻译成目标程序的软件。编译过程将源程序通过词法分析、语法分析、语义分析、中间代码生成、优化、目标代
2、码生成等阶段,最终生成目标程序的过程。词法分析器将源程序分解成一个个的单词或符号,便于语法分析器处理。语法分析器根据语法规则将词法分析器输出的单词或符号组装成语句或表达式。语义分析器对语法分析器输出的语句或表达式进行语义检查,确保其符合语义规则。中间代码生成器将语义分析器输出的结果转换成中间代码。优化器对中间代码进行优化,提高生成的目标程序的性能。目标代码生成器将优化后的中间代码转换成目标程序。编译程序的组成02词法分析词法分析是编译过程中的第一个阶段,主要负责将源程序的字符流分割成一个个单独的单词或符号。词法分析器通常被称为扫描器或词法器,它不关心单词的语法属性,只负责识别和提取单词。词法分
3、析的结果是源程序的一个标记流,这些标记对应于源程序中的关键字、标识符、常数和运算符等。010203词法分析概述01输入源程序的字符流。02输出源程序的标记流。031.初始化设置初始状态和缓冲区。042.循环从缓冲区中取出一个字符,根据当前状态和该字符确定下一个状态和标记。053.输出输出当前标记,并更新状态和缓冲区。064.结束条件当缓冲区为空且所有字符都被处理时,结束词法分析。词法分析过程词法分析的实现工具词法分析器的实现可以使用工具如Lex或Flex,这些工具可以根据正则表达式自动生成词法分析器的代码。状态机词法分析器实际上是一个状态机,根据当前状态和输入字符确定下一个状态和输出的标记。正
4、则表达式在定义词法分析器的规则时,通常使用正则表达式来描述单词的模式。例如,a-zA-Z_a-zA-Z0-9_*可以匹配C语言中的标识符。代码生成使用工具生成的代码通常是C语言代码,需要将其集成到编译器的其他部分中。03语法分析语法分析是编译过程中的重要阶段,其任务是将源程序分解成一系列的语法结构,以便后续的语义分析和代码生成。语法分析的结果是抽象语法树(Abstract Syntax Tree,AST),它是源代码的抽象语法结构的树状表现形式。语法分析方法主要分为自顶向下和自底向上两种。语法分析概述01自顶向下的语法分析是从源程序的顶级结构开始,逐步向下分析。02常用的自顶向下分析算法有预测
5、分析算法和递归下降分析算法。03自顶向下的语法分析方法适合于上下文无关文法的语言,如C、Java等。04该方法的优点是结构清晰,易于理解和实现,但可能存在无法找到最左推导的问题。自顶向下的语法分析01常用的自底向上分析算法有LR(0)、SLR(1)、LALR(2)等。自底向上的语法分析方法适合于处理左递归文法的语言,如Pascal、Fortran等。该方法的优点是能够处理更广泛的文法结构,但实现相对复杂,且可能存在无法找到最右推导的问题。自底向上的语法分析是从源程序的底层结构开始,逐步向上分析。020304自底向上的语法分析04中间代码生成中间代码定义中间代码是源代码和目标代码之间的代码,用于
6、表示源程序的结构和语义。中间代码的作用中间代码作为源代码和目标代码之间的桥梁,有助于提高编译器的可移植性和可维护性。中间代码的形式常见的中间代码形式包括三地址代码、抽象语法树(AST)和静态单赋值形式(SSA)。中间代码生成概述030201三地址代码的特点三地址代码具有简单、直观和易于优化的特点,能够清晰地表示程序中的控制流程和数据流。三地址代码的生成算法常见的三地址代码生成算法包括递归下降分析法和语法制导翻译法。三地址代码定义三地址代码是一种中间代码形式,由一系列的三元式组成,每个三元式包含三个操作数和两个操作符。三地址代码的生成在编译过程中,需要识别出源程序中的循环结构,以便进行正确的中间
7、代码生成。循环结构的识别在循环结构中,有些变量在循环体内被重复计算,可以将这些计算移出循环体外,以提高程序的执行效率。循环不变量的外提循环展开是将循环体中的语句复制多份并依次执行,以减少循环次数,提高程序的执行效率。但是循环展开可能会增加程序的体积和降低程序的局部性。循环展开循环结构的处理05代码优化代码优化概述030201代码优化是指在编译器中,通过一系列的优化技术,对源代码进行优化,以提高生成的目标代码的执行效率。代码优化是编译过程中的一个重要环节,它能够显著提高程序的运行效率,减少程序运行时间,提高用户体验。代码优化可以分为局部优化和全局优化两类。局部优化01局部优化是指对程序中的某一部
8、分进行优化,以提高该部分的执行效率。02常见的局部优化包括常量折叠、常量传播、死代码消除等。局部优化的目的是减少程序中的冗余计算和不必要的操作,提高程序执行效率。03123全局优化是指对整个程序进行优化,以提高程序的总体执行效率。全局优化的目的是通过重新安排程序中的计算顺序、减少数据访问次数、消除无用计算等手段,提高程序的总体执行效率。常见的全局优化包括循环展开、循环不变量代码外提、公共子表达式消除等。全局优化06目标代码生成目标代码生成概述01目标代码生成是编译过程的重要环节,其任务是将中间代码转换成目标机器代码或汇编语言程序。02目标代码生成需要考虑代码优化、指令选择、内存分配等问题,以提
9、高生成代码的执行效率。03目标代码生成器通常采用静态单赋值形式(SSA)表示中间代码,以便进行有效的优化和转换。代码生成器通常由指令选择、控制流优化、循环优化等模块组成。控制流优化模块负责对控制流进行分析和优化,如消除冗余计算、消除无用代码等。指令选择模块负责从中间代码中选择合适的机器指令,并进行指令调度和并行化。循环优化模块负责对循环结构进行优化,如循环展开、循环合并等。代码生成器的构造全局分配策略考虑整个程序的生命周期进行寄存器分配,适用于多线程或多进程环境下的程序。动态分配策略在运行时确定寄存器分配方案,适用于程序执行路径不确定的情况。静态分配策略在编译时确定寄存器分配方案,适用于已知程序执行路径的情况。寄存器分配是目标代码生成中的重要问题之一,其目标是合理地分配寄存器资源,以减少内存访问次数和提高指令执行效率。寄存器分配可以采用静态分配、动态分配和全局分配等多种策略。寄存器分配问题THANKS感谢您的观看