iOS App 编译过程

这篇文章是对于自己学习 App编译过程的一个总结

学习的相关文章

iOS App的编译过程
iOS 编译过程的原理和应用
iOS 中的静态库与动态库,区别、制作和使用

本文的大纲

大纲.png

为何要了解

  1. 自己的兴趣,解开一些疑惑;
  2. 有利于解决一些编译过程中出现的问题;
  3. 对于优化App有很大的帮助。

什么是编译

为什么要编译

我们通常所使用的编程语言编写的代码,计算机的CPU(只能执行二进制代码)无法执行,所以要编译。
为什么要编译

什么是编译

利用编译程序将高级语言所编写的代码变为CPU可执行的代码的过程就叫编译。


编译_百度词条.png

App的编译过程

我分别用OC和Swift语言创建两个Demo,通过BulidLog看一下整个编译过程:


BuildLog_OC.png

BuildLog_Swift.png

Build的得到的.app也可以通过查看包内容,直观的看到得到的文件


.app包内容.png

根据图中和参考的文章总结一下 iOS 项目编译过程:

  1. 写入辅助文件:将项目的文件结构对应表、将要执行的脚本、项目依赖库的文件结构对应表写成文件,方便后面使用;
  2. 创建App架构:为填充后面步骤编译得到的文件等;
  3. 运行预设脚本:Cocoapods 会预设一些脚本,当然你也可以自己预设一些脚本来运行。这些脚本都在 Build Phases 中可以看到;
  4. 编译.m文件:这个过程是由LLVM完成的,编译成一个可执行文件(Mach-0);
  5. 链接编译后得到的文件;
  6. 拷贝项目中的资源,比如 图片资源;
  7. 编译 storyboard
  8. 编译 asset文件:图片如果使用 Assets.xcassets 来管理图片,那么这些图片将会被编译成机器码,除了 icon 和 launchImage;
  9. 处理info.plist ;
  10. 执行CocoaPod脚本;
  11. 拷贝swift标准包;
  12. 构建.app并签名;
  13. 完成打包。

以上,就是iOS项目大体的编译过程,下面说一下解释代码用到的LLVM

什么是LLVM

The LLVM Project is a collection of modular and reusable compiler and toolchain technologies. Despite its name, LLVM has little to do with traditional virtual machines. The name "LLVM" itself is not an acronym; it is the full name of the project.
LLVM项目是模块化、可重用的编译器和工具链技术的集合。尽管名为LLVM,但它与传统的虚拟机几乎没有关系。“LLVM”这个名字本身并不是首字母缩略词;这是项目的全称。

LLVM在编译过程中分为了三个模块: 前端、中间优化器和后端 。(跟web前端,service后端没有任何关系)。
LLVM各个模块的作用:

  • 前端:对目标语言代码进行语法分析,语义分析,生成中间代码。在这个过程中,会进行类型检查,如果发现错误或者警告会标注出来在哪一行;
  • 中间优化器:对中间代码进行优化,去除冗余代码,这个过程会进行BitCode的生成,链接期优化等;
  • 后端:先进行与机器无关的代码优化,生成汇编语言,在生成汇编语言之后会再进次进行与机器相关的代码优化,最后将各个文件的机器代码链接。

在iOS中,OC和Swift两种语言的编译在前端是有差别的:OC中使用的编译器前端为:Clang,在Swift中使用的编译器前端为swift自己编写的,这个我们可以在BuildLog里面具体看到。

BuildLog_OC_compiler.png

BuildLog_Swift_compiler.png

OC的文件编译处理过程:

Objective-C 的文件中,只有 .m 文件会被编译 .h 文件只是一个暴露外部接口的头文件,它的作用是为被编译的文件中的代码做简单的共享,并且因为OC没有private和public的用法,用.h和.m来实现private和public。

  1. 预处理 :处理一些预处理指令( 比如#define、#ifdef,#else,#endif等)并将预处理后的代码进行符号化处理,以便下一步进行词法分析和语义分析;
  2. 词法分析和语义分析:
    <1> 将符号化的代码抽象为语法树(abstract syntax tree – AST);
    <2> 静态分析:对语法树进行遍历分析,包括类型检查、实现检查(某个类是否存在某个方法)、变量使用,还会有一些复杂的检查,例如在 Objective-C 中,给某一个对象发送消息(调用某个方法),检查这个对象的类是否声明这个方法(但并不会去检查这个方法是否实现,这个错误是在运行时进行检查的),如果有什么错误就会进行提示。因此可见,Xcode 对 clang 做了非常深度的集成,在编写代码的过程中它就会使用 clang 来对代码进行分析,并及时对代码错误进行提示。
  3. 生成 LLVM 代码(也就是中间代码LLVM Intermediate Representation LLVM IR),并将代码递交给优化器,这也是LLVM前端 Clang的最后一步;
  4. 优化:将一些不合适且消耗内存的代码进行优化;
  5. 生成目标文件:这之后就是由LLVM后端完成了,将优化过的代码根据不同架构的 CPU 转化生成汇编代码,再生成对应的可执行文件,这样对应的 CPU 就可以执行了;
  6. 生成可执行文件(Mach - 0)。

以上的文件编译流程在文章的开头链接里有详细步骤和说明。

Swift的文件编译处理过程:

Swift 编译器架构

Swift编译器官方解释.png

总体而言,Swift编译器主要负责将Swift源代码转换为高效、可执行的机器代码。但是,Swift编译器前端还支持许多其他工具,包括与语法着色、代码完成和其他便利的IDE集成。本文件对Swift编译器的主要组件进行了高层描述:

  • 解析:解析器是一个简单的递归解析器(在lib/Parse中实现),带有一个集成的、手工编码的lexer。解析器负责生成没有任何语义或类型信息的抽象语法树(AST),并对输入源的语法问题发出警告或错误。
  • 语义分析:语义分析(在lib/Sema中实现)负责将解析后的AST转换为结构良好的、完全类型检查的AST形式,为源代码中的语义问题发出警告或错误。语义分析包括类型推断,如果成功,则表明从生成的经过类型检查的AST生成代码是安全的。
  • Clang导入:Clang导入器(在lib/ClangImporter中实现)导入Clang模块,并将它们导出的C或Objective-C api映射到相应的Swift api中。产生的导入的ast可以通过语义分析来引用。
  • SIL生成:Swift中间语言(SIL)是一种高级的、特定于Swift的中间语言,适用于Swift代码的进一步分析和优化。SIL生成阶段(在lib/SILGen中实现)将类型检查的AST降低为所谓的“原始”SIL。SIL的设计在doc /SIL.rst中进行了描述。
  • SIL保证转换:SIL保证转换(在lib/SILOptimizer/Mandatory中实现)执行影响程序正确性的附加数据流诊断(例如使用未初始化的变量)。这些转换的最终结果是“规范的”SIL。
  • SIL优化:SIL优化(在lib/Analysislib/ARClib/LoopTransformslib/Transforms中实现)对程序执行额外的高级特定于swift的优化,包括(例如)自动引用计数优化、去虚拟化和泛型专门化。
  • LLVM IR生成:IR生成(在lib/IRGen中实现)降低SIL到LLVM IR,此时LLVM可以继续优化并生成机器代码。

生成LLVM IR 之后的步骤就跟OC一样了。

与编译相关 (内容太多,未完待续)

Build Tabs

iOS Build Tabs -- Build Settings

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 205,132评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 87,802评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,566评论 0 338
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,858评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,867评论 5 368
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,695评论 1 282
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,064评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,705评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 42,915评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,677评论 2 323
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,796评论 1 333
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,432评论 4 322
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,041评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,992评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,223评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,185评论 2 352
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,535评论 2 343

推荐阅读更多精彩内容