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