LLVM到底是什么?


Answers:


369

LLVM是用于构建,优化和产生中间和/或二进制机器代码的库。

LLVM可用作编译器框架,您可以在其中提供“前端”(解析器和词法分析器)和“后端”(将LLVM的表示形式转换为实际机器代码的代码)。

LLVM还可以充当JIT编译器-它支持x86 / x86_64和PPC / PPC64程序集生成,并具有针对编译速度的快速代码优化。

如果您有兴趣,可以在其演示页面中使用从C或C ++代码生成的LLVM机器码,但自2013年以来,该演示页面目前已被禁用。


39
如果您想玩它,请看这篇精彩的文章:gnuu.org/2009/09/18/writing-your-own-toy-compiler
LiraNuna 2010年

29
答案中提供的链接显示“当前禁用了LLVM演示页面”。
EngrStudent

5
ellcc.org/demo/index.cgi是另一种通过LLVM将C / C ++编译为各种目标的方法,包括中间代码
Tom Goodfellow

1
您能举一个实际的例子说明什么意思吗?
Migrate2Lazarus看到我的个人资料'18

112

LLVM的一个很好的总结是:

在此处输入图片说明

在前端,您可以使用Perl和许多其他高级语言。在后端,您具有直接在计算机上运行的本机代码。

中间是您的中间代码表示形式。如果每种高级语言都可以用这种LLVM IR格式表示,那么基于此IR的分析工具就可以轻松重用-这是基本原理。


39
图片胜过千言万语👍
iPatch系统

3
因此,看来LLVM对编译器设计人员很有用。除了独立于源代码分析生成的代码之外,程序员是否还应该关心是否使用标准编译器或基于LLVM的编译器进行编译?
jinawee

4
如果您可以使用LLVM对其IR进行编译,那么可能会为您打开许多用于分析IR的工具。但是,如果您的工具仅能够分析本机二进制文件(例如x86),则无论是LLVM生成的二进制文件还是gcc生成的二进制文件,还是Intel编译器生成的文件,都没有区别。
Peter Teoh '18

73

LLVM(以前是指“低级虚拟机”,但现在不再是)是用C ++编写的编译器基础结构,旨在对所编写程序的编译时,链接时,运行时和“空闲时”进行优化。以任意编程语言。LLVM最初是为C / C ++实现的,其与语言无关的设计(并取得了成功)此后催生了各种各样的前端,包括Objective C,Fortran,Ada,Haskell,Java字节码,Python,Ruby,ActionScript,GLSL , 和别的。

阅读此内容以获得更多说明,
另请查看空载燕子


13
..因此,文档正在尝试说什么;虽然LLVM低级虚拟机的缩写,但该项目仅被命名为LLVM,而不是完整拼写的单词。
Jochem Kuijpers '18

2
之前它的缩写
略高,

2
总结评论。“低层虚拟机(LLVM)”应类似于“ LLVM(在项目生命周期的较早阶段表示“低层虚拟机”)”
ssokolow

52

根据“ LLVM核心库入门”一书(c):

实际上,名称LLVM可能表示以下任何一种:

  • LLVM项目/基础结构:这是几个项目的总括,这些项目一起构成了一个完整的编译器:前端,后端,优化器,汇编器,链接器,libc ++,compiler-rt和JIT引擎。单词“ LLVM”的含义例如在以下句子中:“ LLVM由多个项目组成”。

  • 基于LLVM的编译器:这是使用LLVM基础结构部分或完全构建的编译器。例如,编译器可能将LLVM用于前端和后端,但使用GCC和GNU系统库执行最终链接。LLVM在以下句子中具有此含义,例如:“我使用LLVM将C程序编译到MIPS平台”。

  • LLVM库:这是LLVM基础结构的可重用代码部分。例如,LLVM在句子中具有以下含义:“我的项目使用LLVM通过其即时编译框架生成代码”。

  • LLVM核心:在中间语言级别进行的优化和后端算法构成了项目开始的LLVM核心。LLVM在以下句子中具有此含义:“ LLVM和Clang是两个不同的项目”。

  • LLVM IR:这是LLVM编译器的中间表示。LLVM在诸如“我构建了将自己的语言翻译成LLVM的前端”之类的句子中使用时具有此含义。


35

LLVM基本上是一个用于构建编译器和/或面向语言的软件的库。基本要点是,尽管您拥有可能是最常见的编译器套件的gcc,但它并不是可重用的。从gcc提取组件并使用它来构建自己的应用程序是困难的。LLVM通过构建一套“模块化和可重用的编译器和工具链技术”很好地解决了这个问题,任何人都可以使用它来构建编译器和面向语言的软件。


6
那么LLVM是库,而Clang是编译器?
阿卜杜勒

11
Clang是LLVM的C / C ++前端编译器。它将C代码转换为LLVM位代码,该代码由后端编译器翻译为某种汇编语言。
Boris Mulder

6

LLVM编译器基础结构对于在代码上执行优化和转换特别有用。它还由许多服务于不同用途的工具组成。llvm-prof是一种性能分析工具,可让您执行执行性能分析以识别程序热点。Opt是一种优化工具,可提供各种优化途径(例如,消除死代码)。

重要的是,LLVM为您提供了编写自己的通行证的库。例如,如果您需要对传递给程序某些功能的某些参数进行范围检查,则编写简单的LLVM Pass就足够了。

有关编写自己的通行证的更多信息,请查看此http://llvm.org/docs/WritingAnLLVMPass.html

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.