美国能源部宣布与
Nvidia 合作,为LLVM编译器集加入一个针
对大规模并行GPU计算的Fortran编译器,开源代码预计将在明年下半年发布。Fortran不再是主流语言,但在科学计算领域仍然被广泛使用,有大
量的旧代码依赖于Fortran。很多代码都是由能源部下属的国家实验室的工作人员维护的。他们将与Nvidia合作移植现有的Fortran编译器代
码,整合现在的编译器工具,填补LLVM在Fortran上的空白。                  

澳门葡萄京官方网站 ,写在前面:LLVM是(Low Level Virtual
Machine)的简称,官网为http://llvm.org/
LLVM随着这个项目的不断的发展,已经无法完全的代表这个项目了,只是这种叫法一直延续下来。
LLVM是一个开源的项目。它最早的时候是Illinois的一个研究项目,主要负责人是Chris
Lattner,他现在就职于Apple. Apple 目前也是llvm项目的主要赞助者之一。
LLVM的主要作用是它可以作为多种语言的后端,它可以提供可编程语言无关的优化和针对很多种CPU的代码生成功能。此外llvm目前已经不仅仅是个编程框架,它目前还包含了很多的子项目,比如最具盛名的clang.
LLVM这个框架目前已经有基于这个框架的大量的工具可以使用。

在XCode中,我们经常会看到这些编译选项,有些人可能会有些茫然,本文将对GCC4.2、LLVM
GCC 4.2、LLVM compliler 2.0三个编译选项进行一个详细的介绍。

via Solidot

本文只是翻译LLVM官网的一小部分

澳门葡萄京官方网站 1

The LLVM Complier Infrastructure

GCC 原名为 GNU C 语言编译器,因为它原本只能处理 C语言。GCC
很快地扩展,变得可处理 C++。之后也变得可处理
Fortran、Pascal、Objective-C、Java, 以及 Ada与其他语言。

LLVM编译环境基础架构

LLVM 是 Low Level Virtual Machine
的简称,这个库提供了与编译器相关的支持,能够进行程序语言的编译期优化、链接优化、在线编译优化、代码生成。简而言之,可以作为多种语言编译器的后台来使用。如果这样还比较抽象的话,介绍下
Clang 就知道了:Clang 是一个 C++ 编写、基于 LLVM、发布于 LLVM BSD
许可证下的 C/C++/Objective C/Objective C++ 编译器,其目标就是超越 GCC。

The LLVM Project is a collection of modular and reusable compiler and
toolchain technologies. Despite its name, LLVM has little to do with
traditional virtual machines, though it does provide helpful libraries
that can be used to build
them. The name
“LLVM” itself is not an acronym; it is the full name of the project.

LLVM属于编译器的中间层,它的输入是编译器的IF代码,输出经过最佳化的IF代码。然后再被编译器转化为机器相关的汇编代码。

LLVM项目是模块化和复用编译器和技术工具链的集合,虽然它可以提供有用的库去构建传统虚拟机,但还是与传统虚拟机有很大不同.LLVM并不是首字母的缩写而是项目的全名

LLVM支持语言无关的指令集和类型系统。指令采用静态单赋值形式。

LLVM began as a research
project
at the University of
Illinois, with the
goal of providing a modern, SSA-based compilation strategy capable of
supporting both static and dynamic compilation of arbitrary programming
languages. Since then, LLVM has grown to be an umbrella project
consisting of a number of subprojects, many of which are being used in
production by a wide variety ofcommercial and open
source projects
as well as being widely used in academic
research. Code in the
LLVM project is licensed under the “UIUC” BSD-Style
license.

LLVM是为了任意一种编程语言写成的程式,利用虚拟技术,创造出编译时期,链结时期,执行时期以及“闲置时期”的最佳化。它最早是以
C/C++为实作对象,目前它支援了包括Objective-C, Fortran, Ada, Haskell,
Java bytecode, Python, Ruby, ActionScript, GLSL以及其他语言。

LLVM
开始在伊利诺伊大学作为一个研究项目,目标是提供一个支持任意语言的静态和动态编译的现代的,基于SSA编译战略目标的语言集合.从那时起,LLVM现已发展成为由许多子项目,其中有许多是正在生产由各种各样的使用的综合项目的商业和开源项目以及被广泛用于学术研究.LLVM项目遵循’UIUC’BSD风格的许可证

Apple(包括中后期的NeXT)
一直使用GCC作为官方的编译器。GCC作为开源世界的编译器标准一直做得不错,但Apple对编译工具会提出更高的要求。

The primary sub-projects of LLVM are:
LLVM的子项目包括:

一方面,是Apple对Objective-C语言新增很多特性,但GCC开发者并不买Apple的帐——不给实现,因此索性后来两者分成两条分支分别开发,这也造成Apple的编译器版本远落后于GCC的官方版本。另一方面,GCC的代码耦合度太高,不好独立,而且越是后期的版本,代码质量越差,但Apple想做的很多功能(比如更好的IDE支持)需要模块化的方式来调用GCC,但GCC一直不给做。甚至最近,《GCC运行环境豁免条款
》从根本上限制了LLVM-GCC的开发。
所以,这种不和让Apple一直在寻找一个高效的、模块化的、协议更放松的开源替代品,于是Apple请来了编译器高材生Chris
Lattner(2000年,本科毕业的Chris
Lattner像中国多数大学生一样,按部就班地考了GRE,最终前往UIUC(伊利诺伊大学厄巴纳香槟分校),开始了艰苦读计算机硕士和博士的生涯。在这阶段,他不仅周游美国各大景点,更是努力学习科学文化知识,翻烂了“龙书”(《Compilers:
Principles, Techniques, and
Tools》),成了GPA牛人【注:最终学分积4.0满分】,以及不断地研究探索关于编译器的未知领域,发表了一篇又一篇的论文,是中国传统观念里的“三好学生”。他的硕士毕业论文提出了一套完整的在编译时、链接时、运行时甚至是在闲置时优化程序的编译思想,直接奠定了LLVM的基础。LLVM在他念博士时更加成熟,使用GCC作为前端来对用户程序进行语义分析产生IF(Intermidiate
Format),然后LLVM使用分析结果完成代码优化和生成。这项研究让他在2005年毕业时,成为小有名气的编译器专家,他也因此早早地被Apple相中,成为其编译器项目的骨干)。

1.The LLVM Core libraries provide a modern source- and
target-independent optimizer, along with code generation support for
many popular CPUs (as well as some less common ones!) These libraries
are built around a well specified code representation known as the LLVM
intermediate representation (“LLVM IR”). The LLVM Core libraries are
well documented, and it is particularly easy to invent your own language
(or port an existing compiler) to use LLVM as an optimizer and code
generator.

刚进入Apple,Chris
Lattner就大展身手:首先在OpenGL小组做代码优化,把LLVM运行时的编译架在OpenGL栈上,这样OpenGL栈能够产出更高效率的图形代码。如果显卡足够高级,这些代码会直接扔入GPU执行。但对于一些不支持全部OpenGL特性的显卡(比如当时的Intel
GMA卡),LLVM则能够把这些指令优化成高效的CPU指令,使程序依然能够正常运行。这个强大的OpenGL实现被用在了后来发布的Mac
OS X
10.5上。同时,LLVM的链接优化被直接加入到Apple的代码链接器上,而LLVM-GCC也被同步到使用GCC4代码。

1.LLVM内核提供一个现代化的源和目标无关的优化,随着许多CPU支持代码生成,这些库都是围绕着建立明确的规定被称为LLVM中间表示的代码表示(LLVM
IR),LLVM的核心库是有据可查的,它使得你可以很轻松使用LLVM作为优化器和代码生成器构建你自己的语言

Apple吸收Chris
Lattner的目的要比改进GCC代码优化宏大得多——GCC系统庞大而笨重,而Apple大量使用的Objective-C在GCC中优先级很低。此外GCC作为一个纯粹的编译系统,与IDE配合得很差。加之许可证方面的要求,Apple无法使用LLVM
继续改进GCC的代码质量。于是,Apple决定从零开始写
C、C++、Objective-C语言的前端 Clang,完全替代掉GCC。

2.Clang is an “LLVM native” C/C++/Objective-C compiler, which aims
to deliver amazingly fast compiles (e.g. about 3x faster than
GCC
when compiling Objective-C code in a debug configuration), extremely
useful error and warning
messages
and to provide a platform for building great source level tools. The
Clang Static
Analyzer is
a tool that automatically finds bugs in your code, and is a great
example of the sort of tool that can be built using the Clang frontend
as a library to parse C/C++ code.

正像名字所写的那样,Clang只支持C,C++和Objective-C三种C家族语言。2007年开始开发,C编译器最早完成,而由于Objective-C相对简单,只是C语言的一个简单扩展,很多情况下甚至可以等价地改写为C语言对Objective-C运行库的函数调用,因此在2009年时,已经完全可以用于生产环境。C++的支持也热火朝天地进行着。

2.Clang 是一个LLVM原生 用于提供 极速 编译的 C/C++/Objective-C
编译器(是GCC的3倍速度),非常有用的错误和警告消息,并为构建有效的源代码工具提供一个平台,该
锵静态分析是一种工具,自动查找代码中的错误,而且是那种工具,可以使用Clang前端作为一个库来解析C
/ C ++代码生成的一个很好的例子。

下面这张图将显示GCC、LLVM-GCC、LLVM Compiler这三个编译选项的不同点:

3.dragonegg integrates the LLVM optimizers and code generator with
the GCC parsers. This allows LLVM to compile Ada, Fortran, and other
languages supported by the GCC compiler frontends, and access to C
features not supported by Clang.
3.dragonegg 集成了GCC解析器和LLVM优化程序和代码生成器.这允许LLVM编译
Ada, Fortran, 和其他CGG前端编译器支持的语言以及访问Clang不支持的C功能.

澳门葡萄京官方网站 2

4.The LLDB project builds on libraries provided by LLVM and Clang to
provide a great native debugger. It uses the Clang ASTs and expression
parser, LLVM JIT, LLVM disassembler, etc so that it provides an
experience that “just works”. It is also blazing fast and much more
memory efficient than GDB at loading symbols.

Chris Lattner的LLVM显然是一个很棒的选择。随着 Mac OS X 10.6 Snow Leopard
登上舞台,LLVM显露出了真身。可以说, Snow
Leopard的新功能,完全得益于LLVM的技术。而这些需求得以实现,归功于LLVM自身的新前端——Clang。而这一个版本,也是将LLVM推向真正成熟的重大机遇。

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

由于受到Clang项目的威胁,GCC也不得不软下来,让自己变得稍微模块化一些,推出插件的支持,而LLVM项目则顺水推舟,索性废掉了出道时就一直作为看家本领的LLVM-GCC,改为一个GCC的插件DragonEgg。
Apple也于Xcode 4.2彻底抛弃了GCC工具链。

In addition to official subprojects of LLVM, there are a broad variety
of other projects that use components of LLVM for various
tasks.
Through these external projects you can use LLVM to compile Ruby,
Python, Haskell, Java, D, PHP, Pure, Lua, and a number of other
languages. A major strength of LLVM is its versatility, flexibility, and
reusability, which is why it is being used for such a wide variety of
different tasks: everything from doing light-weight JIT compiles of
embedded languages like Lua to compiling Fortran code for massive super
computers.

除LLVM核心和Clang以外,LLVM还包括一些重要的子项目,比如一个原生支持调试多线程程序的调试器LLDB,和一个C++的标准库libc++,这些项目由于是从零重写的,因此要比先前的很多项目站得更高,比如先前GNU、Apache、STLport等C++标准库在设计时,C++0x标准还未公布,所以大多不支持这些新标准或者需要通过一些繁杂的改动才能支持,而libc++则原生支持C++0x。

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

LLVM的成熟也给其他痛恨GCC的开发项目出了一口恶气。其中最重要的,恐怕是以FreeBSD为代表的BSD社区。BSD社区和Apple的联系一向很紧密,而且由于代码相似,很多Apple的技术如Grand
Central
Dispatch也是最早移植到FreeBSD上。BSD社区很早就在找GCC的替代品,无奈大多都很差(如Portable
C Compiler产生的代码质量和gcc不能同日而语)。

BSD开发者有洁癖的居多,大多都不喜欢GPL代码,尤其是GPL协议第三版发布时,和FreeBSD的协议甚至是冲突的。这也正是为什么FreeBSD中包含的GNU的C++运行库还是2007年以GPLv2发布的老版本,而不是支持C++0x的但依GPLv3协议发布的新版本。

因此历时两年的开发后,2012年初发布的FreeBSD
9.0中,Clang被加入到FreeBSD的基础系统。
但这只是第一步,因为FreeBSD中依然使用GNU的C++ STL
库、C++运行库、GDB调试器、libgcc/libgcc_s编译库都是和编译相关的重要底层技术,先前全被GNU垄断,而现在LLVM子项目lldb、libc++、compiler-rt等项目的出现,使BSD社区有机会向GNU说“不”,因此一个把GNU组件移出FreeBSD的计划被构想出来,并完成了很大一部分。
预计在FreeBSD 10发布时,将不再包含GNU代码。