第2章 編譯和鏈接

2.1被隱藏了的過程

以前學(xué)的程序的執(zhí)行過程是編輯掉瞳、編譯饮醇、鏈接它抱、執(zhí)行。今天這本書把這個過程更加細(xì)化了朴艰,它以C語言中的helloworld程序為例進(jìn)行說明观蓄,講的大概是從編譯到鏈接的過程混移。

也是包括4步:1、預(yù)處理侮穿;2歌径、編譯;3亲茅、匯編回铛;4、鏈接克锣。從這個順序可以看出在C語言中預(yù)處理是在編譯之前茵肃。

2.1.1預(yù)編譯

預(yù)編譯是個獨立的過程,不同于源文件的.cpp格式和頭文件的.h格式袭祟,預(yù)編譯得到的文件后綴是.i或者.ii验残。

預(yù)編譯的主要動作就是處理代碼中以#開頭的指令,具體可見P64這些步驟巾乳。因為宏已經(jīng)展開所以.i文件不包含任何宏定義您没。可以根據(jù).i文件查看宏定義和文件包含是否正確胆绊。

預(yù)編譯需要預(yù)編譯器氨鹏。

2.1.2編譯

編譯的過程是把預(yù)處理得到的文件進(jìn)行詞法分析、語法分析压状、語義分析和優(yōu)化后生成相應(yīng)的匯編代碼文件喻犁。

2.1.3匯編

匯編階段是通過匯編器完成的,其作用就是把匯編指令轉(zhuǎn)換成機器指令何缓。匯編結(jié)束以后生成目標(biāo)文件.obj肢础。

2.1.4鏈接

鏈接簡而言之就是把目標(biāo)文件鏈接在一起生成可執(zhí)行文件的過程,但是實際上這是一個非常復(fù)雜的過程碌廓,并不像看上去那么簡單传轰。

2.2編譯器做了什么

編譯的過程可以分為掃描、語法分析谷婆、語義分析慨蛙、源代碼優(yōu)化、代碼生成纪挎、目標(biāo)代碼優(yōu)化等6步期贫。

2.2.1詞法分析

這一過程是交給掃描器執(zhí)行的,目的是把程序語句劃分成若干記號异袄。

這些記號一般包括:1通砍、關(guān)鍵字;2、標(biāo)識符封孙;3迹冤、字面量(數(shù)字,字符串等)虎忌;4泡徙、特殊符號(加號,等號等)膜蠢。

此外堪藐,掃描器還將標(biāo)識符放到符號表,將字面量放到文字表中以備后用挑围。

詞法分析需要此法掃描器礁竞。

2.2.2語法分析

它是對詞法分析產(chǎn)生的各種記號進(jìn)行語法分析,并產(chǎn)生一顆語法樹贪惹。

語句內(nèi)容含義的區(qū)分苏章,語法的檢查等都是在此階段完成的寂嘉。

語法分析需要語法分析器奏瞬。

2.2.3語義分析

語義分析需要語義分析器。

語義分析就是分析該語句的意思泉孩,就是它能做什么硼端,有啥用。

編譯器所能做的包括靜態(tài)語義分析和動態(tài)語義分析寓搬。

靜態(tài)語義:編譯期能夠確定的語義珍昨,它主要包括類型和聲明的匹配,類型的轉(zhuǎn)換等句喷。我想C++中的靜態(tài)綁定應(yīng)該也屬于靜態(tài)語義吧镣典。

動態(tài)語義:運行期能夠確定的語義以及相關(guān)問題,比如說異常處理唾琼。我同時在想C++中的動態(tài)綁定應(yīng)該屬于動態(tài)語義兄春。

語義分析對語法樹各節(jié)點進(jìn)行了類型標(biāo)記和類型轉(zhuǎn)換,還更新了符號表里的符號類型锡溯。

2.2.4中間語言生成

編譯器有很多層次的優(yōu)化赶舆,源碼級別的優(yōu)化是其中一個層次。

源碼級的優(yōu)化需要源碼級優(yōu)化器祭饭。

這個優(yōu)化是把語法樹轉(zhuǎn)換成中間代碼芜茵,并在中間代碼上進(jìn)行的。

常見的中間代碼有三地址碼和P代碼倡蝙。

中間代碼將編譯器分成了前端和后端九串,前端負(fù)責(zé)產(chǎn)生與機器無關(guān)的中間代碼,后端負(fù)責(zé)把中間代碼轉(zhuǎn)換成目標(biāo)代碼寺鸥。

跨平臺的編譯器并不是放在任意一個平臺上都絕對能用蒸辆,只不過它能支持的平臺很多而已征炼。這是因為編譯器使用同一個前端,而針對不同的平臺使用不同的后端躬贡。

2.2.5目標(biāo)代碼的生成與優(yōu)化

編譯器的后端包括代碼生成器和目標(biāo)代碼優(yōu)化器谆奥。

代碼生成器將中間代碼轉(zhuǎn)換成目標(biāo)代碼,該過程依賴于目標(biāo)機器拂玻。

目標(biāo)代碼優(yōu)化器對目標(biāo)代碼進(jìn)行優(yōu)化酸些,比如選擇合適的尋址方式,以移位代替數(shù)乘等檐蚜。

現(xiàn)在的編譯器非常復(fù)雜魄懂,上述提到的這些方面也變得非常復(fù)雜。

變量和函數(shù)的地址都是在最終鏈接的時候才確定的闯第,然后變成可執(zhí)行文件市栗。

2.3鏈接器年齡比編譯器長

作者把鏈接比喻為拼圖的拼接。

2.4模塊拼接——靜態(tài)鏈接

將源代碼模塊組裝起來的過程就是鏈接咳短。

鏈接的過程包括:1填帽、地址和空間分配;2咙好、符號決議篡腌;3、重定位等勾效。

.obj文件即目標(biāo)文件和庫一起鏈接成可執(zhí)行文件嘹悼。

庫是由一些常用的代碼編譯成的目標(biāo)文件的包,是一個集合层宫。最常見的庫是運行時庫级零,是支持程序運行的基本函數(shù)的集合彪见。

每個目標(biāo)文件都是單獨編譯的剔桨。

模塊A想要調(diào)用模塊B的C函數(shù)岳掐,A必須要知道C的地址,但是現(xiàn)在A不知道C的地址哮奇,但是A給C留了位置膛腐,等到鏈接器鏈接時再在這個位置上填上C的地址。如果C的地址被改動了鼎俘,A中所有調(diào)用C的地方都需要進(jìn)行相應(yīng)的更改哲身,這些都可藉由鏈接器完成。這是靜態(tài)鏈接的基本功能和作用贸伐。

在鏈接的過程中需要對目標(biāo)文件中定義在其他目標(biāo)文件中的函數(shù)和變量的調(diào)用指令進(jìn)行重新調(diào)整勘天,注意這里說的是指令!書中舉的例子意在說明,當(dāng)目標(biāo)文件A調(diào)用目標(biāo)文件B中的變量C時脯丝,因為暫時無法知道C的位置商膊,所以指令先把表示C的位置置為某一值,等到鏈接的時候再把這值修正為C的地址宠进,這一過程叫做重定位晕拆,像C這樣的位置被稱為重定位入口。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末材蹬,一起剝皮案震驚了整個濱河市实幕,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌堤器,老刑警劉巖昆庇,帶你破解...
    沈念sama閱讀 218,451評論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異闸溃,居然都是意外死亡整吆,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,172評論 3 394
  • 文/潘曉璐 我一進(jìn)店門辉川,熙熙樓的掌柜王于貴愁眉苦臉地迎上來表蝙,“玉大人,你說我怎么就攤上這事员串∮禄” “怎么了昼扛?”我有些...
    開封第一講書人閱讀 164,782評論 0 354
  • 文/不壞的土叔 我叫張陵寸齐,是天一觀的道長。 經(jīng)常有香客問我抄谐,道長渺鹦,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,709評論 1 294
  • 正文 為了忘掉前任蛹含,我火速辦了婚禮毅厚,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘浦箱。我一直安慰自己吸耿,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 67,733評論 6 392
  • 文/花漫 我一把揭開白布酷窥。 她就那樣靜靜地躺著咽安,像睡著了一般。 火紅的嫁衣襯著肌膚如雪蓬推。 梳的紋絲不亂的頭發(fā)上妆棒,一...
    開封第一講書人閱讀 51,578評論 1 305
  • 那天,我揣著相機與錄音,去河邊找鬼糕珊。 笑死动分,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的红选。 我是一名探鬼主播澜公,決...
    沈念sama閱讀 40,320評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼喇肋!你這毒婦竟也來了玛瘸?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,241評論 0 276
  • 序言:老撾萬榮一對情侶失蹤苟蹈,失蹤者是張志新(化名)和其女友劉穎糊渊,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體慧脱,經(jīng)...
    沈念sama閱讀 45,686評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡渺绒,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,878評論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了菱鸥。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片宗兼。...
    茶點故事閱讀 39,992評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖氮采,靈堂內(nèi)的尸體忽然破棺而出殷绍,到底是詐尸還是另有隱情,我是刑警寧澤鹊漠,帶...
    沈念sama閱讀 35,715評論 5 346
  • 正文 年R本政府宣布主到,位于F島的核電站,受9級特大地震影響躯概,放射性物質(zhì)發(fā)生泄漏登钥。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,336評論 3 330
  • 文/蒙蒙 一娶靡、第九天 我趴在偏房一處隱蔽的房頂上張望牧牢。 院中可真熱鬧,春花似錦姿锭、人聲如沸塔鳍。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,912評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽轮纫。三九已至,卻和暖如春趾诗,著一層夾襖步出監(jiān)牢的瞬間蜡感,已是汗流浹背蹬蚁。 一陣腳步聲響...
    開封第一講書人閱讀 33,040評論 1 270
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留郑兴,地道東北人犀斋。 一個月前我還...
    沈念sama閱讀 48,173評論 3 370
  • 正文 我出身青樓,卻偏偏與公主長得像情连,于是被迫代替她去往敵國和親叽粹。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,947評論 2 355

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