《编译原理课程设计报告一个的编译器_计算机-C++资料.pdf》由会员分享,可在线阅读,更多相关《编译原理课程设计报告一个的编译器_计算机-C++资料.pdf(93页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、-word.zl-编译原理程序设计报告 一个简单文法的编译器的设计与实现 专业班级:计算机 1406班 组长姓名:宋世波 组长学号:20143753 指导教师:肖桐 2016年 12月-word.zl-设计分工 组长学号及姓名:宋世波 20143753 分工:文法及数据构造设计 词法分析 语法分析LL1 基于 DAG 的中间代码优化 局部目标代码生成 组员 1 学号及姓名:黄润华 20143740 分工:中间代码生成(LR0)局部目标代码生成 肖桐年月设计分工组长学号及姓名宋世波分工文法及数据构造设计词法分析语法分析基于的中间代码优化局部目标代码生成组员学号及姓名黄润华分工中间代码生成局部目标
2、代码生成组员学号及姓名孙何奇分工符号表组织局部目标编译是从源代码通常为高阶语言到能直接被计算机或虚拟机执行的目标代码通常为低阶语言或机器语言的翻译过程一编译器的概述编译器的概念编译器是将便于人编写阅读维护的高级计算机语言翻译为计算机能解读运行的低阶机器那么是汇编语言或目标机器的目标代码有时也称作机器代码编译器的种类编译器可以生成用来在与编译器本身所在的计算机和操作系统平台一样的环境下运行的目标代码这种编译器又叫做本地编译器另外编译器也可以生成用来在其-word.zl-组员 2 学号及姓名:孙何奇 20143754 分工:符号表组织 局部目标代码生成 摘要 编译器是将便于人编写,阅读,维护的高级
3、计算机语言翻译为计算机能解读、运行的低阶机器语言的程序。编译是从源代码通常为高阶语言到能直接被计算机或虚拟机执行的目标代码通常为低阶语言或机器语言的翻译过程。一编译器的概述 1.编译器的概念 编译器是将便于人编写,阅读,维护的高级计算机语言翻译为计算机能解读、运行的低阶机器语言的程序。编译器将原始程序作为输入,翻译产生使用目标语言的等价程序。源代码一般为高阶语言如 Pascal、C+、Java 等,而目标语言那么是汇编语言或目标机器的目标代码,有时也称作机器代码。肖桐年月设计分工组长学号及姓名宋世波分工文法及数据构造设计词法分析语法分析基于的中间代码优化局部目标代码生成组员学号及姓名黄润华分工
4、中间代码生成局部目标代码生成组员学号及姓名孙何奇分工符号表组织局部目标编译是从源代码通常为高阶语言到能直接被计算机或虚拟机执行的目标代码通常为低阶语言或机器语言的翻译过程一编译器的概述编译器的概念编译器是将便于人编写阅读维护的高级计算机语言翻译为计算机能解读运行的低阶机器那么是汇编语言或目标机器的目标代码有时也称作机器代码编译器的种类编译器可以生成用来在与编译器本身所在的计算机和操作系统平台一样的环境下运行的目标代码这种编译器又叫做本地编译器另外编译器也可以生成用来在其-word.zl-2编译器的种类 编译器可以生成用来在与编译器本身所在的计算机和操作系统平台一样的环境下运行的目标代码,这种编
5、译器又叫做“本地编译器。另外,编译器也可以生成用来在其它平台上运行的目标代码,这种编译器又叫做穿插编译器。穿插编译器在生成新的硬件平台时非常有用。“源码到源码编译器是指用一种高阶语言作为输入,输出也是高阶语言的编译器。例如:自动并行化编译器经常采用一种高阶语言作为输入,转换其中的代码,并用并行代码注释对它进展注释如 OpenMP或者用语言构造进展注释如FORTRAN 的 DOALL 指令。3.本编译器概述 编译程序的工作过程一般可以分为五个阶段:词法分析、语法分析、语义分析与中间代码产生、优化、目标代码生成。每一个阶段在功能上是相对独立的,它一方面从上一个阶段获取分析的结果来进展分析,另一方面
6、由将结果传递给下一个阶段。由编译程序的五个阶段就对应了编译系统的构造,这五个对应阶段分为编译器的前段,中间代码以及后端。其中词法分析器利用超前搜索、状态转换等方法,将源程序转化成为一个一个的单词符号二元式。一般程序语言的单词符号包括关键字、肖桐年月设计分工组长学号及姓名宋世波分工文法及数据构造设计词法分析语法分析基于的中间代码优化局部目标代码生成组员学号及姓名黄润华分工中间代码生成局部目标代码生成组员学号及姓名孙何奇分工符号表组织局部目标编译是从源代码通常为高阶语言到能直接被计算机或虚拟机执行的目标代码通常为低阶语言或机器语言的翻译过程一编译器的概述编译器的概念编译器是将便于人编写阅读维护的高
7、级计算机语言翻译为计算机能解读运行的低阶机器那么是汇编语言或目标机器的目标代码有时也称作机器代码编译器的种类编译器可以生成用来在与编译器本身所在的计算机和操作系统平台一样的环境下运行的目标代码这种编译器又叫做本地编译器另外编译器也可以生成用来在其-word.zl-运算符、常数、标识符和界符。语法分析器将这些单词符号作为输入,对它进展语法分析。语法分析采用 LL1 分析法,语法分析器把语法单元作为输入供语义分析器使用。在语法分析的同时进展语法分析,并产生一定的语义动作,来生成中间代码。优化和目标代码生成是针对某一种处理器而言的。代码优化是将语义分析生成的中间代码进展优化,产生执行效率更高的代码。
8、目标代码生成最终生成可以在某种机器上运行的机器语言或者汇编语言。还要有符号表可供查询。在整个编译过程中还包括对表格的操作和对错误的处理,这些也都是非常重要的环节。环境:编译器整体全部使用visual studio2015编写 目标代码在 8086指令集机器上运行 关键词:编译原理,前端,中间代码生成,后端,目录 设计分工 2 肖桐年月设计分工组长学号及姓名宋世波分工文法及数据构造设计词法分析语法分析基于的中间代码优化局部目标代码生成组员学号及姓名黄润华分工中间代码生成局部目标代码生成组员学号及姓名孙何奇分工符号表组织局部目标编译是从源代码通常为高阶语言到能直接被计算机或虚拟机执行的目标代码通常
9、为低阶语言或机器语言的翻译过程一编译器的概述编译器的概念编译器是将便于人编写阅读维护的高级计算机语言翻译为计算机能解读运行的低阶机器那么是汇编语言或目标机器的目标代码有时也称作机器代码编译器的种类编译器可以生成用来在与编译器本身所在的计算机和操作系统平台一样的环境下运行的目标代码这种编译器又叫做本地编译器另外编译器也可以生成用来在其-word.zl-摘要 3 1.概述 9 2.课程设计任务及要求 12 2.1 设计任务 12 2.2 设计要求 13 2.3设计的文法构造 15 3.算法及数据构造 22 3.1 算法的总体思想流程22 3.2 词法分析器模块 24 3.2.1 功能 24 3.2
10、.2 数据构造 25 3.2.3 流程图 26 3.2.4 算法 27 3.2.5 运行截图 30 3.3 语法分析器模块 30 3.3.1 功能 30 3.3.2 数据构造 31 3.3.3 流程图 33 肖桐年月设计分工组长学号及姓名宋世波分工文法及数据构造设计词法分析语法分析基于的中间代码优化局部目标代码生成组员学号及姓名黄润华分工中间代码生成局部目标代码生成组员学号及姓名孙何奇分工符号表组织局部目标编译是从源代码通常为高阶语言到能直接被计算机或虚拟机执行的目标代码通常为低阶语言或机器语言的翻译过程一编译器的概述编译器的概念编译器是将便于人编写阅读维护的高级计算机语言翻译为计算机能解读运
11、行的低阶机器那么是汇编语言或目标机器的目标代码有时也称作机器代码编译器的种类编译器可以生成用来在与编译器本身所在的计算机和操作系统平台一样的环境下运行的目标代码这种编译器又叫做本地编译器另外编译器也可以生成用来在其-word.zl-3.3.4 算法 34 3.3.5 运行截图 46 3.4符号表生成模块 47 3.4.1 功能 47 3.4.2 数据构造 49 3.4.3 流程图 52 3.4.4 算法 53 3.4.5 运行截图 54 3.5中间代码生成模块 55 3.5.1 功能 55 3.5.2 数据构造 56 3.5.3 流程图 59 3.5.4 算法 59 3.5.5 运行截图 60
12、 3.6中间代码优化模块 61 3.6.1 功能 61 3.6.2 数据构造 62 3.6.3 流程图 63 肖桐年月设计分工组长学号及姓名宋世波分工文法及数据构造设计词法分析语法分析基于的中间代码优化局部目标代码生成组员学号及姓名黄润华分工中间代码生成局部目标代码生成组员学号及姓名孙何奇分工符号表组织局部目标编译是从源代码通常为高阶语言到能直接被计算机或虚拟机执行的目标代码通常为低阶语言或机器语言的翻译过程一编译器的概述编译器的概念编译器是将便于人编写阅读维护的高级计算机语言翻译为计算机能解读运行的低阶机器那么是汇编语言或目标机器的目标代码有时也称作机器代码编译器的种类编译器可以生成用来在与
13、编译器本身所在的计算机和操作系统平台一样的环境下运行的目标代码这种编译器又叫做本地编译器另外编译器也可以生成用来在其-word.zl-3.6.4 算法 64 3.6.5运行截图 67 3.7目标代码生成模块 68 3.7.1 功能 68 3.7.2 数据构造 69 3.7.3 流程图 69 3.7.4 算法 70 3.7.5 运行截图 74 这里不得不提到目标代码生成中存在的一些问题,74 4.程序设计与实现 78 4.1 程序说明 78 4.2 实验结果 82 5.结论 84 5.1组长:宋世波 84 5.2组员:孙何奇 86 5.3组员:黄润华 86 6.收获、体会和建议。88 6.1组长
14、:宋世波 88 肖桐年月设计分工组长学号及姓名宋世波分工文法及数据构造设计词法分析语法分析基于的中间代码优化局部目标代码生成组员学号及姓名黄润华分工中间代码生成局部目标代码生成组员学号及姓名孙何奇分工符号表组织局部目标编译是从源代码通常为高阶语言到能直接被计算机或虚拟机执行的目标代码通常为低阶语言或机器语言的翻译过程一编译器的概述编译器的概念编译器是将便于人编写阅读维护的高级计算机语言翻译为计算机能解读运行的低阶机器那么是汇编语言或目标机器的目标代码有时也称作机器代码编译器的种类编译器可以生成用来在与编译器本身所在的计算机和操作系统平台一样的环境下运行的目标代码这种编译器又叫做本地编译器另外编
15、译器也可以生成用来在其-word.zl-6.2组员:孙何奇 89 6.3组员:黄润华 90 7.附录 92 源代码:92 7.1可执行文件链接 92 8、参考文献 93 1.概述 本程序实现的数据类型有整型 int、浮点型 float、char 字符型、字符串型 string,同时在最后的目标代码生成局部允许出现布尔 bool类型,实现的操作有 if,else 以及 while 循环,和输入输出语句,能做到直接生成目标代码并运行。做到了类型检查和重定义的判断,同时也有肖桐年月设计分工组长学号及姓名宋世波分工文法及数据构造设计词法分析语法分析基于的中间代码优化局部目标代码生成组员学号及姓名黄润华
16、分工中间代码生成局部目标代码生成组员学号及姓名孙何奇分工符号表组织局部目标编译是从源代码通常为高阶语言到能直接被计算机或虚拟机执行的目标代码通常为低阶语言或机器语言的翻译过程一编译器的概述编译器的概念编译器是将便于人编写阅读维护的高级计算机语言翻译为计算机能解读运行的低阶机器那么是汇编语言或目标机器的目标代码有时也称作机器代码编译器的种类编译器可以生成用来在与编译器本身所在的计算机和操作系统平台一样的环境下运行的目标代码这种编译器又叫做本地编译器另外编译器也可以生成用来在其-word.zl-优化局部。词法分析局部构建得到的词法序列为二元式,二元式由两局部组成,其种别码和类型组成,其中关键字和界
17、符记录其数字,用到时只需查其对应的关键字表和界符表即可,而字符类型、字符串类型、数字类型、以及标识符类型的值一律用字符串存储,其中数字类型存储时对其使用atoi 和 itoa 函数进展数字转字符串即可,要使用到其数字时只需要将对其使用字符串转数字函数再获得即可。语法分析局部采用的是 LL1 分析方法,这是一种自上而下的语法分析法,又称为预测分析法,语法分析器局部实现了自动求 first 集合和follow 集合,采用的是递归程序获得 select集合,在实现对产生式完全扫描以后,便可以获得一张完整的分析表,表中标注了是否为预测以及对应的产生式序列,而后进展语法分析,通过于获得的分析表进展比对,
18、进展入栈出栈,匹配到一样的那么认为匹配成果,当文法匹配成功,同时单词也匹配成功的时候,认为语法分析完成,语法无错误,否那么报错。在符号表生成局部,程序对获取的单词序列中的标识符进展再分析,确定每一个标识符的存储范围,同时从此之中获取函数的参数表,函数表局部,构建出编译器全局可用的活动记录表,以供目标代码生成使用,肖桐年月设计分工组长学号及姓名宋世波分工文法及数据构造设计词法分析语法分析基于的中间代码优化局部目标代码生成组员学号及姓名黄润华分工中间代码生成局部目标代码生成组员学号及姓名孙何奇分工符号表组织局部目标编译是从源代码通常为高阶语言到能直接被计算机或虚拟机执行的目标代码通常为低阶语言或机
19、器语言的翻译过程一编译器的概述编译器的概念编译器是将便于人编写阅读维护的高级计算机语言翻译为计算机能解读运行的低阶机器那么是汇编语言或目标机器的目标代码有时也称作机器代码编译器的种类编译器可以生成用来在与编译器本身所在的计算机和操作系统平台一样的环境下运行的目标代码这种编译器又叫做本地编译器另外编译器也可以生成用来在其-word.zl-同时也为编译器增添新内容做准备。中间代码生成局部,在此之前需注意到,由于再语法分析局部已经生成了一个具体可理解的动作序列,所以中间代码生成局部的所用方法并非语法制导,其本身也与语法分析相割裂开来,中间代码生成采取的是自底向上进展分析,不过是基于单词序列进展的分析
20、,其操作等于是使用已获得的伪动作序列,与源程序去作比较,找出伪动作序列的实际含义,将其顺序填好,最后便完成了整个中间代码四元式的生成,并将其重新输出到文件中。中间代码优化局部是对填装完毕的中间代码的再处理,也就是减少无用式子,给目标代码的生成提供便利,先进展根本块划分,而后采取的是 DAG 图优化,即无环有向图优化,顺序是构建 DAG 图无环有向图,减少无用分支,或删改局部同义分支,完成 DAG 图改造后便又重新由树组装四元式,组装好的四元式又再次重新输出到文件中。目标代码生成局部较长,也并不仅仅包含目标代码生成局部,在这个局部文件中,同时需要对前述获得的符号表,中间代码进展再处理,以得到符号
21、目标代码生成所用的符号表和中间代码,再进展预处理完成之后,具体为根据四元式动作,按顺序依次生成目标代码,需要依据不同的四元式动作每个采取不同的操作方法,生成相应目标代码。肖桐年月设计分工组长学号及姓名宋世波分工文法及数据构造设计词法分析语法分析基于的中间代码优化局部目标代码生成组员学号及姓名黄润华分工中间代码生成局部目标代码生成组员学号及姓名孙何奇分工符号表组织局部目标编译是从源代码通常为高阶语言到能直接被计算机或虚拟机执行的目标代码通常为低阶语言或机器语言的翻译过程一编译器的概述编译器的概念编译器是将便于人编写阅读维护的高级计算机语言翻译为计算机能解读运行的低阶机器那么是汇编语言或目标机器的
22、目标代码有时也称作机器代码编译器的种类编译器可以生成用来在与编译器本身所在的计算机和操作系统平台一样的环境下运行的目标代码这种编译器又叫做本地编译器另外编译器也可以生成用来在其-word.zl-测试局部采用的 emu8086软件,这个软件支持的指令集为 8086指令集,由于 64位机器上对汇编的支持并不算好,所以在 8086机上最后进展的是对目标代码的正确性检验以及运行,运行通过且符合源程序实际操作即认为编译器任务完成。2.课程设计任务及要求 2.1 设计任务 1.一个简单文法的编译器前端的设计与实现 定义一个简单程序设计语言文法包括变量说明语句、算术运算表达式、赋值语句;扩展包括逻辑运算表达
23、式、If 语句、While语句等;扫描器设计实现;语法分析器设计实现;中间代码设计;中间代码生成器设计实现。2.难度相当的自选题目,如:一个简单文法的编译器后端的设计与实现。肖桐年月设计分工组长学号及姓名宋世波分工文法及数据构造设计词法分析语法分析基于的中间代码优化局部目标代码生成组员学号及姓名黄润华分工中间代码生成局部目标代码生成组员学号及姓名孙何奇分工符号表组织局部目标编译是从源代码通常为高阶语言到能直接被计算机或虚拟机执行的目标代码通常为低阶语言或机器语言的翻译过程一编译器的概述编译器的概念编译器是将便于人编写阅读维护的高级计算机语言翻译为计算机能解读运行的低阶机器那么是汇编语言或目标机
24、器的目标代码有时也称作机器代码编译器的种类编译器可以生成用来在与编译器本身所在的计算机和操作系统平台一样的环境下运行的目标代码这种编译器又叫做本地编译器另外编译器也可以生成用来在其-word.zl-一个简单文法的编译器的设计与实现。自选一个感兴趣的与编译原理有关的问题加以实现 以下为本组选择局部:一个简单文法的编译器的设计与实现。1.定义一个简单程序设计语言文法包括变量说明语句、算术运算表达式、赋值语句;扩展包括逻辑运算表达式、If 语句、While语句等;2.扫描器设计实现 3.语法分析器设计实现;4.符号表设计 5.符号表生成器设计实现 6.中间代码设计;7.中间代码生成器设计实现。8.中
25、间代码优化 9.中间代码优化实现 10.目标代码设计 11.目标代码生成器设计实现 2.2 设计要求 肖桐年月设计分工组长学号及姓名宋世波分工文法及数据构造设计词法分析语法分析基于的中间代码优化局部目标代码生成组员学号及姓名黄润华分工中间代码生成局部目标代码生成组员学号及姓名孙何奇分工符号表组织局部目标编译是从源代码通常为高阶语言到能直接被计算机或虚拟机执行的目标代码通常为低阶语言或机器语言的翻译过程一编译器的概述编译器的概念编译器是将便于人编写阅读维护的高级计算机语言翻译为计算机能解读运行的低阶机器那么是汇编语言或目标机器的目标代码有时也称作机器代码编译器的种类编译器可以生成用来在与编译器本
26、身所在的计算机和操作系统平台一样的环境下运行的目标代码这种编译器又叫做本地编译器另外编译器也可以生成用来在其-word.zl-1、在深入理解编译原理根本原理的根底上,对于选定的题目,以小组为单位,先确定设计方案;2、设计系统的数据构造和程序构造,设计每个模块的处理流程。要求设计合理;3、编程序实现系统,要求实现可视化的运行界面,界面应清楚地反映出系统的运行结果;4、确定测试方案,选择测试用例,对系统进展测试;5、运行系统并要通过验收,讲解运行结果,说明系统的特色和创新之处,并答复指导教师的提问;6、提交课程设计报告。以下为本组设计要求:给出一个源程序文件,作为编译器前端的输入,输出相关编译阶段
27、的运行结果。词法分析阶段:Token 序列;关键字表、界符表、符号表系统。语法分析阶段:LL1 型产生式、分析表、语法分析所用栈 符号表生成阶段:符号表系统 中间代码生成阶段:四元式序列;符号表系统。中间代码优化阶段:四元式序列、DAG 图、优化完成的四元式序列 目标代码生成阶段:符号表系统、四元式序列、目标代码(8086指令集)肖桐年月设计分工组长学号及姓名宋世波分工文法及数据构造设计词法分析语法分析基于的中间代码优化局部目标代码生成组员学号及姓名黄润华分工中间代码生成局部目标代码生成组员学号及姓名孙何奇分工符号表组织局部目标编译是从源代码通常为高阶语言到能直接被计算机或虚拟机执行的目标代码
28、通常为低阶语言或机器语言的翻译过程一编译器的概述编译器的概念编译器是将便于人编写阅读维护的高级计算机语言翻译为计算机能解读运行的低阶机器那么是汇编语言或目标机器的目标代码有时也称作机器代码编译器的种类编译器可以生成用来在与编译器本身所在的计算机和操作系统平台一样的环境下运行的目标代码这种编译器又叫做本地编译器另外编译器也可以生成用来在其-word.zl-2.3设计的文法构造 产生式中文对照:1.-()2.-int|float|char|void|$3.-()|4.-5.-6.-*|/|$7.-+|-|$8.-|$9.-|10.-=|$11.-12.-,|$13.-14.-|$15.-;16.-
29、|$17.-18.-=;|();19.-20.-,|$21.-|22.-while()23.-24.-|=|=|=25.-if()26.-else|$27.-return ;28.-cout;|cout;|cout ;29.-cin;产生式如下:funcdef%type&id&(¶state&)&funcblocktype%int|float|char|void肖桐年月设计分工组长学号及姓名宋世波分工文法及数据构造设计词法分析语法分析基于的中间代码优化局部目标代码生成组员学号及姓名黄润华分工中间代码生成局部目标代码生成组员学号及姓名孙何奇分工符号表组织局部目标编译是从源代码通常
30、为高阶语言到能直接被计算机或虚拟机执行的目标代码通常为低阶语言或机器语言的翻译过程一编译器的概述编译器的概念编译器是将便于人编写阅读维护的高级计算机语言翻译为计算机能解读运行的低阶机器那么是汇编语言或目标机器的目标代码有时也称作机器代码编译器的种类编译器可以生成用来在与编译器本身所在的计算机和操作系统平台一样的环境下运行的目标代码这种编译器又叫做本地编译器另外编译器也可以生成用来在其-word.zl-factor%(&exp&)|id|number|chexp%divi&itemdivi%factor&faccyclefaccycle%*&factor&faccycle|/&fac
31、tor&faccycle|$item%+&divi&item|-&divi&item|$parastate%state&stateclo|$state%type&id&init|id&initinit%=&rvalue|$rvalue%expstateclo%,&stateclo|$funcblock%staclo&funcbloclostaclo%statement&staclo|$statement%state&;funcbloclo%opera&funcbloclo|whilecycle&funcbloclo|condistate&funcbloc
32、lo|funcend&funcbloclo|coutstate&funcbloclo|cinstate&funcbloclo|$opera%id&callstatecallstate%=&rvalue&;|(¶list&)&;肖桐年月设计分工组长学号及姓名宋世波分工文法及数据构造设计词法分析语法分析基于的中间代码优化局部目标代码生成组员学号及姓名黄润华分工中间代码生成局部目标代码生成组员学号及姓名孙何奇分工符号表组织局部目标编译是从源代码通常为高阶语言到能直接被计算机或虚拟机执行的目标代码通常为低阶语言或机器语言的翻译过程一编译器的概述编译器的概念编译器是将便于人编写阅读维
33、护的高级计算机语言翻译为计算机能解读运行的低阶机器那么是汇编语言或目标机器的目标代码有时也称作机器代码编译器的种类编译器可以生成用来在与编译器本身所在的计算机和操作系统平台一样的环境下运行的目标代码这种编译器又叫做本地编译器另外编译器也可以生成用来在其-word.zl-paralist%para¶cloparaclo%,¶¶clo|$para%id|number|stringwhilecycle%while&(&logicexp&)&do&funcblock&welogicexp%exp&logicopera&explogicopera%|=|=
34、condistate%if&(&logicexp&)&funcblock&nor&ienor%else&funcblock&|$funcend%return&factor&;coutstate%cout&id&;do%$we%$ie%$词法分析序列表:标识符表 i 肖桐年月设计分工组长学号及姓名宋世波分工文法及数据构造设计词法分析语法分析基于的中间代码优化局部目标代码生成组员学号及姓名黄润华分工中间代码生成局部目标代码生成组员学号及姓名孙何奇分工符号表组织局部目标编译是从源代码通常为高阶语言到能直接被计算机或虚拟机执行的目标代码通常为低阶语言或机器语言的翻译过程一编
35、译器的概述编译器的概念编译器是将便于人编写阅读维护的高级计算机语言翻译为计算机能解读运行的低阶机器那么是汇编语言或目标机器的目标代码有时也称作机器代码编译器的种类编译器可以生成用来在与编译器本身所在的计算机和操作系统平台一样的环境下运行的目标代码这种编译器又叫做本地编译器另外编译器也可以生成用来在其-word.zl-常数表 C 关键字表 K Int Float Char String Void If Else Switch Case For Do While Continue 1 2 3 4 5 6 7 8 9 10 11 12 13 肖桐年月设计分工组长学号及姓名宋世波分工文法及数据构造设计
36、词法分析语法分析基于的中间代码优化局部目标代码生成组员学号及姓名黄润华分工中间代码生成局部目标代码生成组员学号及姓名孙何奇分工符号表组织局部目标编译是从源代码通常为高阶语言到能直接被计算机或虚拟机执行的目标代码通常为低阶语言或机器语言的翻译过程一编译器的概述编译器的概念编译器是将便于人编写阅读维护的高级计算机语言翻译为计算机能解读运行的低阶机器那么是汇编语言或目标机器的目标代码有时也称作机器代码编译器的种类编译器可以生成用来在与编译器本身所在的计算机和操作系统平台一样的环境下运行的目标代码这种编译器又叫做本地编译器另外编译器也可以生成用来在其-word.zl-Break Default Siz
37、eof Return Cout Cin 14 15 16 17 18 19 界符表 P=,=,=,i;r=1+1.0;lo=a/d;s=a/d;s=1+a*d;if(a=d)q=a;a=d;d=q;else q=d;d=a;a=q;cout total;while(i10)total=total+i;i=i+1;cout total;cout y;return 0;生成的四元式如下:肖桐年月设计分工组长学号及姓名宋世波分工文法及数据构造设计词法分析语法分析基于的中间代码优化局部目标代码生成组员学号及姓名黄润华分工中间代码生成局部目标代码生成组员学号及姓名孙何奇分工符号表组织局部目标编译是从源代
38、码通常为高阶语言到能直接被计算机或虚拟机执行的目标代码通常为低阶语言或机器语言的翻译过程一编译器的概述编译器的概念编译器是将便于人编写阅读维护的高级计算机语言翻译为计算机能解读运行的低阶机器那么是汇编语言或目标机器的目标代码有时也称作机器代码编译器的种类编译器可以生成用来在与编译器本身所在的计算机和操作系统平台一样的环境下运行的目标代码这种编译器又叫做本地编译器另外编译器也可以生成用来在其-word.zl-=11.000000 0#4 a=2.000000 0#4 d=0.000000 0#4 total=a 1#4 y=1.000000 0#4 k=compiler 3#4 bbc cin#
39、4#4 i=t9 2#4 r+1.000000 0 1.000000 0 t9=t8 2#4 lo/d 2 a 2 t8=t7 2#4 s/d 2 a 2 t7=t6 2#4 s+t5 2 1.000000 0 t6*d 2 a 2 t5 if#4#4 t4=d 2 a 2 t4 肖桐年月设计分工组长学号及姓名宋世波分工文法及数据构造设计词法分析语法分析基于的中间代码优化局部目标代码生成组员学号及姓名黄润华分工中间代码生成局部目标代码生成组员学号及姓名孙何奇分工符号表组织局部目标编译是从源代码通常为高阶语言到能直接被计算机或虚拟机执行的目标代码通常为低阶语言或机器语言的翻译过程一编译器的概述编
40、译器的概念编译器是将便于人编写阅读维护的高级计算机语言翻译为计算机能解读运行的低阶机器那么是汇编语言或目标机器的目标代码有时也称作机器代码编译器的种类编译器可以生成用来在与编译器本身所在的计算机和操作系统平台一样的环境下运行的目标代码这种编译器又叫做本地编译器另外编译器也可以生成用来在其-word.zl-=a 2#4 q=d 2#4 a=q 2#4 d else#4#4#=d 2#4 q=a 2#4 d=q 2#4 a ie#4#4#cout#4#4 total while#4#4 t3 10.000000 0 i 2 t3 do#4#4#=t2 2#4 total+i 2 total 2 t
41、2=t1 2#4 i+1.000000 0 i 2 t1 we#4#4#cout#4#4 total 肖桐年月设计分工组长学号及姓名宋世波分工文法及数据构造设计词法分析语法分析基于的中间代码优化局部目标代码生成组员学号及姓名黄润华分工中间代码生成局部目标代码生成组员学号及姓名孙何奇分工符号表组织局部目标编译是从源代码通常为高阶语言到能直接被计算机或虚拟机执行的目标代码通常为低阶语言或机器语言的翻译过程一编译器的概述编译器的概念编译器是将便于人编写阅读维护的高级计算机语言翻译为计算机能解读运行的低阶机器那么是汇编语言或目标机器的目标代码有时也称作机器代码编译器的种类编译器可以生成用来在与编译器本
42、身所在的计算机和操作系统平台一样的环境下运行的目标代码这种编译器又叫做本地编译器另外编译器也可以生成用来在其-word.zl-cout#4#4 y return#4#4 0.000000#4#4#3.7.5 运行截图 这里不得不提到目标代码生成中存在的一些问题,1.中间代码与目标代码之间并不是严格一一对应的。有可能某条中间代码对应多条目标代码,也有可能多条中间代码对应一条目标代码。肖桐年月设计分工组长学号及姓名宋世波分工文法及数据构造设计词法分析语法分析基于的中间代码优化局部目标代码生成组员学号及姓名黄润华分工中间代码生成局部目标代码生成组员学号及姓名孙何奇分工符号表组织局部目标编译是从源代码
43、通常为高阶语言到能直接被计算机或虚拟机执行的目标代码通常为低阶语言或机器语言的翻译过程一编译器的概述编译器的概念编译器是将便于人编写阅读维护的高级计算机语言翻译为计算机能解读运行的低阶机器那么是汇编语言或目标机器的目标代码有时也称作机器代码编译器的种类编译器可以生成用来在与编译器本身所在的计算机和操作系统平台一样的环境下运行的目标代码这种编译器又叫做本地编译器另外编译器也可以生成用来在其-word.zl-2.中间代码中我们使用了数目不受限的变量和临时变量,但处理器所拥有的存放器数量是有限的。RISC 机器的一大特点就是运算指令的操作数总是从存放器中获得。3.中间代码中我们并没有处理有关函数调用
44、的细节。函数调用在中间代码中被抽象为假设干条 ARG 语句和一条 CALL 语句,但在目标机器上一般不会有专门的器件为我们进展参数传递,我们必须借助于存放器或栈来完成这一点。其中,第一个问题被称为指令选择Instruction Selection问题,第二个问题被称为存放器分配Register Allocation问题,第三个问题那么需要考虑如何对栈进展管理。指令选择可以看成是一个模式匹配问题。无论中间代码是线形还是树形的,我们都需要在其中找到特定的模式,然后将这些模式对应到目标代码上这有点类似于将语法树翻译为中间代码的过程。指令选择可以是简单寻找以一一对应,也可以是涉及到许多细节处理和计算的
45、复杂过程。这取决于中间代码本身蕴含信息的多少,以及目标机器采用的是RISC 还是 CISC 类型的指令集。相对而言,我们所采用的 8086指令集属于处理起来比较复杂的 CISC 指令集,因此指令选择也属于比较困难的任务。肖桐年月设计分工组长学号及姓名宋世波分工文法及数据构造设计词法分析语法分析基于的中间代码优化局部目标代码生成组员学号及姓名黄润华分工中间代码生成局部目标代码生成组员学号及姓名孙何奇分工符号表组织局部目标编译是从源代码通常为高阶语言到能直接被计算机或虚拟机执行的目标代码通常为低阶语言或机器语言的翻译过程一编译器的概述编译器的概念编译器是将便于人编写阅读维护的高级计算机语言翻译为计
46、算机能解读运行的低阶机器那么是汇编语言或目标机器的目标代码有时也称作机器代码编译器的种类编译器可以生成用来在与编译器本身所在的计算机和操作系统平台一样的环境下运行的目标代码这种编译器又叫做本地编译器另外编译器也可以生成用来在其-word.zl-CISC 机器的一个很显著的特点是,除了 load/store 型指令之外,其余指令的所有操作数都并不必须来自存放器。除了数组和构造体必须放到内存中之外,中间代码里的任何一个非零变量或临时变量,都可以对其进展预空间分配。存放器可以说是现代计算机中最珍贵的资源之一。由于存放器的访问性能远高于内存,这使得存放器分配算法对于我们编译出来的目标代码的效率的影响尤
47、其明显。为一段包含单个根本块、只有一种数据类型、访存代价固定的中间代码生成代价最少的存放器分配方案是可以在多项式时间内被计算出来的。在此根底上,几乎添加任何假设如多于一个根本块、多于一种数据类型、使用多级存储模型等都会使得寻找最优存放器分配方案变成一个NP-hard问题 1。因此,目前编译器使用的存放器分配算法大都是近似最优分配方案。朴素存放器分配算法的思想最简单,也最低效:将所有的变量或临时变量都放在内存里。如此一来,每翻译一条中间代码之前我们都需要把要用到的变量先加载到存放器中,得到该代码的计算结果之后又需要将结果写回内存。这种方法确实能将中间代码翻译成可以正常运行的目标代码,而且实现和调
48、试都特别容易,不过它最大的问题是对存放器的利用率实在太低。它不仅闲置了目标机为我们提供的大局部通用存放器,肖桐年月设计分工组长学号及姓名宋世波分工文法及数据构造设计词法分析语法分析基于的中间代码优化局部目标代码生成组员学号及姓名黄润华分工中间代码生成局部目标代码生成组员学号及姓名孙何奇分工符号表组织局部目标编译是从源代码通常为高阶语言到能直接被计算机或虚拟机执行的目标代码通常为低阶语言或机器语言的翻译过程一编译器的概述编译器的概念编译器是将便于人编写阅读维护的高级计算机语言翻译为计算机能解读运行的低阶机器那么是汇编语言或目标机器的目标代码有时也称作机器代码编译器的种类编译器可以生成用来在与编译
49、器本身所在的计算机和操作系统平台一样的环境下运行的目标代码这种编译器又叫做本地编译器另外编译器也可以生成用来在其-word.zl-那些未被闲置的存放器也没有对减少目标代码的访存次数做出任何奉献。完成目标代码生成的第一步是确定指令选择机制以及存放器分配算法。指令选择算法比较简单,其功能甚至可以由中间代码的打印函数稍加修改而得到。存放器分配算法那么需要你先定义一系列数据构造。如果采用了局部存放器分配算法,我们还需要考虑如何实现存放器描述符和变量描述符。如果使用局部存放器分配算法的话,我只需要保存每个存放器是否空闲、每个变量下次被使用到的位置是哪里即可;如果使用课本上介绍的局部存放器分配算法,我需要
50、记录每个存放器中保存了哪些变量,以及每个变量的有效值位于哪个存放器中。肖桐年月设计分工组长学号及姓名宋世波分工文法及数据构造设计词法分析语法分析基于的中间代码优化局部目标代码生成组员学号及姓名黄润华分工中间代码生成局部目标代码生成组员学号及姓名孙何奇分工符号表组织局部目标编译是从源代码通常为高阶语言到能直接被计算机或虚拟机执行的目标代码通常为低阶语言或机器语言的翻译过程一编译器的概述编译器的概念编译器是将便于人编写阅读维护的高级计算机语言翻译为计算机能解读运行的低阶机器那么是汇编语言或目标机器的目标代码有时也称作机器代码编译器的种类编译器可以生成用来在与编译器本身所在的计算机和操作系统平台一样