编译以及LLVM简介
编译器的作用便是把我们的高级编程语言(Objective-C)通过一系列的操作转化成可被计算机执行的机器语言(MachineCode)。
经典的三段式设计(three phase design):前端(Frontend)–优化器(Optimizer)–后端(Backend)。
LLVM
LLVM 是一个开源的,模块化和可重用的编译器和工具链技术的集合,或者说是一个编译器套件。
可以使用 LLVM 来编译 Kotlin,Ruby,Python,Haskell,Java,D,PHP,Pure,Lua 和许多其他语言
LLVM 核心库还提供一个优化器,对流行的 CPU 做代码生成支持。
LLVM 同时支持 AOT 预先编译和 JIT 即时编译
2012年,LLVM 获得美国计算机学会 ACM 的软件系统大奖,和 UNIX,WWW,TCP/IP,Tex,JAVA 等齐名。
Clamg
Clang 是 LLVM 的子项目,是 C、C++ 和 Objective-C 编译器,目标是替代传统编译器 GCC 。Clang 在整个 Objective-C 编译过程中扮演了编译器前端的角色,同时也参与到了 Swift 编译过程中的 Objective-C API 映射阶段。
Clang 的主要功能是输出代码对应的抽象语法树( AST ),针对用户发生的编译错误准确地给出建议,并将代码编译成 LLVM IR。
Clang 的特点是编译速度快,模块化,代码简单易懂,诊断信息可读性强,占用内存小以及容易扩展和重用等。
我们以 Xcode 为例,Clang 编译 Objective-C 代码的速度是 Xcode 5 版本前使用的 GCC 的3倍,其生成的 AST 所耗用掉的内存仅仅是 GCC 的五分之一左右。
Xcode3 以前: GCC;
Xcode3:增加LLVM,GCC(前端) + LLVM(后端);
Xcode4.2:出现Clang - LLVM 3.0成为默认编译器;
Xcode4.6:LLVM 升级到4.2版本;
Xcode5:GCC被废弃,新的编译器是LLVM 5.0,从GCC过渡到Clang-LLVM的时代正式完成,Objective-C与swift都采用Clang作为编译器前端
Clang-LLVM架构
Clang-LLVM架构中,Clang作为前端生成中间代码IR,LLVM优化器进行优化,LLVM机器码生成器生成不同的机器码。
再具体一些的话:
参考:
[1]: http://www.helloted.com/ios/2020/06/03/llvm-clang/