入职新公司以后,开始着手基于LLVM开发编译器,之前在前东家那里主要做gcc的开发,所以也算是有点基础,但拿到LLVM后,除了知道
clang a.c -o a
之外,好像其他的都有点差异。现在经过了小一个月的学习,也算有点收获。因为网上关于LLVM的中文资料一直也不多,即使能找到的一些,也都是停留在怎么使用的层面,对于编译器开发工程师入门来说,感觉完全不够,所以我写写基础概念,能帮到大家也挺好的。
本文的参考资料主要是官网的资料,经过自己的摸索和提炼,整理成文,本文需要一定的编译器基础知识。
有任何建议或疑问,欢迎留言
安装与使用
这部分我不讲,网上资料挺多,Clang驱动程序把整个LLVM和clang都集成起来,和gcc的调用接口统一起来了,所以会用gcc的,Clang的使用也没啥问题。
LLVM和Clang的背景
它最初的编写者,是一位叫做Chris Lattner(个人主页)的大神,硕博期间研究内容就是关于编译器优化的东西,发表了很多论文,博士论文是提出一套在编译时、链接时、运行时甚至是闲置时的优化策略,与此同时,LLVM的基本思想也就被确定了,这也让他在毕业前就在编译器圈子小有名气。
而在这之前,Apple
公司一直使用GCC
作为编译器,后来GCC对Objective-C
的语言特性支持一直不够,Apple自己开发的GCC模块又很难得到GCC委员会的合并,所以老乔不开心。等到Chris Lattner毕业时,Apple就把他招入靡下,去开发自己的编译器,所以LLVM最初受到了Apple的大力支持。
LLVM最初设计时,因为只想着做优化方面的研究,所以只是想搭建一套虚拟机,所以当时这个的全称叫Low Level Virtual machine
,后来因为要变成编译器了么,然后官方就放弃了这个称呼,不过LLVM的简称还是保留下来了。
因为LLVM只是一个编译器框架,所以还需要一个前端来支撑整个系统,所以Apple又拨款拨人一起研发了Clang,作为整个编译器的前端,Clang用来编译C、C++和Objective-C。所以当我接触Apple编译器时,当时的帖子里都说使用Clang/LLVM来和gcc做对比,当然是在代码优化、速度和敏捷性上比gcc强不少。这里我有两个文章,分别是gcc评价它在代码诊断方面和Clang的比较以及Clang评价它和gcc(以及其他几个开源编译器)的优缺点,还是很客观的。相比来说,Clang/LLVM的完整性还不够,毕竟还在发展中。
对了,Clang的发音是/ˈklæŋ/
,这是官方