浅谈LLVM编译器

GCC

Xcode 最早的编译器(Xcode 3.0及之前版本)不太智能,因为当时Xcode 当前的编译器是GCC,尽管GCC是一个相对较好的编译器,但是他跟IDE 之间的匹配性并不是太好。通常,编译器分为编译器前端和编译器后端。编译器前端主要负责的是展开预处理器宏定义 并将源代码转化为中间代码。编译器后端负责生成并优化机器代码。GCC实质上是一个后端编译器,他负责将源代码编译生成二进制代码。GCC 主要用来编译代码,而不是解析代码。这意味着苹果必须编写自己的解析器来为你提供调试功能。另外,GCC 使用的是 GPL 许可协议,这使得苹果不能直使用GCC,除非苹果将Xcode 的许可协议更改为GPL。由于苹果的解析器和 GCC 的基准代码不同,GCC 和 Xcode 之间经常会出现一些不一致。

LLVM-Clang

由于上面的这个问题,苹果在Xcode 4.2 之后 同iOS 5 一起发布,默认的编译器就是 LLVM 3.0 了。虽然 LLVM 的代码生成效率不如 GCC, 但是 LLVM 具有更好的模块化和可扩展性,编译速度也是GCC的两倍以上,有许多为LLVM 而开发的编译器前端,其中比较突出就是苹果的C language(即 Clang)。Clang 支持增量编译。开始使用 Xcode 4 的时候,你就会发现这个功能比较实用。另外,clang 的模块化使得它得以非常好地支持代码重构以及 Edit All in scope 等功能。也因此 LLVM 和 IDE 的深度集成使 Xcode 在编译器遇到错误的时候可以给iOS developer 提供 Fix-it 的功能。
如下图 所示:


屏幕快照 2017-05-08 上午11.42.49.png

同时苹果从 GCC 切换到 LLVM 的另一个目的是对 Objective-C 语言拥有更大的控制权。苹果通过添加对字面量大支持使得 Objectvie-C 更加简洁,也许只有对编辑器拥有控制权,苹果才能对语言作出这种改变,同样也是 LLVM 给了苹果 这种改变 Objective-C 语言的能力。

推荐阅读更多精彩内容