二排龄、編譯和鏈接

1. 編譯的四個步驟

預(yù)處理(Propressing)
編譯(Compilation)
匯編(Assembly)
鏈接(Linking)

1.1 預(yù)處理(Propressing)

預(yù)處理過程主要是處理源代碼中以“#”開始的預(yù)編譯指令蜒灰,生成.i文件,主要處理規(guī)則如下:

  • 刪除所有“#define”,展開所有的宏定義。
  • 處理所有條件預(yù)編譯指令羹唠,比如“#ifdef”。
  • 處理“#include”預(yù)編譯指令娄昆,將被包含的文件插入到指令所在的位置。
  • 刪除注釋缝彬。
  • 添加行號和文件名標識萌焰,用于產(chǎn)生調(diào)試信息。

1.2 編譯(Compilation)

編譯過程是把預(yù)處理之后的文件經(jīng)過詞法分析谷浅、語法分析扒俯、語義分析、中間代碼生成一疯、目標代碼生成與優(yōu)化這些步驟撼玄,生成相應(yīng)的匯編代碼.s文件。

1.2.1 詞法分析

預(yù)處理之后的源代碼被輸入到掃描器(Scanner)墩邀,運用算法將代碼的字符序列分割成一系列的Token掌猛,并對Token分類:關(guān)鍵字、標識符眉睹、字面量(數(shù)字荔茬、字符串等)和特殊符號(運算符等)。

1.2.2 語法分析

對詞法分析得到的Token進行語法分析竹海,生成語法樹(如下)慕蔚。語法樹是以表達式(Expression)為結(jié)點的樹。符號和數(shù)字是最小的表達式斋配,作為葉節(jié)點孔飒。語法分析的同時灌闺,運算符的優(yōu)先級和含義也被確定。如果表達式不合法坏瞄,編譯器會報語法錯誤菩鲜。

array[index] = (index + 4) * (2 + 6) 的語法樹

1.2.3 語義分析

語法分析只完成了表達式語法層面的分析,并不了解表達式是否真正有意義惦积,比如指針乘法在語法上是合法的接校。編譯器所能分析的是靜態(tài)語義,包括類型匹配和轉(zhuǎn)換狮崩。
語義分析之后蛛勉,語法樹的表達式會被標識類型,如果有類型隱式轉(zhuǎn)換睦柴,會插入相應(yīng)的轉(zhuǎn)換節(jié)點诽凌。

1.2.4 中間代碼生成

現(xiàn)代編譯器往往在源代碼級別會有一個優(yōu)化,比如上面的2+6坦敌,會被優(yōu)化成8侣诵。直接在語法樹上做優(yōu)化比較困難,因此往往會把語法樹轉(zhuǎn)換成中間代碼(Intermediate Code)狱窘,它是語法樹的順序表示杜顺。
中間代碼很接近目標代碼,但是跟平臺無關(guān)蘸炸,比如不包含數(shù)據(jù)的尺寸躬络、變量地址和寄存器名字等等。中間代碼的表示形式常見的有三地址碼(Three_address Code)搭儒,里面對三個變量地址操作。

1.3 匯編(Assembly)

將匯編代碼轉(zhuǎn)換成機器指令馁菜,由于每一條匯編語句幾乎都對應(yīng)一條機器指令铃岔,只需根據(jù)對照表一一翻譯就可以了汪疮。
主要包括代碼生成器(Code Generator)和目標代碼優(yōu)化器(Target Code Optimizer)。代碼生成器將中間代碼轉(zhuǎn)換成目標機器代碼德撬,優(yōu)化器對目標代碼進行優(yōu)化铲咨,比如選擇合適的尋址方式、刪除多余的指令等等蜓洪。

1.4 鏈接(Linking)

目標代碼中有變量定義在其他模塊怎么辦纤勒?這是編譯無法解決的,需要在鏈接的時候才能確定隆檀。所以現(xiàn)代編譯器是將源代碼文件變成從未連接的目標文件摇天,有鏈接器最終將目標文件鏈接成可執(zhí)行文件粹湃。
從原理上來講,鏈接就是修正外部變量的地址泉坐。(靜態(tài)鏈接)

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末为鳄,一起剝皮案震驚了整個濱河市孤钦,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌纯丸,老刑警劉巖偏形,帶你破解...
    沈念sama閱讀 216,402評論 6 499
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異觉鼻,居然都是意外死亡俊扭,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,377評論 3 392
  • 文/潘曉璐 我一進店門仇矾,熙熙樓的掌柜王于貴愁眉苦臉地迎上來庸蔼,“玉大人,你說我怎么就攤上這事若未≈熳欤” “怎么了?”我有些...
    開封第一講書人閱讀 162,483評論 0 353
  • 文/不壞的土叔 我叫張陵粗合,是天一觀的道長。 經(jīng)常有香客問我乌昔,道長隙疚,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,165評論 1 292
  • 正文 為了忘掉前任磕道,我火速辦了婚禮供屉,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘溺蕉。我一直安慰自己伶丐,他們只是感情好,可當我...
    茶點故事閱讀 67,176評論 6 388
  • 文/花漫 我一把揭開白布疯特。 她就那樣靜靜地躺著哗魂,像睡著了一般。 火紅的嫁衣襯著肌膚如雪漓雅。 梳的紋絲不亂的頭發(fā)上录别,一...
    開封第一講書人閱讀 51,146評論 1 297
  • 那天朽色,我揣著相機與錄音,去河邊找鬼组题。 笑死葫男,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的崔列。 我是一名探鬼主播梢褐,決...
    沈念sama閱讀 40,032評論 3 417
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼赵讯!你這毒婦竟也來了盈咳?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 38,896評論 0 274
  • 序言:老撾萬榮一對情侶失蹤瘦癌,失蹤者是張志新(化名)和其女友劉穎猪贪,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體讯私,經(jīng)...
    沈念sama閱讀 45,311評論 1 310
  • 正文 獨居荒郊野嶺守林人離奇死亡热押,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,536評論 2 332
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了斤寇。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片桶癣。...
    茶點故事閱讀 39,696評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖娘锁,靈堂內(nèi)的尸體忽然破棺而出牙寞,到底是詐尸還是另有隱情,我是刑警寧澤莫秆,帶...
    沈念sama閱讀 35,413評論 5 343
  • 正文 年R本政府宣布间雀,位于F島的核電站,受9級特大地震影響镊屎,放射性物質(zhì)發(fā)生泄漏惹挟。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,008評論 3 325
  • 文/蒙蒙 一缝驳、第九天 我趴在偏房一處隱蔽的房頂上張望连锯。 院中可真熱鬧,春花似錦用狱、人聲如沸运怖。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,659評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽摇展。三九已至,卻和暖如春署海,著一層夾襖步出監(jiān)牢的瞬間吗购,已是汗流浹背医男。 一陣腳步聲響...
    開封第一講書人閱讀 32,815評論 1 269
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留捻勉,地道東北人镀梭。 一個月前我還...
    沈念sama閱讀 47,698評論 2 368
  • 正文 我出身青樓,卻偏偏與公主長得像踱启,于是被迫代替她去往敵國和親报账。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 44,592評論 2 353

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