LLVM是Apple官方支持的编译器,编译器的前端是Clang,这两个工具都集成到了Xcode中。在这篇文章中,让我们来看看LLVM和Clang背后的故事。长期以来,Apple一直使用GCC作为官方编译器。GCC作为开源界的编译器标准一直做得很好,但苹果对编译工具提出了更高的要求。GCC的开发者仗着自己在开源社区的地位,忽略了Apple的Objective-C语言的很多新特性。甚至当苹果要做的很多功能需要以模块化的方式调用GCC时,GCC也一直不做。这种情况一般企业都未必能承受得住,更何况是乔布斯领导下的苹果呢?与GCC的不和让Apple一直在寻找一种高效、模块化、协议更宽松的开源编译器替代品。最终,Apple爱上了ChrisLattner的LLVM。还在苹果工作的ChrisLattner是个大神。2000年毕业于俄勒冈州波特兰大学计算机专业,同年赴UIUC(伊利诺伊大学香槟分校)攻读计算机硕士和博士学位。在UIUC期间,他的GPA为4.0(满分),继续研究和探索编译器的未知领域,发表了多篇论文。在他的硕士论文中,他提出了一整套在编译时、链接时、运行时甚至空闲时优化程序的编译思想,为LLVM奠定了基础。当ChrisLattner还是一名博士生时,LLVM更加成熟。首先,LLVM以GCC为前端,对用户程序进行语义分析,生成IF(IntermidiateFormat),然后,LLVM利用分析结果完成代码优化和生成。这项研究让ChrisLattner在2005年毕业时成为知名的编译器专家。因此,他很早就被苹果选中,成为其编译器项目的骨干。进入苹果后,ChrisLattner首先在OpenGL团队做了代码优化,将LLVM运行时编译放在OpenGL栈上,让OpenGL栈产生更高效的图形代码。这个强大的OpenGL实现被用于后来的MacOSX10.5版本中。同时将LLVM的链接优化直接添加到Apple的代码链接器中。好的工具一定有用。几年后,LLVM的机会来了。MacOSX10.6SnowLeopard的新特性充分受益于LLVM技术,这个版本也是将LLVM推向真正成熟的重大契机。“一篱三桩,一英雄三帮”,LLVM可以实现很多华丽的功能,这要归功于LLVM自己的新前端——Clang。GCC系统庞大且笨重,所以Apple决定从头开始编写C、C++、Objective-C语言的前端Clang,以期完全取代GCC。Clang于2007年开始开发,C编译器最先完成。2009年,Objective-C编译器完全可以在生产环境中使用。一年后,Clang基本实现了对C++编译的支持。Clang的一个重要特点是编译速度快,占用内存少,代码质量比GCC高。得益于自身强大的架构和Apple的大力支持,Clang的功能越来越丰富,支持的项目也越来越多,比如MacOSX10.6时代的Xcode和InterfaceBuilder,都是由Clang编译的。Clang的加入也代表了LLVM真正的成熟。另外,Clang的一个重要衍生项目是一个静态分析工具,可以在编译时自动分析程序的逻辑,发现程序中可能存在的bug。此函数称为ARC。ARC的实现让当时的开发者大吃一惊。除了LLVM核心和Clang,LLVM还包括一些重要的子项目,比如一个原生支持调试多线程程序的调试器LLDB,一个C++标准库libstdc++。不仅仅是苹果,很多项目和编程语言都从LLVM获得了关键技术。从LLVM的发展历程可以看出,LLVM在短短五年时间(2005-2010)取得了飞速的发展,充分体现了Apple对产品技术的远见和执行力。也正是因为如此,LLVM成为了领先的开源软件技术之一。大神ChrisLattner也在2010年获得了ProgrammingLanguagesSoftwareAward(编程语言软件奖)。大神的故事还没有结束。ChrisLattner于2010年7月开始设计Swift编程语言,他实现了该语言的大部分基础设施。2011年底,几位大神加入了项目。2013年7月,Swift项目成为苹果开发者工具部门的主要关注点。2014年6月2日,Swift语言正式发布,ChrisLattner和他的作品再次赢得了广大开发者的惊叹。目前,ChrisLattner是Apple的开发者工具总监,领导Xcode、Instruments和Compiler团队。【本文为专栏作家周兆雄原创文章,作者微信公众号:周氏逻辑(logiczhou)】
