C语言编译器之二,Clang

二、Clang编译器

         Clang编译器是由APPLE公司的编译器大牛Chris Lattner主导下编写的,其目标是替换大名鼎鼎的GCC编译器;

2.1、Clang和GCC编译器架构

        从源代码到可执行程序一般经过预处理、编译、链接过程,而编译是编译器的工作,编译分为三个阶段,分别为前端、优化器、后端。

**i.**编译前端:将源代码转化成中间代码。其详细过程包括:词法分析、语法分析、生成中间代码;

**ii.****优化器:**对编译器生成的中间代码进行一些优化,最终提供给编译后端;

**iii.****编译后端:**根据不同的 cpu 架构,将中间代码汇编,产生汇编代码,最后解析汇编指令,生成目标代码,也就是机器码;

编译器的这种前端、优化器、后端的架构的优点是:

a.当为新的语言开发编译器时,只需要针对新的语言开发前端,产生标准通用的中间代码,这样优化器与后端可以不用修改;

b.当为新的架构开发编译器时,只需要针对新的架构开发后端,而无需修改前端和优化器。

         所以,这种架构对编译器的开发维护工作就简单许多,同时提升执行效率。

2.2、Clang起源

         GCC编译器从20世纪90年代就已经开发出来了,特别作为 Linux的当家编译器,GCC开源使得其广为流传,包括Apple在内,最开始也是使用GCC编译器,因为当时的Apple并没有自己的编译器,因此早期的XCODE使用GCC编译器编译Object-C,由于Object-C不断地引入新的特性,Apple公司不停与GCC组织协商改进GCC,可能当时的Apple还未有什么名气,GCC不太配合修改,这让Apple公司很是恼火。

         转机来了,2005年刚研究生毕业的Chris Lattner被Apple招致麾下,Chris Lattner可是精通编译器理论,其博士阶段的LLVM-GCC架构的编译器在其进入Apple公司后就被完善使用,Apple公司甚至将其当作替代GCC编译器的不二之选。但是,GNU组织出台了《GCC 运行环境豁免条款》从根本上限制了 LLVM-GCC 的开发,这让Apple公司下定决心,从新开始编写C编译器,由Chris Lattner牵头,这就是Clang编译器的诞生,基于LLVM架构,为LLVM Compiler 1.0,这个版本不支持C++。

         这就是早期XCODE同时支持GCC、LLVM-GCC、LLVM Compiler的原因:

     从XCODE4开始,也就是 Mac OS X 10.6版本系统上,Apple 宣布停止更新GCC编译器,这样GCC停留在GCC4.2版本,并建议大家使用LLVM Compiler 2.0(LLVM-Clang),该版本完全支持C++/ Objective-C++,并提供libc++库来支持新的C++ standard(C++0x标准),而GCC/LLVM-GCC支持的是GCC标准库libstdc++;

         从XCODE4.2开始,就默认使用LLVM-Clang,彻底抛弃了GCC;而LLVM-GCC毕竟也是亲儿子,改为一个GCC的插件DragonEgg。

       由于Clang设计之初就考虑到模块化设计,因此,清晰简单,出错提示更好,易于扩展,容易与IDE集成;而GCC由于早期设计只支持C语言,后面不断扩展C++/ Java/Ada/Fortran/Go等,虽然支持更多平台;更流行,广泛使用,支持完备,但是其代码接口耦合性强,更新维护和性能等较差。

         由于LLVM-Clang的优秀设计,Android NDK从r11开始建议大家切换到clang。并且把GCC标记为deprecated,将GCC版本锁定在GCC 4.9不再更新;Android NDK从r13起,默认使用Clang进行编译。但是暂时也没有把GCC删掉,Google考虑 libc++(LLVM-Clang的c++标准库)还不够稳定; Android NDK 在 r17 中宣称不再支持 GCC 并在后续的 r18 中删掉 GCC。现在GCC主战场只剩Linux跟部分Windows应用软件开发。

         现在最新LLVM版本号已经到了12.0.1版本,官方地址如下:

LLVM****编译器基础架构http://llvm.org/

Clang**:**http://clang.llvm.org/

**DragonEgg **– LLVM-GCC:http://dragonegg.llvm.org/

 二进制安装文件在github仓库中,地址为:

 https://github.com/llvm/llvm-project/releases/tag/llvmorg-12.0.1

        可见Clang也在x86/arm/powerpc架构下,及Linux系统下已经广泛支持,Clang与GCC进入激烈竞争的局面,对于吃瓜群众来说,应该是好事!

Clang起源具体细节可以参考“Mac OS X 背后的故事(作者王越)”,该文详细介绍了Apple公司从创立之初到现今富可敌国的公司,中间的起起伏伏,堪比一部电视连续剧。

代码交流 2021