手写一个PrattParser基本运算解析器4: 简述iOS的编译过程
iOS项目的编译过程与PrattParser解析器
前面三篇我们看到了PrattParser解析器的工作原理, 工作过程, 我们了解到PrattParser解析器实际上是模拟了编译过程中的 词法分析
、语法分析
、语义分析
、 中间代码生成
这几个编译前端过程.
那么PrattParser解析器与我们实际开发iOS项目有什么样的联系呢? 其实, 编译前端的工作只是iOS编译过程中的一小部分工作. 对此, 这就不得不说一下iOS项目的编译过程了.
首先, 我们先说结论, 对于一个Objective - C
项目来说, LLVM
中的 Clang
作为编译器, 负责代码编译的主要过程.
但是对于一个Swift项目, 编译前端的工作则是由 Swift
自己编写的编译器完成, 中间代码优化
和 编译后端的工作
仍然是 LLVM
中的 Clang
来完成的.
接下来, 我们就结合着实际 OC
项目 和 Swift
项目 的编译过程来具体说说iOS的编译过程.
OC项目的编译过程
对于一个 OC项目
的项目编译过程来说, 就是从你点击运行 Run
或者 Build
开始的.
那么我们怎么看一下一个iOS项目中编译过程都做了哪些事情呢? 我们如图所示需要点击xcode开发工具的 Show the Report navigator
, 则可以查看我们所有的运行, 编译, 单元测试记录.
选择一次编译记录, 我们发现具体的编译过程是如下图所示的.
上图主要分为三个编译过程.
-
Prepare build
: 准备阶段, 主要是创建一些编译过程的文件夹, 以及创建编译描述. -
Build target Pods-xxx
: 编译项目依赖cocoapods的相关三方库, 并且制作对应的静态库文件. 这里就不过多叙述了. -
Build target OCBuild
: 编译项目阶段, 编译过程如下所示.上图的蓝色区域
内部就是执行了 LLVM 相关的编译前端, 编译后端
的相关工作. 也就是说 PrattParser解析器实际上只是模拟了其中编译前端的工作. 虽然占据的步骤很少, 但是却是整个App编译过程中最重要的一部分.另外由于App编译步骤的改动, 最新的这一版的App编译顺序已经是和以前App编译步骤顺序都不同了, 但是在本质上它们的工作内容大体上是一致的.
Swift项目的编译过程
Swift项目
的编译过程实际上在外部看起来和 OC项目
的过程基本上是一致的. 这里就不过多叙述了.
对于 asset资源编译过程
LaunchScreen Main编译过程
app签名过程
app合法性验证过程
app打包过程
这样的一些过程, 我们只需要了解即可. 我们要深究的是 在编译源码的过程中, OC项目
与 Swift项目
都有哪些不同之处?
OC 与 Swift 编译代码过程
前面我们说过对于一个Objective - C
项目来说, LLVM
中的 Clang
作为编译器, 负责代码编译的主要过程. 但是对于一个Swift项目, 编译前端的工作则是由 Swift
自己编写的编译器完成, 中间代码优化
和 编译后端的工作
仍然是 LLVM
中的 Clang
来完成的.
在编译OC源代码的过程具体的主要是这样的. 整个过程全部由 LLVM
来构建. 生成的中间代码为 LLVM IR
的形式的.
对于Swift编译过程来说, 和编译OC源代码还是有一定区别的.
由于 Swift编译器
作为整个链路的编译前端, 同时我们根据官方的Swift编译器架构说明
, Swift编译器
并不是直接生成 LLVM IR
形式的中间代码, 而是生成 SIL
格式的中间代码, 经过优化之后, 才会最终生成 LLVM IR
形式的中间代码.
所以对于Swift编译过程来说, 大体的流程图应该是这样的.
总结
通过这样的对比, 我们就对iOS编译过程以及PrattParser
在iOS编译过程中到底是模拟了哪个过程有了大体的了解.
同时, PrattParser解析器
这一个系列就算小完结了, 如果有问题, 欢迎评论指导, 骚栋这里感谢了~