在Linux下大家可能都听过或看过GNU或LLVM,GNU或LLVM是什么呢?他们有什么区别?GCC和Clang又有什么区别?iOS开发中也常见到LLVM和Clang,如果对这些不了解,开发起来多多少少都会有点困惑,而且大家都用多了IDE可能也不常注意到,有时出了一些问题就慌了,例如安装完codeblocks首先也是要配置编译器和调试器,本节就是专门讨论编译器的,作为编程开发最基本的工具,我们必须对它有个了解,而GCC和LLVM是编译器中的两个大牛。对于开发环境的部署,可以使用GCC+GDB、LLVM+Clang或者集成开发环境(IDE),在Windows下一般使用集成开发环境,Linux下一般使用GCC,MAC下可以使用LLVM+Clang或相关的IDE如Xcode。
一、GNU和GCC
GNU是什么?GNU首先是一个自由的操作系统,名字来自GNU’s Not Unix,该操作系统起源于GNU计划,GNU项目起始于1987年,它包含大量的UNIX软件,是一个软件集合,Linux下有大量的GNU软件,GNU编译器就是GNU项目的软件之一,GNU的编译器称为GNU编译器套件(GNU Compiler Collection),简称GCC。所以在我们编程角度看来,GNU是一个软件集合,GCC是该集合中的软件之一。
GCC原本只支持编译C语言,后来扩展支持其它语言,包括C++、Java、OC等。GCC属于传统的编译器架构,包括前端处理器、优化器、后端处理器,前端处理主要包括语法分析和词法分析(可查看语法分析的运行机制、词法分析和词法分析生成器),优化器主要是优化代码,后端处理则将中间代码生成对应硬件平台的目标机器码。GCC在所有平台上都使用一个前端处理器,不同的平台使用不同后端处理,GCC仍然是跨平台软件的编译器首先并且一直是开源编译器的标准。
二、LLVM和Clang
同样LLVM也是一个软件项目,不过该软件项目主要是提供编译器的基础设施,目前不少编译器都是基于LLVM开发的,它使用C++写成。LLVM最早起源于底层虚拟机(Low Level Virtual Machine),LLVM利用虚拟技术使编译时期、链接时期、运行时期和闲置时期达到最优化,广泛支持多种语言的编译和优化。
LLVM由前端、中间段、后端和链接器组成,其中LLVM最显著的特点是使用中间端表达式(IR,LLVM有自己的IR语言)生成中间码,LLVM编译器针对中间码进行优化,目前苹果已经将编译器从GCC换为LLVM。
那么Clang又是什么呢?Clang也是一个编译器,Clang是一个C/C++、OC编程语言的编译器前端,使用LLVM作为后端,它是一个GCC的替代品,在Mac开发中,Clang无疑比GCC强大好多,因为Clang就是针对苹果自身产品进行开发的,在使用Clang编译的时候需要同时按照LLVM和Clang。
三、开发环境部署和集成开发环境(IDE)
集成开发环境和编译器有什么联系?一开始的编程开发并不需要IDE,想一下你写完代码就使用GCC编译链接运行,那不是很简单,但是如果有很多的源文件,那么每次运行都需要重复类似的动作那就很累了,所以这就是IDE产生的根本原因,IDE并不是必须的,只是方便开发而已,尤其是在windows下开发,IDE的功能不仅提供编译、链接、运行和调试,还提供了各种的功能,所以不少人可能并不真的知道IDE的实质功能。
在linux下的标准项目开发提供make和makefile构建工具,另外还有cmake,总的来说这些工具和IDE都是为了简化我们手工编译或者实现更好的调试。
对于开发环境的部署,Linux下推荐使用GCC,也可以安装LLVM+Clang。Windows下可以使用VS或者codeblocks,但是VS对C标准支持的并不好,VS都是使用自家的编译器,VC6太老了就不要用了,另外还推荐使用Dev C++,当然也可以用Eclipse。mac下就是xcode了默认编译器使用LLVM+Clang。