LLVM简要概述课件_第1页
LLVM简要概述课件_第2页
LLVM简要概述课件_第3页
LLVM简要概述课件_第4页
LLVM简要概述课件_第5页
已阅读5页,还剩12页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、LLVM简要概述LLVM简要概述作者:赵玉武时间:2015-11-25目 录1.LLVM简介11.1.LLVM的主要项目有:11.2.发展历程42.LLVM/Clang的使用42.1安装42.2 GCC介绍61. GCC简介72. GCC强大的背后83. GCC的多样性93.1   PC开发93.2   嵌入式开发10How to set TCP_NODELAY on BSD socket on Solaris?112 Answers111.LLVM简介LLVM 命名最早源自于底层虚拟机(Low Level Virtual Machine)的缩写,由于命名带来的混乱,目前L

2、LVM就是该项目的全称。LLVM 核心库提供了与编译器相关的支持,可以作为多种语言编译器的后台来使用。能够进行程序语言的编译期优化、链接优化、在线编译优化、代码生成。LLVM的项目是一个模块化和可重复使用的编译器和工具技术的集合。LLVM是伊利诺伊大学的一个研究项目,提供一个现代化的,基于SSA的编译策略能够同时支持静态和动态的任意编程语言的编译目标。自那时以来,已经成长为LLVM的主干项目,由不同的子项目组成,其中许多正在生产中使用的各种 商业和开源的项目,以及被广泛用于学术研究。1.1.LLVM的主要项目有:1、LLVM Core库提供一个源代码独立于目标优化器,连同代码生成的支持许多主流

3、的cpu(以及一些不太常见的!)这些库是建立在一个指定好代码表示称为LLVM中间表示(“LLVM IR”)。LLVM核心库良好的文档记录,它特别容易发明自己的语言(或港口现有的编译器)使用LLVM作为优化和代码生成器.2、Clang是一个“LLVM本地”C / C+ / objective - C编译器,旨在提供非常快速编译(如呢3 x速度比GCC当编译objective - c代码在调试配置),非常有用的错误和警告消息构建水平重要来源,并提供一个平台工具。Clang Static Analyzer是一种工具,可以自动发现bug的代码,并且是一个很好的例子的工具,它可以使用Clang前端作为一

4、个库来解析C / C+代码。3、dragonegg集成了LLVM优化和带有GCC解析器的代码生成器。这允许LLVM编译Ada、Fortran和其他支持GCC编译器编译的前端语言,和访问C功能不支持的Clang。4、LLDB项目建立在LLVM提供的库和Clang提供本地调试器。它使用Clang AST和表达式解析器,LLVM JIT,LLVM反汇编器等。它也是超级快的和更多的内存效率比GDB在加载符号。5、libc + +和libc + + ABI项目提供了一个标准的符合性和高性能的c+标准库的实现,包括完全支持c+ 11。6、compiler-rt项目提供了高调谐低级代码生成器的实现支持的活动

5、,如“_fixunsdfdi”和其他调用时生成一个目标没有短的本地指令序列来实现核心红外操作。它还提供了运行时库的实现动态测试工具等AddressSanitizer,ThreadSanitizer,MemorySanitizer,DataFlowSanitizer.7、OpenMP子项目提供了一个OpenMP运行时使用OpenMP实现的Clang。8、 vmkit项目的实现Java和.NET虚拟机是建立在LLVM技术。9、Polly项目实现一套缓存位置优化以及auto-parallelism和向量化使用多面体模型。10、libclc项目旨在实现OpenCL标准库。11、Klee项目实现了一个“

6、具有象征意义的虚拟机”使用一个定理验证通过程序来评估所有动态路径为了找到缺陷和证明函数的性能。Klee的一个主要特征是, 如果它检测到一个bugs,它能产生一个testcase(测试用例)。12、SAFECode项目是一个内存安全C / C+编译器程序。这个工具代码中带有运行时检查,检测内存中是否有安全性错误(例如:缓冲区溢出)。它可以用来保护软件免受安全攻击,也可以用作安全错误内存调试工具像Valgrind。13、lld项目旨在Clang / llvm内置链接器。目前,Clang必须调用系统链接器来产生可执行文件。除了官方LLVM的子项目,有各种各样的其他项目使用组件LLVM的各种任务。通过

7、这些外部项目可以使用LLVM编译Ruby,Python, Haskell,Java,D语言,PHP,Pure,Lua和许多其他语言。LLVM的主要优势是它的多功能性,灵活性,和可重用性,这就是为什么它被用于多种不同的任务:从做轻量级JIT编译Lua等嵌入式语言Fortran编译代码的大规模的超级电脑。一切,LLVM具有广泛和友好的社区的人建造伟大的低级工具很感兴趣。如果你有兴趣参与,首先是浏览LLVM的博客并报名参加LLVM开发者邮件列表。有关如何在一个补丁发送的信息,提交访问,和版权和许可的主题,请参阅LLVM开发策略。1.2.发展历程1、2000年LLVM开始开发。2、2005年Apple

8、雇了Chris Lattner,LLVM也相当于成了Apple的官方支持的编译器。3、Apple已经将它用在OpenCL的流水线优化,Xcode已经能使用llvm-gcc编译代码。4、2011-12-02 LLVM3.0发布,LLVM包括了一系列子项目,它们也同步发布了新版本,如C/C+/Objective-C前端Clang 3.0改进了C+程序编译支持;改进C+ 2011标准支持;实现支持即将发布的C1x标准的某些特性;更快的生成代码,更快的编译,等等。3 5、LLVM荣获2012年ACM软件系统奖4 2.LLVM/Clang的使用2.1安装方式一:采用源码编译方式到官方

9、网站下载()方式二:使用svn客户端从开发平台上下载1) 创建 LLVM 源代码存放目录 (llvm_source) $mkdir p llvm_source 2 )进入创建的目录 $cd llvm_source 3 )获取 LLVM $svn co /svn/llvm-project/llvm/trunk llvm 4 )获取 Clang $cd llvm/tools $svn co /svn/llvm-project/cfe/trunk clang 方式三:使用编译好的二进制文件下载clang+llvm-3.2-x86-linux-u

10、buntu-12.04.tar1)、解压 tar xzvf clang+llvm-3.2-x86-linux-ubuntu-12.04.tar2)、cd clang+llvm-3.2-x86-linux-ubuntu-12.043)、将目录/clang+llvm-3.2-x86-linux-ubuntu-12.04/bin配置到环境变量中Vi /etc/profileexport clang_llv=/clang+llvm-3.2-x86-linux-ubuntu-12.04/binexport PATH=$clang_llv:$PATH编写程序进行测试:使用一个常见的 hello world

11、 程序来演示 Clang。在这里我们把这个文件命名为 test.c。它的内容如下: #include <stdio.h> int main(int argc, char *argv) printf("hello worldn"); return 0; 您可以使用任何编辑器输入并生成这个文件。有了这个文件以后,您可以试试以下命令行的命令: $ clang -help ( 查看帮助信息 ) $ clang test.c -fsyntax-only ( 检查语法和词法正确性 ) $ clang test.c -S -emit-llvm -o test.bc ( 生成优

12、化前的 llvm bitcode) $ clang test.c -S -emit-llvm -o test.bc -O3 ( 生成优化的 llvm bitcode) $ clang test.c -S -O3 -o test ( 生成可执行代码 ) 与 GCC 相比,Clang 的一大优点是更加清晰明确的错误提示。您不妨尝试着删除"printf("hello worldn");"语句后面的分号。编译这个程序,GCC 给出的错误信息将是: test.c: In function 'main': test.c:6:2: error: exp

13、ected '' before 'return'而 Clang 给出的错误信息则是: test.c:5:26: error: expected '' after expression printf("hello world.n")2.2 GCC介绍GCC,全称GNU Compiler Collection,是一套GNU开发的编译器环境,它的创始人便是大名鼎鼎的Richard.M.Stallman。最初GCC刚开始开发时,它还叫做GNU C Compiler,随着开发的深入,GCC很快得到了扩展,不仅可以支持C语言,还可以处理C

14、+,Pascal,Object-C,Java以及Ada等其他语言。目前,GCC不仅是GNU的官方编译器,也成为编译和创建其他操作系统的编译器,包括BSD家族以及MAC OS X等。另外,GCC也是跨平台交叉编译的首选,它不仅支持Intel的x86系列,同时也支持MIPS,ARM,PowerPC,SPARC等等处理器。可以这么说,即使GCC不是世界上效率最高的编译器,它也一定是世界上最全面的编译器。1. GCC简介我们先回到一个常识性的问题,什么是编译器呢?简单地说,编译器可以看作是一个语言翻译器。就像把中文翻译成英语一样,编译器可以把高级语言翻译成计算机能够执行的机器语言。这样看来,GCC可以

15、算得上是一个精通多国语言的高级翻译官了。最简单的GCC使用指令如下所示:gcc  hello.c  -o  hello GCC接受hello.c作为输入,最后产生目标可执行代码hello。这个简单的流程实际上经历了很多步骤,如下图所示:虽然我们只用了一条命令就完成了编译,但实际上gcc命令依次呼叫了cpp,gcc自己,gas以及ld来进行完整的编译流程,最后生成最终的可执行文件hello。下面我们看一下分解动作:cpp  hello.c  >  hello.igcc  -S  hello.ias &

16、#160;hello.s  -o  hello.old  -dynamic-linker  /lib/ld-linux.so.2  /usr/lib/crt1.o  /usr/lib/crti.o  /usr/lib/gcc/i686-linux-gnu/4.4.5/crtbegin.o -L/usr/lib/gcc/i686-linux-gnu/4.4.5 hello.o  -lgcc  -lgcc_eh  -lc  /usr/lib/gcc/i686-linux-gnu/4.4.5

17、/crtend.o  /usr/lib/crtn.o  -o  hello 看完这些步骤有没有晕头转向的感觉呢?对于普通的用户来说,还是让GCC帮我们做这些事情比较好。对于如何学习使用GCC,可以参考GCC官方的手册,如果大家觉得官方的手册太罗嗦,我这里推荐一本GCC的入门书籍An Introduction to GCC,这本书详尽的介绍了GCC的使用方法,内容浅显易懂,很适合初学者。 2. GCC强大的背后学过编译原理这门课程的同学对下面这副图应该很熟悉,这是经典的编译流程。GCC作为经典的编译器,自然也是遵循这个教科书流程(实际GCC的处理

18、更复杂点,但本质上是一样的)。我们先简化一下上面这幅图,以中间代码为分界,前面的词法分析、语法分析、语义分析我们把它称之为前端处理,后面的优化和目标代码生成我们称之为后端处理。试想一下,是否可以为不同的高级语言单独写一个前端,然后为不同的处理器架构单独写一个后端呢?GCC基本上也是这么实现的,不过不要误会,并没有一个统一的gcc执行程序能够处理如此多的前端和后端,每个语言的编译器都是一个独立的程序(如C语言的编译器是gcc,C+的编译器是g+),而不同的后端也要对应不同的可执行程序。你可以下载单独的一份GCC源代码,通过不同的configure来生成自己需要的编译器。而且,编译器的实现也比上图

19、要复杂的多,前端的主要功能是产生一个可供后端处理的语法树,而语法树结构实际上很难与处理器架构脱钩,这些都是编译器应用中需要解决的问题。GCC强大的真正原因是什么?是因为它支持了众多的前端和后端吗?这些都不过是一个表象而已。GCC是一款真正自由的编译器,我们可以随时把代码拿过来修改以实现自己需要的功能。如果你的硬件平台增加了一些指令,而普通的编译器并不能产生这些指令怎么办?在GCC后端添加这些指令吧。如果你觉得C语言用的不太顺手,想给它添加一些功能怎么办?修改GCC的前端吧。因为有了GCC,我们才拥有这些自由,以及迅速实现自己想法的能力,而这些才是GCC强大背后的基础。2010年1月份的时候,G

20、oogle的Go语言前端被允许进入GCC编译器家族,GCC更加强大了。 3. GCC的多样性GCC因为其灵活性被应用到了很多领域和系统,从PC上的开发到嵌入式开发,都可以见到GCC的影子。 3.1   PC开发我们先看看PC。MAC自从投入Intel的怀抱,是否也可以看作是一种PC呢?LinuxLinux系统应该是GCC的主战场,但也是最没必要去说的一个系统,除了GCC,难道我们还有更好的选择吗?Linux内核、Apache服务器、MySQL数据库,等等一系列伟大的作品都是通过GCC来构建的,GCC可以说是GNU/Linux系统的基石。MAC OS XMAC OS

21、 X也是GCC的重度用户,其应用程序开发环境Cocoa就是使用的GCC,所以在MAC OS X下开发也是离不开GCC的。Windows现在在Windows下开发C/C+程序一般都是用微软的编译器,当年的Borland已经成为传说。但是如果你不想付钱的话,也可以考虑Windows下的GCC。在Windows下体验GCC最常用的有两种方式:一是在Cygwin下使用GCC,另外一种是使用MinGW。Cygwin是一个自由软件的集合,最初由Cygnus Solutions开发,目的是在Windows系统上运行类Unix的软件。通过Cygwin编译的程序可以在Windows上运行,但必须使用cygwin

22、.dll。MinGW(Minimalist GNU for Windows),是将GNU开发工具移植到Windows平台的产物,包括一系列头文件、库和可执行文件,用MinGW开发的程序不需要额外的第三方DLL就可以直接在Windows上运行。Nokia的图形开发包QT在Windows下就是调用MinGW来编译的。DOS在DOS系统下也是可以用GCC的,国内的DOS开发者可能更熟悉Turbo C或者Open Watcom,GCC的DOS版本DJGPP其实也是32位DOS程序开发的主流环境之一。最初DJGPP的发起人DJ Delorie曾经询问过Richard Stallman,FSF是否考虑过把

23、GCC移植到MS-DOS下,当时Richard的回答是GCC太庞大,而MS-DOS只不过是个16位的操作系统,所以官方并没有考虑这件事。DJ Delorie并没有因此而退缩,最终给我们带来了这个优秀的开发平台。DJGPP刚开始开发时叫做djgcc,在引入了C+之后改为现在这个名字(DJ's GNU Programming Platform)。 3.2   嵌入式开发对于嵌入式开发领域来说,因为开发板的能力限制,是无法运行编译环境的,这样就需要在PC上通过交叉编译来生成目标可执行程序,GCC的高度灵活性在嵌入式开发上发挥了极大的作用。Android看看当今最火的移动平

24、台Android,就是完全用GCC来构建的,请注意,这里指的不是Android应用程序,Android下的应用程序是运行在Dalvik虚拟机上的Java程序。iOSApple的iOS应用程序开发也是用Cocoa来进行,这怎么会离开GCC呢?MeeGo/Symbian在Apple和Google的冲击下,Nokia似乎已经日薄西山了,但对于中国国情来说,真的是这样吗?iPhone高高在上,拥有者只会是少数,Google退出中国之后,Android Market很难在国内有所作为,再加上Nokia手机一贯皮实的口碑,现在的Symbian以及将来的MeeGo的保有量应该不会低。Nokia已经把Symbian和MeeGo的开发环境统一到QT上了,这里依然是GCC的一亩三分田。 GCC是强大的,但它并不是一个人在战斗,在它的背后站着GNU工具链,包括make,GCC,Binutils,GDB等一系列工具,这些工具之间是相辅相成的,只有把它们组合起来使用才能发挥其最大的威力。 How to set TCP_NODELAY on BSD socket on Solaris? I am trying to turn

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论