一、简介

LLVM项目是模块化、可重用的编译器以及工具链技术的集合,由前端,优化器和后端组成,用于优化以任意程序语言编写的程序的编译时间、链接时间、运行时间以及空间时间,对开发者保持开放,并兼容已有脚本。

各部分的作用:

  • 前端:词法分析、语法分析、语义分析、生成中间代码
  • 优化器:中间代码优化
  • 后端:生成机器码

二、LLVM优势

传统编译器分为三个阶段:

前端-优化器-后端

前端负责分析源代码,可以检查语法级错误,并构建针对语言的抽象语法树(AST);抽象语法树可以进一步优化,最终转为新的表示方式,然后再交给优化器和后端处理。最终由后端生成可执行的机器码:
在这里插入图片描述

LLVM也分成三个阶段,但是设计上略微有些区别,LLVM不同的就是对于不同的语言它都提供了同一种中间表示:
在这里插入图片描述
前端可以使用不同的编译工具对代码文件做词法分析以形成抽象语法树AST,然后将分析好的代码转换成LLVM的中间表示IR(intermediate representation);中间部分的优化器只对中间表示IR进行操作,进行一系列优化;后端负责将优化好的IR解释成对应平台的机器码。LLVM的优点在于:中间表示IR代码编写良好,而且不同的前端语言最终都转换成同一种的IR。

三段式的设计首先解决了一个很大的问题:假如有N种语言(C、C++、Java)等的前端,同时也有M个架构(模拟器、arm64、x86)的target,就需要N*M个编译器。这时三段式通过共享优化器的方式,很好的解决了这个问题。

三、Clang和LLVM关系

Clang是一个C++编写、基于LLVM、发布于LLVM BSD许可证下的C/C++/Objective-C/Objective-C++编译器。相比于LLVM,Clang是一个高度模块化开发的轻量级编译器,它的编译速度快、占用内存小、非常方便进行二次开发。

LLVM和Clang的关系可以用下面的图概括说明:
在这里插入图片描述
从上面的图中,我们可以看出,LLVM与Clang都是C/C++的编译器套件。对于整个LLVM的框架来说,包含了Clang,因为Clang是LLVM的框架的一部分,是它的一个C/C++的前端。

四、LLVM编译工具链编译流程

使用LLVM对一门语言进行编译的简图如下所示:
在这里插入图片描述

Logo

瓜分20万奖金 获得内推名额 丰厚实物奖励 易参与易上手

更多推荐