什么是LLVM
- 官网:https://llvm.org/
-
The LLVM Project is a collection of modular and reusable compiler and toolchain technologies.
LLVM项目是一个模块化的、可重用的编译器和工具链技术的集合
- 创始人: Chris Lattner ,Swift之父
- 有些文章把LLVM当做 Low Level Virtual Machine(低级虚拟机)的缩写简称,官方描述如下:
The name "LLVM" itself is not an acronym; it is the full name of the project.
“LLVM”本身不是首字母缩略词;它是项目的全名
常见编译器
-
GCC
GCC(GNU Compiler Collection,GNU编译器套装),是一套由 GNU 开发的编程语言编译器。它是一套以 GPL 及 LGPL 许可证所发行的自由软件,也是 GNU计划的关键部分,亦是自由的类Unix及苹果电脑 Mac OS X 操作系统的标准编译器。
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++/Object-C/Object-C++ 编译器。
LLVM介绍
- LLVM是编译器的工具链的集合,Clang是使用LLVM的编译器,Clang必须调用连接器LLDB来产生可执行文件。
- LLVM是一个优秀的编译器框架,它也采用经典的三段式设计,
分为 frontEnd(前端) 、optimizer(优化器) 、backend(后端) 三层架构。-
前端
可以使用不同的编译工具对代码文件做词法分析、语法分析、语义分析,然后将分析好的代码转换成LLVM的中间代码IR(intermediate representation); -
优化器
只对中间表示IR操作,通过一系列的Pass对IR做优化; -
后端
负责将优化好的IR解释成对应平台的机器码。
-
1.png
LLVM的优点
中间表示IR代码编写良好,而且不同的前端语言最终都转换成统一的中间代码LLVM IR(LLVM Intermediate Representation)
如果需要支持一种新的变成语言,那么只需要实现一个新的前端
如果需要支持一种新的硬件设备,那么只需要实现一个新的后端
优化阶段是一个通用的阶段,它只针对统一的LLVM IR,不论是支持新的编程语言,还是支持新的硬件设备,都不需要对优化阶段做修改
LLVM现在被座位实现何种静态和运行时编译语言的通用基础结构(GCC家族、Java、.NET、Python、Ruby、Scheme、Haskell、D等)
相比之下,GCC的前端和后台没分的太开,前端后端耦合在一起,所以GCC为了支持一门新的语言,或者为了支持一个新的目标平台,就变的特别困难
例如:对于图1:
LLVM: 需要 3个编译器前端 、3个编译器后端
GCC: 因为耦合的原因需要
C-X86、C-PowerPC、C-ARM
Fortran-X86、Fortran-PowerPC、Fortran-ARM
Haskell-X86、Haskell-PowerPC、Haskell-ARM
- LLVM IR 是LLVM的中间表示,优化器就是对IR进行操作的,具体的优化操作由一些列的Pass来完成,当前端生成初级IR后,Pass会依次对IR进行处理,最终生成后端可用的IR。下图可以说明这个过程:
2.png
- 传统编译器比如 gcc 会将编译的整个过程揉在一块,但是 LLVM 采用全新的架构,
Clang介绍
- Clang是LLVM项目的一个子项目
- 基于LLVM架构的C/C++/Object-C编译器前端
- 官网 http://clang.llvm.org/
相比于GCC,Clang具有如下优点
编译速度块:在某平台上,Clang的编译速度显著的快过GCC(Debug模式下编译OC速度比GCC快3倍)
占用内存小:Clang生成的AST所占用的内存是GCC的五分之一左右
模块化设计:Clang采用基于库的模块化设计,易于IDE集成及其他用途的重用
诊断信息可读性强:在编译过程中,Clang创建并保留了大量纤细的元数据(metadata),有利于调试和错误信息更加友善
设计清晰简单,易于理解,扩展性强
Clang 与 LLVM
- 广义的LLVM ----------- 整个LLVM架构
- 狭义的LLVM ----------- LLVM后端(代码优化、目标代码生成)
3.png
LLVM与Clang及其关系: https://blog.csdn.net/xhhjin/article/details/81164076












网友评论