iOS进阶之路——理解 Xcode 编译系统

image.png

任何 iOS 源代码在设备上运行之前都需要编译器的一系列处理,这个过程通常由 Xcode Build System 完成。在这篇文章中,我将介绍 Xcode Build System 的每一个部分。
为何要学编译知识
说说 OCLint 、SwiftLint 实现原理是怎样的?
如何编写 Clang 插件?
Obfuscator-LLVM 在 iOS 中如何实现混淆加固?
iOS 中 Bitcode 到底是如何优化 IPA 包的?
如果以上问题你都可以说个大概,请忽略本文,如果你对以上问题一知半解,但又很感兴趣,那么学习并掌握编译原理相关知识的过程中,你便会自己找到答案,好了接下来我将大概的介绍 iOS 开发中需要了解的编译流程。

语言处理系统
语言处理系统让自己输出一个可执行程序的一组任意源语言编写的指令。它允许程序员使用高级语言而不是写作机器代码大大减少了编程的复杂性。

我们日常使用的语言处理系统 iOS 或 macOS 开发 叫做 Xcode Build System。
Xcode Build System
Xcode 构建系统的主要目的是协调执行各种构建任务,最终将产生一个可执行程序。
Xcode 通过运行一系列编译器工具集将 iOS 源码按一定的顺序编译链接生成可执行文件,而无需你手动操作,关心编译链接背后复杂的过程。
大部分的语言处理系统,包括 Xcode Build Sytem,包括以下 5 个部分:

Preprocessor

Compiler

Assembler

Linker

Loader

这五部分组合起来是下面的流程图:


image.png

让我们仔细看看每一个步骤。
Preprocessing
预处理步骤的目的是将你的程序做一些处理然后可提供给编译器。它会处理宏定义、发现依赖关系、解决预处理器指令。
Xcode 解决依赖关系通过底层 llbuild 构建系统。它是开源的,你可以在 Github swift-llbuild 页面了解更多信息。

Compiler
编译器是一个程序,将一种语言的源程序用另一种语言映射到一个语义上等价的目标程序。换句话说,它转换Swift、objective - C和C / C++ 代码到机器码。
Xcode 使用两个不同的编译器:一个用于 Swift ,另一个用于Objective - C, Objective - C + +和 C / C++文件。
clang 是苹果官方的 C 语言编译器。它是开源在:swift-clang。
swiftc 是 Xcode 用来编译和运行 Swift 源代码的 Swift 编译器。
编译器工作流程如下:

image.png

编译器由两个主要部分:前端和后端。
前端负责词法分析,语法分析,生成中间代码;它还创建并管理符号表,收集关于源程序的信息。

符号表存储名称的变量,函数,类,你的名字,每个符号映射到特定的数据。
编译原理之美

Swift 编译器,中间语言表示名为 Swift Intermediate Language(SIL)。它是用于进一步分析和优化的代码。不可能直接从 Swift 中间语言生成机器代码,因此 SIL 经历了一系列转变到 LLVM 中间表示。
后端以中间代码作为输入,进行行架构无关的代码优化,接着针对不同架构生成不同的汇编代码。

Assembler
Assembler 翻译开发者可读的汇编代码为可重定位的机器码,最终生成包含数据和代码的 Mach-O 文件。
机器代码是一种数字语言,表示一组指令,可以直接由 CPU 执行。它被是可重定位的,因为无论目标文件的地址空间在哪,它将执行的指令相对地址。
Mach-O 文件是一种特殊的 iOS 和 MacOS 文件格式,操作系统用它来描述对象文件、可执行文件和库。它是一串字节组合形成的有意义的程序块,将运行在 ARM 处理器上或英特尔处理器。

Linker
链接器将各种对象文件和库链接合并为一个可以在 iOS 或 macOS 系统上运行的 Mach-O 可执行文件。链接器主要有两种文件作为输入,包括这些对象文件的汇编程序和库的几种类型(.dylib, .tbd 和 .a)。
链接器的作用,就是完成变量、函数符号和其地址绑定这样的任务。例如,如果在代码中使用 printf , 链接器链接这个符号和 libc 库 printf 函数实现的地方。通常在编译阶段通过创建符号表来解决不同对象文件和库的引用。

Loader
最后,加载程序是操作系统的一部分,将一个程序加载到内存中,并运行执行它。加载程序负责分配运行程序内存空间和初始化寄存器所需的初始状态。
总结
作为 iOS 和 macOS 开发者我们主要使用 Xcode Build System 编译构建我们的应用程序。它的主要组件是:预处理、编译器、汇编器、连接器和加载程序。Xcode 使用不同的编译器(swiftc 和 clang)编译 Swift 和 Objective-C。
对于初学者和经验丰富的开发人员来说学习掌握 编译原理基础知识都颇有益处,这里有一张宫文学老师《编译原理之美》的关于编译知识结构体系的思维导图,可以拿来对每个知识点系统学习。

image.png

原文链接:https://juejin.im/post/5ee216ee6fb9a047f558d594

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