澳门新葡亰网址下载LLVM 官翻

by admin on 2020年5月6日

美国能源部宣布与
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这个框架目前已经有基于这个框架的大量的工具可以使用。

LLVM是Low Level Virtual
Machine的简称。这个库提供了与编译器相关的支持,能够进行程序语言的编译期优化、链接优化、在线编译优化、代码生成。可以作为多种语言编译器的后台来使用。

via Solidot

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

Clang是一个C++编写的基于LLVM、发布于LLVM
BSD许可证下的C/C++/Object-C/Object-C++ 编译器。

The LLVM Complier Infrastructure

GCC:(GNU Compiler
Collection)缩写,一个编程语言编译器,是GNU(自由软件理事会)的关键部分。也是GNU工具链的一部分。GCC常被认为是夸平台编译器的事实标准,特别是它的C语言编译器。GCC原本只能处理C语言。但是面对Clang的竞争,很快作出了扩展,现在已经可以处理C++,Fortran、Pascal、Object-C、Java、Ada,以及Go语言。许多操作系统,包括许多Unix系统,如Linux及BSD家族都采用GCC作为标准编译器。MacOSX也是采用这个编译器。

LLVM编译环境基础架构

     
 有了GCC在前为何还有Clang的出现?原因如下:Apple使用LLVM在不支持全部OpenGL特性的GPU(Intel低端显卡)上生成代码JIT,令程序仍然能正常运行。之后LLVM与GCC的集成过程发生了一些不快,GCC系统庞大儿笨重,而Apple大量使用的Object-C在GCC中优先级很低。此外GCC作为一个纯粹的编译系统,与IDE配合很差。加上许可证方面的要求,Apple无法使用修改版GCC而闭源。于是Apple决定从0开始写C
family的前端,也就是基于LLVM的Clang了。

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.

Clang的特性:

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

1、快:通过编译OSX上几乎包含了所有C头文件的carbon.h的测试,包括预处理(Pregrocess)、语法(lex)、解析(parse),语义分析(semantic
Analysis),抽象语法树生成(Abstract syntax Tree)的时间,Clang是Apple
GCC 4.0的2.5x快。

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.

2、内存占用小:Clang内存占用是源码的130%,AppleGCC则超过10x。

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

3、诊断信息可读性强:Clang中错误的语法不但有源码提示,还会在错误的调用和相关上下文有~~~~和^提示,GCC看不懂。

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

4、设计清晰简单,容易理解,易于扩展增强。学习容易。

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.

5、基于库的模块化设计,易于IDE集成及其他用途的重用。由于历史原因,GCC是一个单一的可执行程序编译器,其内部完成预处理到代码生成的全部过程,中间诸多信息都无法被其他程序重用。Clang将编译过程分成彼此分离的几个阶段,AST信息可序列化。通过库的支持,程序能够获取到AST级别的信息,将大大增强对代码的操控能力。对于IDE而已,代码补全、重构是重要的功能,然而如果没有底层的支持,只使用tags分析或者正则表达式匹配很难达成。

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

当然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.

1、支持JAVA/ADA/Fortran

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

2、GCC支持平台多

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功能.

3、GCC更流行,广泛使用,支持完备

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.

4、GCC基于C,不需要C++编译器就可以编译

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

         相信介绍到这里大家能够对 Clang 和 LLVM 有所了解了。除去 Clang
之外,LLVM 还被用在 Gallium3D 中进行 JIT 优化,Xorg 中的 pixman
也有考虑使用 LLVM
来优化执行速度,llvm-lua使用
LLVM 来编译 Lua
代码,gpuocelot使用
LLVM 可以令 CUDA 程序无需重新编译即可运行在多核 X86CPU、IBM Cell、支持
OpenCL 的设备之上…

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的编译器,Clang必须调用连接器LLDB来产生可执行文件。

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

用Clang编译OC的程序

我们用Clang编译一次OC的程序就可以加深对Clang的理解。

1、创建程序,我们不用XCode工具,就用普通文本编辑器,内容如下:

#import<Foundation/Foundation.h>

int main (intargc,constchar* argv[])

{

@autoreleasepool

  {

printf(“Hello, World!n”);

NSLog(@”Hello, Objective-C!”);

      }

return0;

}

2、保存为纯文本格式,文件名和路径随意,例如 test.m。

3、编译生成可执行文件,用命令行

    1)打开终端(应用程序->使用工具->终端)

    2)cd命令进入test.m文件所在的目录;

notes:在iOS5之前,可以通过GCC对源码进行编译,但是在iOS5中添加了新的特性,例如ARC以及新的指令,需要LLVM
clang编译器。GCC不认识新的指令,无法通过编译。

    3)在终端中输入以下命令:clang -fobjc-arc -framework Foundation
test.m  -o test

命令解释:-fobjc-arc 表示编译器需要支持ARC特性,这样才能理解新添加的指令

                   -framework Foundation
表示引用Foundation框架,这个框架定义了很多基本的类,是程序的基础框架。

                   test.m  编译的源代码文件名。

                    -o test 表示输出的可执行为难的文件名字是test。

        4)编译完成之后会在当前目录生成test

        5)在终端执行该文件,输入命令:./test

        6)点击回车,在终端中得到如下的输出:

Hello,World!

2017-10-11 16:46:37.532 test[75632:707] Hello,Objective-C!

参考:

           

发表评论

电子邮件地址不会被公开。 必填项已用*标注

网站地图xml地图