IOS 編譯器做了什么丈钙?

原地址:https://objccn.io/issue-6-2/ ,https://objccn.io/issue-6-3/

1. XCODE編譯幫我們做了什么事情?

答: 將.h 和.m 文件轉(zhuǎn)換成字節(jié)碼文件 ,由ios的ARM處理器 or mac上的intel處理器執(zhí)行

2. 具體過程是怎么樣的?

答: xcode 默認(rèn) 所使用的編譯器是clang ,大體過程是

a.對objective-c做代碼的分析檢查

b. 在正確后轉(zhuǎn)為低級的類匯編代碼 (LLVM 中間表達(dá)碼)

c. 最后LLVM 會根據(jù)平臺不同轉(zhuǎn)換成對應(yīng)的字節(jié)碼

具體的過程可以用命令 clang -ccc-print-phases XX.m 查看,結(jié)果如下

0: input, "Income.m", objective-c

1: preprocessor, {0}, objective-c-cpp-output

2: compiler, {1}, ir

3: backend, {2}, assembler

4: assembler, {3}, object

5: linker, {4}, image

6: bind-arch, "x86_64", {5}, image

3. 每個階段做了些什么事振定?

0: 讀入文件?

1: 預(yù)處理 (宏替換雅宾,詞法翻譯,import展開)

? 預(yù)處理之宏替換:將源文件的宏展開, #import 文件的展開(#import文件如果有其它的import 也一并展開,一直遞歸下去),用命令clang -Ehello.c| less 后可以看到預(yù)處理的文件:

源文件 :

#define MAX(a,b) a > b ? a : b

int main() {

printf("largest: %d\n", MAX(10,100));

return 0;

}

處理后的文件 :

# 1 "hello.c"# 1 "" 1# 1 "" 3# 329 "" 3# 1 "" 1# 1 "" 2

# 1 "hello.c" 2

int main() {

printf("largest: %d\n", 10 > 100 ? 10 : 100);

return 0;}

ps :可以看到逢享,宏已經(jīng)被替換掉了罐监。 預(yù)處理的文件會在有變化的地方插入#(hash) 來標(biāo)記 ,#后的數(shù)字是源文件位置 ,最后的數(shù)字為新文件的位置瞒爬,這樣在出錯的時候就可以對應(yīng) 起來找到出錯的地方弓柱。

詞法解析標(biāo)記 : 在上一步的預(yù)處理完成后,每一個.m文件 里的聲明和定義會從 string 轉(zhuǎn)化成特殊的標(biāo)記 舉例如下:

源code:

intmain(){?

?NSLog(@"hello, %@", @"world");

return 0;}

利用命令 clang -Xclang -dump-tokens hello.m 可以查看到詞法解析后的內(nèi)容如下:按我的理解就是把源代碼翻譯成了符合編譯器語法的源代碼侧但,這樣編譯器就能認(rèn)識了. 其中 4:1 類似于NSRange矢空,可以知道源碼的起 始位置?

在獲得上面的語法標(biāo)記后,clang會將標(biāo)記流解析成一棵抽象語法樹 (abstract syntax tree -- AST),可以用命令clang -Xclang -ast-dump -fsyntax-only hello.m 查看

總的說來禀横, 在預(yù)編譯階段:會做宏替換屁药,會做頭文件引入,然后將m文件 符號 化后轉(zhuǎn)換成語法樹, 編譯器會根據(jù)這棵語法樹柏锄,做一些額外的操作以找出可能存在的錯誤酿箭,包括如下:

a. 類型檢查(動態(tài)&靜態(tài)檢查):即檢查程序中是否有類型錯誤 , 比如屬性和對應(yīng)的類型是否相同 ,一個對象有沒有對應(yīng)的方法 etc.

b. 檢查變量定義了但是未使用 etc, 可能存在的內(nèi)存問題趾娃,就是我們看到的Warning

3. 編譯 :將 AST 轉(zhuǎn)換為更低級的中間碼 (LLVM IR),對生成的中間碼做優(yōu)化,生成特定目標(biāo)代碼,輸出匯編代碼

4.匯編: 將匯編代碼轉(zhuǎn)換為目標(biāo)對象文件

5. 鏈接: ?將多個目標(biāo)對象文件合并為一個可執(zhí)行文件 (或者一個動態(tài)庫)?

6. 生成可執(zhí)行文件 :Mach-O

PS: 更詳細(xì)的請看開頭的原文LINK七问,該篇只是我看后的個人總結(jié)。茫舶。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末械巡,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子饶氏,更是在濱河造成了極大的恐慌讥耗,老刑警劉巖,帶你破解...
    沈念sama閱讀 211,290評論 6 491
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件疹启,死亡現(xiàn)場離奇詭異古程,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)喊崖,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,107評論 2 385
  • 文/潘曉璐 我一進(jìn)店門挣磨,熙熙樓的掌柜王于貴愁眉苦臉地迎上來雇逞,“玉大人,你說我怎么就攤上這事茁裙√猎遥” “怎么了?”我有些...
    開封第一講書人閱讀 156,872評論 0 347
  • 文/不壞的土叔 我叫張陵晤锥,是天一觀的道長掉蔬。 經(jīng)常有香客問我,道長矾瘾,這世上最難降的妖魔是什么女轿? 我笑而不...
    開封第一講書人閱讀 56,415評論 1 283
  • 正文 為了忘掉前任,我火速辦了婚禮壕翩,結(jié)果婚禮上蛉迹,老公的妹妹穿的比我還像新娘。我一直安慰自己放妈,他們只是感情好婿禽,可當(dāng)我...
    茶點故事閱讀 65,453評論 6 385
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著大猛,像睡著了一般扭倾。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上挽绩,一...
    開封第一講書人閱讀 49,784評論 1 290
  • 那天膛壹,我揣著相機(jī)與錄音,去河邊找鬼唉堪。 笑死模聋,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的唠亚。 我是一名探鬼主播链方,決...
    沈念sama閱讀 38,927評論 3 406
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼灶搜!你這毒婦竟也來了祟蚀?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,691評論 0 266
  • 序言:老撾萬榮一對情侶失蹤割卖,失蹤者是張志新(化名)和其女友劉穎前酿,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體鹏溯,經(jīng)...
    沈念sama閱讀 44,137評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡罢维,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,472評論 2 326
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了丙挽。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片肺孵。...
    茶點故事閱讀 38,622評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡匀借,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出平窘,到底是詐尸還是另有隱情吓肋,我是刑警寧澤,帶...
    沈念sama閱讀 34,289評論 4 329
  • 正文 年R本政府宣布初婆,位于F島的核電站蓬坡,受9級特大地震影響猿棉,放射性物質(zhì)發(fā)生泄漏磅叛。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 39,887評論 3 312
  • 文/蒙蒙 一萨赁、第九天 我趴在偏房一處隱蔽的房頂上張望弊琴。 院中可真熱鬧,春花似錦杖爽、人聲如沸敲董。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,741評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽腋寨。三九已至,卻和暖如春化焕,著一層夾襖步出監(jiān)牢的瞬間萄窜,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,977評論 1 265
  • 我被黑心中介騙來泰國打工撒桨, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留查刻,地道東北人。 一個月前我還...
    沈念sama閱讀 46,316評論 2 360
  • 正文 我出身青樓凤类,卻偏偏與公主長得像穗泵,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子谜疤,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 43,490評論 2 348

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

  • 前言 2000年佃延,伊利諾伊大學(xué)厄巴納-香檳分校(University of Illinois at Urbana-...
    星光社的戴銘閱讀 15,876評論 8 180
  • 編譯器做些什么? 本文主要探討一下編譯器主要做些什么夷磕,以及如何有效的利用編譯器苇侵。 簡單的說,編譯器有兩個職責(zé):把 ...
    評評分分閱讀 1,119評論 1 5
  • Android 自定義View的各種姿勢1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 171,756評論 25 707
  • 影片一開始企锌,導(dǎo)演先拋給觀眾一場摸不著頭腦的畫面: 悠揚(yáng)的琴聲飄蕩榆浓,一個上身赤裸的年輕男人,邊彈琴邊自我解說內(nèi)心戲撕攒。...
    風(fēng)止了閱讀 10,941評論 0 2
  • 秋日的陽光少了燥熱陡鹃,多了些溫柔烘浦,秋風(fēng)中帶著濃淡相宜的桂花香,透著些溫暖萍鲸。房間里薄被子的溫度比夏日的冷空調(diào)多...
    34_亦寞落閱讀 280評論 0 0