iOS底层探索(二) - 写给小白看的Clang编译过程原理
写在前面:
本系列为 『iOS底层探索系列』第一篇,本文源自本人的学习记录整理与理解,其中参考阅读了部分优秀的博客和书籍,尽量以通俗简单的语句转述。引用到的地方如有遗漏或未能一一列举原文出处还望见谅与指出,另,文章内容如有不妥之处还望指教。十分感谢。
入门起步
从编译器说起
-
为什么需要编译?
- 大家都知道,我们的计算机CPU只能读懂机器码(machine code,也就是由一堆0和1组成的编码);
- 但我们现在编写的代码并不是机器码,而是高级编程语言(Objective-C、Swift、Java、...),最终也可以被计算机所执行,
- 这就需要编译了,在编译的过程中,编译器的作用便是把我们的高级编程语言通过一系列的操作转化成可被计算机执行的机器语言。
ps:[更详细的解析可以自行百度]
-
编译器是如何设计的?
-
经典的三段式设计(three phase design):
前端(Frontend)--优化器(Optimizer)--后端(Backend)
(见下图)
- 其中前端负责分析源代码,可以检查语法级错误,并构建针对该语言的抽象语法树(AST)
- 抽象语法树可以进一步转换为优化,最终转为新的表示方式, 然后再交给让优化器和后端处理
- 最终由后端生成可执行的机器码
-
为什么要使用三段式设计?优势在哪?
- 首先解决了一个很大的问题:假如有N种语言(C、OC、C++、Swift...)的前端,同时也有M个架构(模拟器、arm64、x86...)的Target,是否就需要 N × M 个编译器?
- 三段式架构的价值就体现出来了,通过共享优化器的中转,很好的解决了这个问题。
-
假如你需要增加一种语言,只需要增加一种前端;假如你需要增加一种处理器架构,也只需要增加一种后端,而其他的地方都不需要改动。这复用思想很牛逼吧。(如下图)
-
- 编译源文件有哪些主要步骤?
- 先列举一些整个编译过程的主要步骤,后面再详细介绍每个步骤都做了哪些事情。
- 主要编译步骤如下:
1. 源代码(source code) -> 2. 预处理器(preprocessor) -> 3. 编译器(compiler) -> 4. 汇编程序(assembler) -> 5. 目标代码(object code) -> 6. 链接器(Linker) -> 7. 可执行文件(executables)
Xcode编译器发展简史
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的时代正式完成
- 为什么苹果的Xcode会使用Clang+LLVM取代GCC?
- 这里面有些历史原因。毕竟GCC是第三方开源的,不属于苹果维护也不能完全掌控其开发进程,Apple为Objective-C增加许多新特性,但GCC开发者对这些支持却不友好;Apple需要做模块化,GCC开发者却拖着迟迟不实现。这能忍?
- 随着Apple对其IDE(也就是Xcode)性能的要求越来越高,最终还是从零开发了一个Clang前端加LLVM后端的编译器,这个编译器的作者是大名鼎鼎的Swift之父Chris Lattner。
- Clang比GCC优秀在哪些方面?
- 传说新的Clang编译器编译Objective-C代码速度比GCC快3倍
- 并且提供了友好的代码提示
Clang 的简介
“Clang: a C language family frontend for LLVM”
LLVM的C语言家族(C、C++、OC)前端。---- Clang
- 上面是官网对于Clang的一句话介绍,其实 Clang 就是上文所提到的编译器前端
- 用途:输出代码对应的抽象语法树(Abstract Syntax Tree, AST),并将代码编译成LLVM Bitcode。接着在后端(back-end)使用LLVM编译成平台相关的机器语言。
LLVM 的简介
- LLVM :顾名思义是(Low Level Virtual Machine)底层虚拟机?注意了,已经不是了!
- 官网都说了:LLVM就是这个项目的全称,包含LLVM中介码(LLVM IR)、LLVM除错工具、LLVM C++标准库等一套工具,和传统底层虚拟机并没什么关系。
PS:下一篇将介绍Clang与LLVM的详细编译过程,欢迎关注。
参考文档
http://clang.llvm.org/
http://www.aosabook.org/en/llvm.html
http://history.programmer.com.cn/9436/
https://zh.wikipedia.org/wiki/Clang
https://zh.wikipedia.org/wiki/LLVM