LLVM编译器
一、简介LLVM项目是模块化、可重用的编译器以及工具链技术的集合,由前端,优化器和后端组成,用于优化以任意程序语言编写的程序的编译时间、链接时间、运行时间以及空间时间,对开发者保持开放,并兼容已有脚本。各部分的作用:前端:词法分析、语法分析、语义分析、生成中间代码优化器:中间代码优化后端:生成机器码二、LLVM优势传统编译器分为三个阶段:前端-优化器-后端前端负责分析源代码,可以检查语法级错误,并
一、简介
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对一门语言进行编译的简图如下所示:
开放原子开发者工作坊旨在鼓励更多人参与开源活动,与志同道合的开发者们相互交流开发经验、分享开发心得、获取前沿技术趋势。工作坊有多种形式的开发者活动,如meetup、训练营等,主打技术交流,干货满满,真诚地邀请各位开发者共同参与!
更多推荐
所有评论(0)