LLVM教程(一)-- LLVM的简介

一、介绍

LLVM是构架编译器(compiler)的框架系统,以C++编写而成,用于优化以任意程序语言编写的程序的编译时间(compile-time)、链接时间(link-time)、运行时间(run-time)以及空闲时间(idle-time),对开发者保持开放,并兼容已有脚本。LLVM计划启动于2000年,最初由University of Illinois at Urbana-Champaign的Chris Lattner主持开展。2006年Chris Lattner加盟Apple Inc.并致力于LLVM在Apple开发体系中的应用。Apple也是LLVM计划的主要资助者。

LLVM 命名最早源自于底层虚拟机(Low Level Virtual Machine)的缩写,由于命名带来的混乱,目前LLVM就是该项目的全称。LLVM 核心库提供了与编译器相关的支持,可以作为多种语言编译器的后台来使用。能够进行程序语言的编译期优化、链接优化、在线编译优化、代码生成。LLVM的项目是一个模块化和可重复使用的编译器和工具技术的集合。LLVM是伊利诺伊大学的一个研究项目,提供一个现代化的,基于SSA的编译策略能够同时支持静态和动态的任意编程语言的编译目标。自那时以来,已经成长为LLVM的主干项目,由不同的子项目组成,其中许多正在生产中使用的各种 商业和开源的项目,以及被广泛用于学术研究。

二、子项目

LLVM的主要子项目:

1 LLVM核心库提供了一个现代的源和目标无关的优化器,以及对许多流行的CPU(以及一些不太常见的CPU)的代码生成支持。这些库建立在一个良好指定的代码表示,称为LLVM中间表示 (“LLVM IR”)。 LLVM核心库有详细的文档,特别容易发明自己的语言(或端口现有的编译器)来使用LLVM作为优化器和代码生成器。

2 Clang是一个“LLVM本地”C / C ++ / Objective-C编译器,其目的是提供惊人的快速编译(例如,在调试配置中编译Objective-C代码时,比GCC快3倍),非常有用的错误和警告消息,以及 为构建优秀的源代码级工具提供了一个平台。 Clang静态分析器是一种可以自动在代码中查找错误的工具,也是使用Clang前端作为解析C / C ++代码的库而构建的工具的一个很好的例子。

3 dragonegg将LLVM优化器和代码生成器与GCC解析器集成。 这允许LLVM编译Ada,Fortran和GCC编译器前端支持的其他语言,以及访问Clang不支持的C功能。

4 LLDB项目建立在由LLVM和Clang提供的库上,以提供一个伟大的本地调试器。 它使用Clang AST和表达式解析器,LLVM JIT,LLVM反汇编器等,以便它提供一个“只工作”的经验。 在加载符号时,它比GDB的速度更快,记忆效率也更高。

5 libc ++和libc ++ ABI项目提供了C ++标准库的标准一致和高性能实现,包括对C ++ 11的完全支持。

6 compiler-rt项目提供低级代码生成器支持例程(如“__fixunsdfdi”)的高度调优的实现,以及当目标没有短序列的本地指令以实现核心IR操作时生成的其他调用。 它还为动态测试工具(如AddressSanitizer,ThreadSanitizer,MemorySanitizer和DataFlowSanitizer)提供运行时库的实现。

7 OpenMP子项目提供了与Clang中的OpenMP实现一起使用的OpenMP运行时。

8 vmkit项目是基于LLVM技术构建的Java和.NET虚拟机的实现。

9 polly项目使用多面体模型实现一组缓存位置优化以及自动并行性和向量化。

10 libclc项目旨在实现OpenCL标准库。

11 lee项目实现了一个“符号虚拟机”,它使用定理证明程序来尝试通过程序来评估所有动态路径,以便发现错误并证明函数的属性。 klee的一个主要特点是它可以在它检测到错误的情况下产生一个测试用例。

12 SAFECode项目是一个用于C / C ++程序的内存安全编译器。 它使用运行时检查来检测代码,以在运行时检测存储器安全错误(例如,缓冲区溢出)。 它可以用于保护软件免受安全攻击,也可以用作内存安全错误调试工具,如Valgrind。

13 lld项目旨在成为clang / llvm的内置链接器。 目前,clang必须调用系统链接器来产生可执行文件。

除了LLVM的官方子项目,还有各种各样的其他项目,它们使用LLVM的组件来完成各种任务。 通过这些外部项目,您可以使用LLVM编译Ruby,Python,Haskell,Java,D,PHP,Pure,Lua和许多其他语言。 LLVM的一个主要优势是其多功能性,灵活性和可重用性,这就是为什么它被用于各种各样的不同任务:从轻量级JIT编译嵌入式语言如Lua到编译Fortran代码为大规模超级 电脑。

三、参考资料

http://llvm.org/

你可能感兴趣的:(LLVM)