iOS App 編譯過程

這篇文章是對于自己學(xué)習(xí) App編譯過程的一個總結(jié)

學(xué)習(xí)的相關(guān)文章

iOS App的編譯過程
iOS 編譯過程的原理和應(yīng)用
iOS 中的靜態(tài)庫與動態(tài)庫勇垛,區(qū)別、制作和使用

本文的大綱

大綱.png

為何要了解

  1. 自己的興趣方篮,解開一些疑惑付秕;
  2. 有利于解決一些編譯過程中出現(xiàn)的問題;
  3. 對于優(yōu)化App有很大的幫助锉矢。

什么是編譯

為什么要編譯

我們通常所使用的編程語言編寫的代碼梯嗽,計算機的CPU(只能執(zhí)行二進制代碼)無法執(zhí)行,所以要編譯沽损。
為什么要編譯

什么是編譯

利用編譯程序?qū)⒏呒壵Z言所編寫的代碼變?yōu)镃PU可執(zhí)行的代碼的過程就叫編譯灯节。


編譯_百度詞條.png

App的編譯過程

我分別用OC和Swift語言創(chuàng)建兩個Demo,通過BulidLog看一下整個編譯過程:


BuildLog_OC.png

BuildLog_Swift.png

Build的得到的.app也可以通過查看包內(nèi)容,直觀的看到得到的文件


.app包內(nèi)容.png

根據(jù)圖中和參考的文章總結(jié)一下 iOS 項目編譯過程:

  1. 寫入輔助文件:將項目的文件結(jié)構(gòu)對應(yīng)表炎疆、將要執(zhí)行的腳本卡骂、項目依賴庫的文件結(jié)構(gòu)對應(yīng)表寫成文件,方便后面使用形入;
  2. 創(chuàng)建App架構(gòu):為填充后面步驟編譯得到的文件等全跨;
  3. 運行預(yù)設(shè)腳本:Cocoapods 會預(yù)設(shè)一些腳本,當(dāng)然你也可以自己預(yù)設(shè)一些腳本來運行亿遂。這些腳本都在 Build Phases 中可以看到浓若;
  4. 編譯.m文件:這個過程是由LLVM完成的,編譯成一個可執(zhí)行文件(Mach-0)崩掘;
  5. 鏈接編譯后得到的文件七嫌;
  6. 拷貝項目中的資源,比如 圖片資源苞慢;
  7. 編譯 storyboard
  8. 編譯 asset文件:圖片如果使用 Assets.xcassets 來管理圖片诵原,那么這些圖片將會被編譯成機器碼,除了 icon 和 launchImage挽放;
  9. 處理info.plist 绍赛;
  10. 執(zhí)行CocoaPod腳本;
  11. 拷貝swift標(biāo)準(zhǔn)包辑畦;
  12. 構(gòu)建.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項目是模塊化暂筝、可重用的編譯器和工具鏈技術(shù)的集合箩言。盡管名為LLVM,但它與傳統(tǒng)的虛擬機幾乎沒有關(guān)系焕襟≡墒眨“LLVM”這個名字本身并不是首字母縮略詞;這是項目的全稱。

LLVM在編譯過程中分為了三個模塊: 前端鸵赖、中間優(yōu)化器和后端 务漩。(跟web前端,service后端沒有任何關(guān)系)它褪。
LLVM各個模塊的作用:

  • 前端:對目標(biāo)語言代碼進行語法分析饵骨,語義分析,生成中間代碼茫打。在這個過程中宏悦,會進行類型檢查镐确,如果發(fā)現(xiàn)錯誤或者警告會標(biāo)注出來在哪一行包吝;
  • 中間優(yōu)化器:對中間代碼進行優(yōu)化饼煞,去除冗余代碼,這個過程會進行BitCode的生成诗越,鏈接期優(yōu)化等砖瞧;
  • 后端:先進行與機器無關(guān)的代碼優(yōu)化,生成匯編語言嚷狞,在生成匯編語言之后會再進次進行與機器相關(guān)的代碼優(yōu)化块促,最后將各個文件的機器代碼鏈接。

在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來實現(xiàn)private和public传货。

  1. 預(yù)處理 :處理一些預(yù)處理指令( 比如#define、#ifdef,#else,#endif等)并將預(yù)處理后的代碼進行符號化處理宏娄,以便下一步進行詞法分析和語義分析问裕;
  2. 詞法分析和語義分析:
    <1> 將符號化的代碼抽象為語法樹(abstract syntax tree – AST);
    <2> 靜態(tài)分析:對語法樹進行遍歷分析,包括類型檢查孵坚、實現(xiàn)檢查(某個類是否存在某個方法)粮宛、變量使用,還會有一些復(fù)雜的檢查卖宠,例如在 Objective-C 中巍杈,給某一個對象發(fā)送消息(調(diào)用某個方法),檢查這個對象的類是否聲明這個方法(但并不會去檢查這個方法是否實現(xiàn)逗堵,這個錯誤是在運行時進行檢查的)秉氧,如果有什么錯誤就會進行提示。因此可見蜒秤,Xcode 對 clang 做了非常深度的集成汁咏,在編寫代碼的過程中它就會使用 clang 來對代碼進行分析,并及時對代碼錯誤進行提示作媚。
  3. 生成 LLVM 代碼(也就是中間代碼LLVM Intermediate Representation LLVM IR)攘滩,并將代碼遞交給優(yōu)化器,這也是LLVM前端 Clang的最后一步纸泡;
  4. 優(yōu)化:將一些不合適且消耗內(nèi)存的代碼進行優(yōu)化漂问;
  5. 生成目標(biāo)文件:這之后就是由LLVM后端完成了,將優(yōu)化過的代碼根據(jù)不同架構(gòu)的 CPU 轉(zhuǎn)化生成匯編代碼,再生成對應(yīng)的可執(zhí)行文件蚤假,這樣對應(yīng)的 CPU 就可以執(zhí)行了栏饮;
  6. 生成可執(zhí)行文件(Mach - 0)。

以上的文件編譯流程在文章的開頭鏈接里有詳細(xì)步驟和說明磷仰。

Swift的文件編譯處理過程:

Swift 編譯器架構(gòu)

Swift編譯器官方解釋.png

總體而言袍嬉,Swift編譯器主要負(fù)責(zé)將Swift源代碼轉(zhuǎn)換為高效、可執(zhí)行的機器代碼灶平。但是伺通,Swift編譯器前端還支持許多其他工具,包括與語法著色逢享、代碼完成和其他便利的IDE集成罐监。本文件對Swift編譯器的主要組件進行了高層描述:

  • 解析:解析器是一個簡單的遞歸解析器(在lib/Parse中實現(xiàn)),帶有一個集成的瞒爬、手工編碼的lexer弓柱。解析器負(fù)責(zé)生成沒有任何語義或類型信息的抽象語法樹(AST),并對輸入源的語法問題發(fā)出警告或錯誤疮鲫。
  • 語義分析:語義分析(在lib/Sema中實現(xiàn))負(fù)責(zé)將解析后的AST轉(zhuǎn)換為結(jié)構(gòu)良好的吆你、完全類型檢查的AST形式,為源代碼中的語義問題發(fā)出警告或錯誤俊犯。語義分析包括類型推斷妇多,如果成功,則表明從生成的經(jīng)過類型檢查的AST生成代碼是安全的燕侠。
  • Clang導(dǎo)入:Clang導(dǎo)入器(在lib/ClangImporter中實現(xiàn))導(dǎo)入Clang模塊者祖,并將它們導(dǎo)出的C或Objective-C api映射到相應(yīng)的Swift api中。產(chǎn)生的導(dǎo)入的ast可以通過語義分析來引用绢彤。
  • SIL生成:Swift中間語言(SIL)是一種高級的七问、特定于Swift的中間語言,適用于Swift代碼的進一步分析和優(yōu)化茫舶。SIL生成階段(在lib/SILGen中實現(xiàn))將類型檢查的AST降低為所謂的“原始”SIL械巡。SIL的設(shè)計在doc /SIL.rst中進行了描述。
  • SIL保證轉(zhuǎn)換:SIL保證轉(zhuǎn)換(在lib/SILOptimizer/Mandatory中實現(xiàn))執(zhí)行影響程序正確性的附加數(shù)據(jù)流診斷(例如使用未初始化的變量)饶氏。這些轉(zhuǎn)換的最終結(jié)果是“規(guī)范的”SIL讥耗。
  • SIL優(yōu)化:SIL優(yōu)化(在lib/Analysislib/ARC疹启、lib/LoopTransformslib/Transforms中實現(xiàn))對程序執(zhí)行額外的高級特定于swift的優(yōu)化古程,包括(例如)自動引用計數(shù)優(yōu)化、去虛擬化和泛型專門化喊崖。
  • LLVM IR生成:IR生成(在lib/IRGen中實現(xiàn))降低SIL到LLVM IR挣磨,此時LLVM可以繼續(xù)優(yōu)化并生成機器代碼雇逞。

生成LLVM IR 之后的步驟就跟OC一樣了。

與編譯相關(guān) (內(nèi)容太多茁裙,未完待續(xù))

Build Tabs

iOS Build Tabs -- Build Settings

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末塘砸,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子呜达,更是在濱河造成了極大的恐慌谣蠢,老刑警劉巖,帶你破解...
    沈念sama閱讀 219,427評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件查近,死亡現(xiàn)場離奇詭異,居然都是意外死亡挤忙,警方通過查閱死者的電腦和手機霜威,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,551評論 3 395
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來册烈,“玉大人戈泼,你說我怎么就攤上這事∩蜕” “怎么了大猛?”我有些...
    開封第一講書人閱讀 165,747評論 0 356
  • 文/不壞的土叔 我叫張陵,是天一觀的道長淀零。 經(jīng)常有香客問我挽绩,道長,這世上最難降的妖魔是什么驾中? 我笑而不...
    開封第一講書人閱讀 58,939評論 1 295
  • 正文 為了忘掉前任唉堪,我火速辦了婚禮,結(jié)果婚禮上肩民,老公的妹妹穿的比我還像新娘唠亚。我一直安慰自己,他們只是感情好持痰,可當(dāng)我...
    茶點故事閱讀 67,955評論 6 392
  • 文/花漫 我一把揭開白布灶搜。 她就那樣靜靜地躺著,像睡著了一般工窍。 火紅的嫁衣襯著肌膚如雪割卖。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,737評論 1 305
  • 那天移剪,我揣著相機與錄音究珊,去河邊找鬼。 笑死纵苛,一個胖子當(dāng)著我的面吹牛剿涮,可吹牛的內(nèi)容都是我干的言津。 我是一名探鬼主播,決...
    沈念sama閱讀 40,448評論 3 420
  • 文/蒼蘭香墨 我猛地睜開眼取试,長吁一口氣:“原來是場噩夢啊……” “哼悬槽!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起瞬浓,我...
    開封第一講書人閱讀 39,352評論 0 276
  • 序言:老撾萬榮一對情侶失蹤初婆,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后猿棉,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體磅叛,經(jīng)...
    沈念sama閱讀 45,834評論 1 317
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,992評論 3 338
  • 正文 我和宋清朗相戀三年萨赁,在試婚紗的時候發(fā)現(xiàn)自己被綠了弊琴。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 40,133評論 1 351
  • 序言:一個原本活蹦亂跳的男人離奇死亡杖爽,死狀恐怖敲董,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情慰安,我是刑警寧澤腋寨,帶...
    沈念sama閱讀 35,815評論 5 346
  • 正文 年R本政府宣布,位于F島的核電站化焕,受9級特大地震影響萄窜,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜锣杂,卻給世界環(huán)境...
    茶點故事閱讀 41,477評論 3 331
  • 文/蒙蒙 一脂倦、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧元莫,春花似錦赖阻、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,022評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至茎截,卻和暖如春苇侵,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背企锌。 一陣腳步聲響...
    開封第一講書人閱讀 33,147評論 1 272
  • 我被黑心中介騙來泰國打工榆浓, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人撕攒。 一個月前我還...
    沈念sama閱讀 48,398評論 3 373
  • 正文 我出身青樓陡鹃,卻偏偏與公主長得像烘浦,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子萍鲸,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 45,077評論 2 355

推薦閱讀更多精彩內(nèi)容