基础知识

编译过程

从源代码文件到可执行文件

以C语言程序为例子:

程序经历了预处理、编译、汇编、链接
编译后为汇编文件、汇编之后的文件即为.o文件(二进制文件),经过链接后即变为可执行文件(二进制文件)

编译将高级语言翻译为汇编语言
汇编即将语言翻译为机器语言指令,并打包为可重定位目标程序,即.o文件

LLVM和Clang的历史

GCC

是GUN开发的编程语言编译器,是自由类的Unix和苹果电脑Mac OS X操作系统标准编译器,原本用来处理C语言,后来扩展为可以处理C++、Fortran、Pascal、Objective-C、Java, 以及 Ada与其他语言

LLVM

LLVM 是 Low Level Virtual Machine 的简称,这个库提供了与编译器相关的支持,能够进行程序语言的编译期优化、链接优化、在线编译优化、代码生成。简而言之,就是可以作为多种语言编译器的后台使用

Clang是C++编写的、基于LLVM的C/C++/Objective C/Objective C++ 编译器,其目标就是超越GCC

LLVM历史:
Apple早期是用GCC作为官方编译器,但是苹果给Object-C新增了很多特性,但是GCC开发者并不愿意给Apple实现,因此Apple就找到了毕业的Chris Lattner,其在学校就突出了一整套的完整的在编译时、链接时、运行时、甚至是在闲置时优化程序的编译思想,即为LLVM,其用GCC作为前端来对于用户程序进行语意分析产生IF(Intermidiate Format中间格式)然后用LLVM分析完成代码的优化和生成

Clang历史:
Apple吸收了Chris Lattner后,觉得GCC庞大而且笨重,然而自己OC语言在gcc中的优先级很低,再加上一些许可证方面的要求。Apple决定写一个只支C、C++、Object-C语言的前端Clang,来完全替代GCC