毕业设计(论文)基于LLVM的编译器的设计与实现1.doc
《毕业设计(论文)基于LLVM的编译器的设计与实现1.doc》由会员分享,可在线阅读,更多相关《毕业设计(论文)基于LLVM的编译器的设计与实现1.doc(106页珍藏版)》请在三一办公上搜索。
1、学士学位论文题目:基于LLVM的编译器的设计与实现设计人: 指导教师:所属系部:计算机科学与技术学院专业班级:计算机082001班2012年 6月 4日太原科技大学毕业设计(论文)任务书学院: 计算机科学与技术学院学 生 姓 名学号200820010114专业班级计算机082001同组人无任务下发时间2012年3月任务完成时间2012年6月设计(论文)题目基于LLVM的编译器的设计与实现设计目的要求高质量应用软件的开发,需要高效的编程语言和编译器的支持。为了加深学生对编程语言和编译器的理解,要求学生设计一个类似C的小源语言,然后利用LLVM实现该语言的编译器。设计主要内容在深刻理解编译原理,掌
2、握文法设计和编译器构造方法,并且熟悉LLVM的基础上,完成编程语言和编译器的设计。主要内容包括:(1) 设计源语言,要求包括变量声明,基本赋值语句,数组访问,条件分支语句,循环语句,函数定义,和函数调用等。(2) 学习LLVM,完成词法分析,语法分析,和语法制导翻译(翻译成LLVM IR)工作,最后利用LLVM实现代码优化和代码生成功能。设计提交资料毕业论文外文资料翻译编译器软件学生签名指导教师签名系主任签名主管院长签名中文摘要开发高性能的应用软件,除了一个良好的软件架构外,还需要高效的编程语言和高质量的编译器的支持。现有语言的改动和新语言的创造,都会带来编译器的开发需求。本文设计了一门新的编
3、程语言leechee,定义了此种语言的文法结构、词法规则,并在linux环境下实现了leechee编程语言的编译器。具体实现方式为首先利用Flex完成词法分析,而后使用Bison完成文法设计、语法分析和语法制导翻译,把源代码翻译成LLVM IR,最后利用LLVM实现代码优化和代码生成功能。关键字:编程语言;编译器;语法制导翻译;LLVM IR;代码优化The Design and Implementation of LLVM based CompilerAuthor: Liang Guanlin Tutor: Liu Aiqin ABSTRACTIn addition to a good so
4、ftware-architecture, the development of high-performance applications also needs the support of an efficient programming language and a high-quality compiler. Changes to existing languages and creation of new languages, will bring the development needs of the compilers.This paper designs a new progr
5、amming language leechee, defines its grammatical structures, lexical rules, and implements its compiler under Linux environment. The specific approach is, first, finishes the scanner with Flex, and then completes the grammar design, parser, syntax directed translation with Bison, implements the tran
6、slation to LLVM IR, and finally use the LLVM to do the code optimization and code generation.Keywords: programming language; compiler; syntax directed translation; LLVM IR; code optimization目录第一章 绪论11.1 什么是编译器11.2 总会有编译器的开发需求11.3 为什么做这个项目2第二章 设计什么样的编译器和语言42.1 做一个什么样的编译器42.1.1 利用LLVM实现一门新语言42.1.2 利用f
7、lex和bison完成词法分析和语法分析52.2 设计一个什么样的语言62.2.1 计算机可以做什么62.2.2 本设计的语言leechee7第三章 相关技术的介绍83.1 Flex83.1.1 Flex输入文件的格式83.2 Bison93.2.1 Bison的语法文件93.2.2 文法规则的语法103.2.3 文法设计需要注意的问题113.3 LLVM123.3.1 LLVM IR123.3.2 LLVM对三段式设计的实现133.3.3 利用LLVM完成代码优化15第四章 语言和编译器的设计174.1 语言设计174.1.1 leechee的数据组成174.1.2 leechee的文法规则
8、184.1.3 leechee的词法规则244.1.4 leechee的输入输出274.2 抽象语法树284.2.1 抽象语法树的用处284.2.2 leechee语法树的设计284.3 语法制导翻译314.3.1 利用Bison实现语法制导翻译方案324.3.2 均分代码生成工作32第五章 编译器的实现335.1 抽象语法树的实现335.1.1 NodeAST335.1.2 类型345.1.3 表达式365.1.4 语句425.1.5 声明465.2 符号表505.3 分析栈515.4 中间代码生成的上下文525.5 输入输出535.6 代码优化55第六章 用例说明566.1 用例程序566
9、.2 使用步骤58结束语59致谢60参考文献61附录62附录 英文资料翻译62附录 程序代码73第一章 绪论1.1 什么是编译器编译器(compiler)也是一个计算机程序,它把用某种编程语言(源语言)编写的代码转变成另一种计算机语言(目标语言,通常是二进制形式的目标代码)。转变源码最普遍的原因是为了生成执行的程序。编译器,这个名字主要是指把高级编程语言翻译成低级语言(比如,汇编语言或者机器码)的程序。如果翻译出来的程序能够在有着不同于编译器自身运行的CPU或者操作系统的计算机上运行,这种编译器就是交叉编译器(cross-compiler)。能够把低级语言翻译成高级语言的程序则叫做逆编译器(d
10、ecompiler)。把高级语言翻译成其他高级语言的程序,通常被称为语言翻译器(language translator)。语言重写器(rewriter)通常是指能够转变表达式而不改变所属语言的程序。一个编译器通常执行的操作有:词法分析,预处理,语法分析,语义分析(语法制导翻译),代码生成,和代码优化1。编译器软件的正确性非常重要,因为不正确的编译器行为产生的程序错误,通常很难被发现,也很难解决;为此,编译器的实现者付出了大量的努力来保证他们的软件的正确性。1.2 总会有编译器的开发需求现在常用的语言都已经有很多优秀的编译器,比如C语言有GCC和ICC;C+有G+和I+;Java有JAVAC和G
11、CJ。然而这些常用语言本身就一直在改变,不断地完善。因而,实现这些语言的编译器也必须做出相应的改动。语言自身的改变,有的是为了弥补自身的缺陷,例如java语言从设计至今,其体积已经增大了几倍;有的是为了适应新的软件开发需求,比如为了更容易地开发大型软件。除了那些成熟语言的改动会带来编译器软件编程的需要外,新语言的诞生也需要编译器程序员来完成新语言的实现工作。比如现在不断涌现的各种脚本语言,都需要编译器程序员来编写这些语言的编译器。新语言的设计(创造),有的是为了适应特殊领域的编程需要,比如SQL(Structured Query Language),是为关系数据库管理系统专门设计的专用语言。有
12、的是为了更好地利用各种系统资源(尤其是硬件资源),比如OpenCL(Open Computing Language),是为了更好地开发异构平台的计算能力而设计的。可以看到作为编程语言的实现软件(或者不同语言间的翻译软件)的编译器,对它的编程需求一直都存在。我们总有需要实现新的编译器,或者改动现有编译器的时候。图1.1 一个典型编译器执行的操作1.3 为什么做这个项目开发高性能的应用软件,除了一个良好的软件架构外,还需要一门符合要求的高效的编程语言来实现软件的设计,和一个高质量的编译器来把高级语言写的程序翻译成计算机硬件能够执行的机器代码。编程语言和编译器扮演着辅助软件设计和实现,以及开发计算机
13、计算能力的角色。它们都会深刻影响软件的实际性能;编程语言还会影响软件开发的效率。虽然,现在已经有很多优秀的编程语言和优秀的编译器。但是,一切都在不断地改变。人们一直都会有编译器的开发需求,需要一门更符合要求的编程语言,一个更适合的编译器。我对编译器的开发工作很感兴趣,希望能够参与其中,因此,我借毕业设计这个机会,设计并实现一门小语言,以学习更多编译器方面的知识,加深对编译器和编程语言的理解。这就是我为什么做这个项目的原因。第二章 设计什么样的编译器和语言这一章说明应该做一个什么样的编译器,设计一个什么样的语言,以及如何实现这个编译器的问题。2.1 做一个什么样的编译器应该做一个什么样的编译器呢
14、?实现一门现有的语言,比如C或者java?或者从语言设计,到代码生成,所有的工作都做一遍?实现一门现有的语言,比如C语言,我显然没有这样的能力;就算能实现,时间也不够。而且这么做不如直接去研究一个该语言的编译器来得更有意义。当然这也是需要大量的时间的(而且,这个工作无法成为设计)。从头到尾,把所有工作都做一遍。或许能够这样做。然而在有限的时间内,只能实现一个非常简单的语言,这么做又有什么意义呢。对一个编译器的入门者来说,需要加深对整个编译器实现流程的理解,也需要了解一些编译器的新技术,或者说这个领域的走向。2.1.1 利用LLVM实现一门新语言LLVM(Low Level Virtual Ma
15、chine)是一个包含一系列模块化可重用编译器和工具链技术的项目。LLVM主要的子项目有:LLVM Core libraries,Clang,dragonegg,LLDB等。其中LLVM Core libraries(LLVM核心库)提供了一个现代源码的(modern source)、目标独立的(target-independent)优化器;同时还为许多流行CPU提供了代码生成的支持。这些库是围绕着一个有详细说明的代码表示形式(LLVM IR)建立起来的。也就是说,只要我们能够把自己的语言翻译成LLVM IR,就可以利用LLVM完成代码优化和代码生成的工作。当然,你的目标语言(或者说目标CPU
16、架构)必须是LLVM已经支持的。不然,还是得自己实现代码生成的功能。Clang是一个LLVM自身的C/C+/Objective-C编译器,目标是提供快速的编译。据说编译Objective-C代码时能够比GCC快3倍。dragonegg把LLVM的优化器、代码生成器和GCC 4.5的分析器结合在一起。这样就使得LLVM能够编译Ada、Fortran等其他GCC编译器前端支持的语言,能够拥有一些Clang不支持的C特性(例如OpenMP)。LLDB是建立在LLVM库和Clang之上的一个非常好的本地调试器。2.1.2 利用flex和bison完成词法分析和语法分析又利用其他工具完成编译工作?那到底
17、还有多少情是自己做的呢?之所以要使用工具来完成语法分析工作,是因为本设计计划实现一个文法结构比较丰富的语言,一个类似C的小语言,能够实现控制流操作和过程调用这些功能。文法(或者说语言构造)多了,文法设计的难度就会增大。LR文法可以比较容易地描述复杂的语言文法。但是LR文法的语法分析表非常庞大,很难手动建立。因此,本设计选择使用bison(一个与yacc兼容的编译器构造工具)完成语法分析工作。使用flex(一个与lex兼容的词法分析构造工具)完成词法分析,则完全是为了节省时间。这样,需要做的工作就剩下设计文法和语法制导翻译了。然而这样做,是有缺陷的。因为这样将导致编译器的主体部分中出现大量不是自
18、己写的代码和想控制又难以控制的模块,使得编译器看起来非常笨拙。所以现在很多流行的编译器(例如GCC和Clang)都使用LL文法,而不是LR文法。然而设计一个语言的LL文法并非易事,所以只好暂且这么做了。图2.1 本设计编译器的实现方法2.2 设计一个什么样的语言2.2.1 计算机可以做什么设计一个计算机语言,需要清楚计算机能够做什么样的事情,打算利用它做什么事情。而后才能设计自己的语言。一台计算机的5个经典部件是输入,输出,内存,数据通路,和控制器,最后两个有时组合在一起称为处理器。同时,任何计算机的底层硬件都执行相同的基本功能:输入数据,输出数据,处理数据,和存储数据2。这大概就是计算机的模
19、型了。我们用计算机来写文档,画图,看视频,玩游戏,等等各种各样的事情。然而计算机是怎么替我们做这些事情的呢?其实,计算机的核心部分处理器(CPU)能够做的就是不断重复地执行各种指令,例如顺序执行的加、减、乘、除、移位指令,和二进制的与、或、非指令。除了顺序执行的指令外,处理器还可以执行选择指令,也就是条件跳转和无条件跳转指令。当然,一个功能完备的处理器,还必须能够执行数据的加载和存储指令。以上是在底层硬件上看到的操作,在高级语言中我们看到的则是算术逻辑运算,布尔运算,和控制流操作这些更符合我们人类思考方式的操作。不过,无论是从底层看,还是从高层看,计算机执行的操作都可以分为顺序操作和选择跳转操
20、作。所以,在练习语言设计时,一定要覆盖计算机的这两项功能。此外,为了描述清楚计算机处理和存储的数据,我们需要一个类型系统,说明数据的大小和存储格式。而且,往往不同类型的数据,执行这些数据的操作的硬件也是不同的,例如,执行整型和浮点型运算的硬件就是独立分开的。2.2.2 本设计的语言leechee弄清楚计算机能够做什么之后,就可以讨论设计一个什么样的语言了。因为计算机最基本的功能是计算,所以本设计决定设计一个计算性的语言。利用它可以完成基本的算术逻辑运算。不过,为了减轻工作量,只支持加减乘除运算。在布尔运算上,则比较完整,包括与或非和各种关系运算。所有的计算任务都通过函数来描述。使用者(语言的使
21、用者)编写程序时,从一个主函数开始描述他所需的计算任务。在一个函数中可以调用其他函数,来完成一些子任务(当然,不能调用主函数main)。总之,这是一个类似C的小语言。每个语言都有自己的名字,我也给自己的语言取个名字leechee。第三章 相关技术的介绍如上一章所提到的,这个设计中需要使用一些工具或者说技术,这里对其进行比较完整的介绍。3.1 FlexFlex (fast lexical analyser generator) 是Lex的一个替代品。它经常和GNU Bison语法分析器生成器一起使用。Flex最初由Vern Paxson 于1987 年用C语言写成。Flex是一个生成扫描器的工具
22、,能够识别文本中的词法模式。flex读入给定的输入文件,如果没有给定文件名的话,则从标准输入读取,从而获得一个关于需要生成的扫描器的描述。此描述叫做规则,由扩展的正则表达式和C代码对组成。flex的输出是一个C代码文件lex.yy.c其中定义了yylex() 函数。编译输出文件并且和 -lfl库链接生成一个可执行文件。当运行可执行文件的时候,它分析输入文件,为每一个正则表达式寻找匹配。当发现一个匹配时,它执行与此正则表达式相关的C代码。 3.1.1 Flex输入文件的格式flex的输入文件有三部分组成,用包含%的独立一行分隔开。 definitions % rules % user coded
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 毕业设计 论文 基于 LLVM 编译器 设计 实现

链接地址:https://www.31ppt.com/p-3979400.html