簡單聊聊Xcode 中的編譯過程和編譯原理

一般可以將編程語言分為兩種,編譯語言直譯式語言栅组。

像C++,Objective C都是編譯語言袱衷。編譯語言在執(zhí)行的時候,必須先通過編譯器生成機器碼笑窜,機器碼可以直接在CPU上執(zhí)行致燥,所以執(zhí)行效率較高。

JavaScript,Python都是直譯式語言排截。直譯式語言不需要經(jīng)過編譯的過程嫌蚤,而是在執(zhí)行的時候通過一個中間的解釋器將代碼解釋為CPU可以執(zhí)行的代碼辐益。所以,較編譯語言來說脱吱,直譯式語言效率低一些智政,但是編寫的更靈活。

iOS開發(fā)目前的常用語言是:Objective和Swift箱蝠。二者都是編譯語言续捂,換句話說都是需要編譯才能執(zhí)行的。二者的編譯都是依賴于Clang + LLVM.

基本的編譯過程大概分為四個步驟:

1.預(yù)處理(Pre-process):把宏替換宦搬,刪除注釋牙瓢,展開頭文件,產(chǎn)生.i文件间校。

2.編譯(Compliling):把之前的.i文件轉(zhuǎn)換成匯編語言矾克,產(chǎn)生.s文件。

3.匯編(Asembly):把匯編語言文件轉(zhuǎn)換為機器碼文件憔足,產(chǎn)生.o文件胁附。

4.鏈接(Link):對.o文件中的對于其他的庫的引用的地方進行引用,生成最后的可執(zhí)行文件(同時也包括多個.o文件進行 link)滓彰。

在 xcode 中可以通過?Build phases,Build settings以及?Build rules來進行控制控妻。

Build phases主要是用來控制從源文件到可執(zhí)行文件的整個過程的,所以應(yīng)該說是面向源文件的揭绑,包括編譯哪些文件弓候,以及在編譯過程中執(zhí)行一些自定義的腳本什么的。

Build rules主要是用來控制如何編譯某種類型的源文件的洗做,假如說相對某種類型的原文件進行特定的編譯弓叛,那么就應(yīng)該在這里進行編輯了彰居。同時這里也會大量的運用一些 xcode 中的環(huán)境變量诚纸,完整的官方文檔在這里:Build Settings Reference

Build settings則是對編譯工作的細節(jié)進行設(shè)定,在這個窗口里可以看見大量的設(shè)置選項陈惰,從編譯到打包再到代碼簽名都有畦徘,這里要注意 settings 的 section 分類,同時一般通過右側(cè)的 inspector 就可以很好的理解選項的意義了抬闯。

最后井辆,要說一下我們的工程文件.pbxproj,以上的所有的這些選項都保存在這個文件中。當(dāng)然也包括 target 的信息溶握,項目所有文件的信息杯缺,這個文件是一個文本文件,可以用文本編輯器打開睡榆。里頭的內(nèi)容基本是可讀性比較強的萍肆∨塾埽基本的思路很面向?qū)ο螅總€東西都有屬性塘揣,如果屬性是另一個對象包雀,值就是那個對象的一個『引用』,就是一串?dāng)?shù)字(唯一的)作為表示亲铡。每個對象都有這樣的引用才写。

不管是OC還是Swift,都是采用Clang作為編譯器前端奖蔓,LLVM(Low level vritual machine)作為編譯器后端.

1.編譯器前端

編譯器前端的任務(wù)是進行:語法分析赞草,語義分析,生成中間代碼(intermediate representation )锭硼。在這個過程中房资,會進行類型檢查,如果發(fā)現(xiàn)錯誤或者警告會標注出來在哪一行檀头。

2.編譯器后端

編譯器后端會進行機器無關(guān)的代碼優(yōu)化轰异,生成機器語言,并且進行機器相關(guān)的代碼優(yōu)化暑始。iOS的編譯過程搭独,后端的處理如下

LVVM優(yōu)化器會進行BitCode的生成,鏈接期優(yōu)化等等廊镜。

LLVM機器碼生成器會針對不同的架構(gòu)牙肝,比如arm64等生成不同的機器碼。

執(zhí)行一次XCode build的流程

·? 編譯信息寫入輔助文件嗤朴,創(chuàng)建編譯后的文件架構(gòu)(name.app)

· 處理文件打包信息配椭,例如在debug環(huán)境下

Entitlements:{

? ????? "application-identifier" = "app的bundleid";? ? "aps-environment" = development;

????}

·?執(zhí)行CocoaPod編譯前腳本?

? ??例如對于使用CocoaPod的工程會執(zhí)行CheckPods Manifest.lock

·?編譯各個.m文件,使用CompileC和clang命令雹姊。

· 鏈接需要的Framework股缸,例如Foundation.framework,AFNetworking.framework,ALiPay.fframework

·編譯xib文件

·拷貝xib,圖片等資源文件到結(jié)果目錄

·編譯ImageAssets

·處理info.plist

·??執(zhí)行CocoaPod腳本

·拷貝Swift標準庫

·創(chuàng)建.app文件和對其簽名

如何提高項目編譯速度

一.查看編譯時間

對于XCode 8吱雏,關(guān)閉XCode敦姻,終端輸入以下指令

$ defaults writecom.apple.dt.XcodeShowBuildOperationDuration YES

然后,重啟XCode歧杏,然后編譯镰惦,就會顯示出編譯時間。

二 .代碼層面的優(yōu)化

? ? 1.forward declaration?所謂forward declaration犬绒,就是@class CLASSNAME旺入,而不是#import CLASSNAME.h。這樣凯力,編譯器能大大提高#import的替換速度茵瘾。

????2.?對常用的工具類進行打包(Framework/.a). 打包成Framework或者靜態(tài)庫急膀,這樣編譯的時候這部分代碼就不需要重新編譯了。? ??

? ? 3.常用頭文件放到預(yù)編譯文件里.? XCode的pch文件是預(yù)編譯文件龄捡,這里的內(nèi)容在執(zhí)行XCode build之前就已經(jīng)被預(yù)編譯卓嫂,并且引入到每一個.m文件里了。

? ?4.Debug模式下聘殖,不生成dsym文件.dysm文件里存儲了調(diào)試信息晨雳,在Debug模式下,我們可以借助XCode和LLDB進行調(diào)試奸腺。所以餐禁,不需要生成額外的dsym文件來降低編譯速度。

? ?5.Debug開啟Build Active Architecture Only.在XCode -> Build Settings -> Build Active Architecture Only 改為YES突照。這樣做帮非,可以只編譯當(dāng)前的版本,比如arm7/arm64等等讹蘑,記得只開啟Debug模式末盔。這個選項在高版本的XCode中自動開啟了。

? ?6.ebug模式下座慰,關(guān)閉編譯器優(yōu)化

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末陨舱,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子版仔,更是在濱河造成了極大的恐慌游盲,老刑警劉巖,帶你破解...
    沈念sama閱讀 219,270評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件蛮粮,死亡現(xiàn)場離奇詭異益缎,居然都是意外死亡,警方通過查閱死者的電腦和手機然想,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,489評論 3 395
  • 文/潘曉璐 我一進店門莺奔,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人又沾,你說我怎么就攤上這事弊仪∥蹩ǎ” “怎么了杖刷?”我有些...
    開封第一講書人閱讀 165,630評論 0 356
  • 文/不壞的土叔 我叫張陵,是天一觀的道長驳癌。 經(jīng)常有香客問我滑燃,道長,這世上最難降的妖魔是什么颓鲜? 我笑而不...
    開封第一講書人閱讀 58,906評論 1 295
  • 正文 為了忘掉前任表窘,我火速辦了婚禮典予,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘乐严。我一直安慰自己瘤袖,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 67,928評論 6 392
  • 文/花漫 我一把揭開白布昂验。 她就那樣靜靜地躺著捂敌,像睡著了一般。 火紅的嫁衣襯著肌膚如雪既琴。 梳的紋絲不亂的頭發(fā)上占婉,一...
    開封第一講書人閱讀 51,718評論 1 305
  • 那天,我揣著相機與錄音甫恩,去河邊找鬼逆济。 笑死,一個胖子當(dāng)著我的面吹牛磺箕,可吹牛的內(nèi)容都是我干的奖慌。 我是一名探鬼主播,決...
    沈念sama閱讀 40,442評論 3 420
  • 文/蒼蘭香墨 我猛地睜開眼升薯,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了击困?” 一聲冷哼從身側(cè)響起涎劈,我...
    開封第一講書人閱讀 39,345評論 0 276
  • 序言:老撾萬榮一對情侶失蹤蛛枚,失蹤者是張志新(化名)和其女友劉穎蹦浦,沒想到半個月后盲镶,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,802評論 1 317
  • 正文 獨居荒郊野嶺守林人離奇死亡浦旱,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,984評論 3 337
  • 正文 我和宋清朗相戀三年宇色,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 40,117評論 1 351
  • 序言:一個原本活蹦亂跳的男人離奇死亡宣蠕,死狀恐怖例隆,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情抢蚀,我是刑警寧澤镀层,帶...
    沈念sama閱讀 35,810評論 5 346
  • 正文 年R本政府宣布,位于F島的核電站皿曲,受9級特大地震影響鹿响,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜谷饿,卻給世界環(huán)境...
    茶點故事閱讀 41,462評論 3 331
  • 文/蒙蒙 一惶我、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧博投,春花似錦绸贡、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,011評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至虑绵,卻和暖如春尿瞭,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背翅睛。 一陣腳步聲響...
    開封第一講書人閱讀 33,139評論 1 272
  • 我被黑心中介騙來泰國打工声搁, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人捕发。 一個月前我還...
    沈念sama閱讀 48,377評論 3 373
  • 正文 我出身青樓疏旨,卻偏偏與公主長得像,于是被迫代替她去往敵國和親扎酷。 傳聞我的和親對象是個殘疾皇子檐涝,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 45,060評論 2 355

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