在開發(fā)過程中屯吊,我們很少會去關(guān)注編譯和鏈接過程惑灵,Xcode會自動處理將編譯和鏈接合并到一起來生成一個可執(zhí)行文件柴信,下面我們來分析一下Xcode為我們做了那些事情鸭津。
預(yù)編譯
1.pch預(yù)編譯頭文件彤侍,可以節(jié)約開發(fā)過程中反復(fù)編譯該頭文件的開銷。
2.Precompile Prefix Header 設(shè)置為YES逆趋,PCH文件會被預(yù)編譯處理拥刻,預(yù)編譯后的文件會被緩存起來,從而提高編譯速度
3.預(yù)編譯過程主要處理那些源碼文件中的以“#”開始的預(yù)編譯指令父泳。
4.將所有#define刪除,并且暫開所有的宏定義吴汪。
5.處理所有條件預(yù)編譯指令惠窄,例如:#if , #else , #ifdef等。
6.處理#import預(yù)編譯指令漾橙,將包含的文件插入到該預(yù)編譯指令的位置杆融。
編譯
編譯過程就是把預(yù)處理完的文件進行一系列詞法分析,語法分析霜运,語義分析及優(yōu)化后生成相應(yīng)的匯編代碼文件脾歇。
1.詞法分析:將源代碼的字符序列分割成一系列的記號,記號一般分為如下幾類:關(guān)鍵字淘捡,標識符藕各,字面量和特殊符號,詞法分析會將標識符存放到符號表焦除,將數(shù)字激况、字符串常量存放到文字表中,方便后面步驟的使用。
2.語法分析 :將記號生成語法樹乌逐,語法樹就是以表達式為節(jié)點的樹竭讳,如果出現(xiàn)不合法的表達式,此時編譯器就會報告語法分析階段的錯誤浙踢。
3.語義分析 :編譯器所能分析的語義是靜態(tài)語義(在編譯期可以確定的語義绢慢,比如聲明和類型匹配,類型轉(zhuǎn)換),經(jīng)過語義分析階段以后洛波,整個語法樹的表達式都被標識了類型胰舆。
4.中間代碼生成 : 代碼優(yōu)化在語法樹上實現(xiàn)比較困難,源代碼優(yōu)化器會將整個語法樹轉(zhuǎn)換成中間代碼并做出優(yōu)化奋岁。
5.目標代碼生成與優(yōu)化 : 這步驟屬于編譯器后端思瘟,代碼生成器將中間代碼轉(zhuǎn)換成目標機器代碼,受不同機器的字長闻伶、寄存器滨攻、整數(shù)數(shù)據(jù)類型和浮點數(shù)數(shù)據(jù)類型影響。代碼優(yōu)化器是對目標代碼進行優(yōu)化蓝翰,比如選擇合適的尋址方式光绕,刪除多余的指令等。
鏈接
模塊化開發(fā)使我們經(jīng)常使用的技術(shù)畜份,人們把每個源代碼模塊獨立地編譯诞帐,然后按照需求將它們組裝起來,這個組裝模塊的過程就是鏈接爆雹。鏈接的主要內(nèi)容就是把各個模塊之間相互引用部分都處理好停蕉,使的各個模塊之間能夠正確的銜接,鏈接器的工作就是把一些指令對其他符號地址的引用加以修正钙态。