計算機程序編譯過程

現在這個社會充斥著太多的水貨程序員了敷扫,他們不懂任何計算機原理事哭,但是他們依舊做著公司的業(yè)務苫拍,很好的完成老板交代的任務,但是這些東西永遠對他們來說都說一個黑盒子珊肃,他們不會知道為什么會產生段錯誤荣刑,為什么會有懸掛指針,不知道為什么會產生鏈接錯誤伦乔,什么是缺失符號厉亏,更不知道為什么函數 return 一個局部變量就會段錯誤,返回一個字面量常量就不會烈和,當發(fā)生這些問題來只能谷歌爱只,stackoverflow,甚至只能是百度招刹。所以恬试,這里一步一步給大家科普,不斷普及一些“常識”讓大家更好的理解我們編寫的軟件程序疯暑。

計算機程序編譯過程分為4個步驟:

  • 預處理
  • 編譯
  • 匯編
  • 鏈接
預處理
$gcc -E hello.c -o hello.i

$cpp hello.c > hello.i

預編譯過程主要:

  1. 處理預編譯指令训柴,例如 #define,#if妇拯,#ifdefine 等幻馁。
  2. 將 #include 包含文件插入到該預編譯指令的位置
  3. 刪除所有的注析 // 、/**/
編譯
$gcc –S hello.i –o hello.s

$gcc –S hello.c –o hello.s

編譯代表了一整個過程:

  • 詞法分析
  • 語法分析
  • 語義分析
  • 源代碼優(yōu)化
  • 代碼生成
  • 目標代碼優(yōu)化
詞法分析

掃描字節(jié)序并產生記號越锈。
詞法分析產生的記號一般可以分為如下幾類:關鍵字仗嗦、標識符、字面量(包含數字甘凭、字符串等)和特殊符號(如加號儒将、等號)。

語法分析

語法分析器(Grammar Parser)將對由掃描器產生的記號進行語法分析对蒲,從而產生語法樹(Syntax Tree)钩蚊。由語法分析器生成的語法樹就是以表達式(Expression)為節(jié)點的樹。

語義分析

語法分析僅僅是完成了對表達式的語法層面的分析蹈矮,但是它并不了解這個語句是否真正有意義砰逻。
編譯器所能分析的語義是靜態(tài)語義(Static Semantic),所謂靜態(tài)語義是指在編譯期可以確定的語義泛鸟,與之對應的動態(tài)語義(Dynamic Semantic)就是只有在運行期才能確定的語義蝠咆。
靜態(tài)語義通常包括聲明和類型的匹配,類型的轉換。

動態(tài)語義和靜態(tài)語義?

比如將一個浮點型賦值給一個指針的時候刚操,語義分析程序會發(fā)現這個類型不匹配闸翅,編譯器將會報錯。動態(tài)語義一般指在運行期出現的語義相關的問題菊霜,比如將0作為除數是一個運行期語義錯誤坚冀。

中間語言生成

中間代碼使得編譯器可以被分為前端和后端。編譯器前端負責產生機器無關的中間代碼鉴逞,編譯器后端將中間代碼轉換成目標機器代碼记某。這樣對于一些可以跨平臺的編譯器而言,它們可以針對不同的平臺使用同一個前端和針對不同機器平臺的數個后端构捡。

目標代碼生成與優(yōu)化

代碼級優(yōu)化器產生中間代碼標志著下面的過程都屬于編譯器后端液南。編譯器后端主要包括代碼生成器(Code Generator)和目標代碼優(yōu)化器(Target Code Optimizer)。
代碼生成器將中間代碼轉換成目標機器代碼勾徽,這個過程十分依賴于目標機器滑凉。

對于上面例子中的中間代碼,代碼生成器可能會生成下面的代碼序列

movl index, %ecx        ; value of index to ecx
addl $4, %ecx           ; ecx = ecx + 4
mull $8, %ecx             ; ecx = ecx * 8
movl index, %eax        ; value of index to eax
movl %ecx, array(,eax,4)  ; array[index] = ecx
匯編
$as hello.s –o hello.o

$gcc –c hello.c –o hello.o

匯編器(as)將匯編代碼翻譯成機器語言指令喘帚,把這些指令打包成一種叫做可重定位目標程序(relocatable)的格式畅姊,并將結果保持在目標文件 hello.o 中。hello.o 是一個二進制文件啥辨。

鏈接
$ld -static /usr/lib/crt1.o /usr/lib/crti.o /usr/lib/gcc/i486-linux-gnu/4.1.3/crtbeginT.o -L/usr/lib/gcc/i486-linux-gnu/4.1.3 -L/usr/lib -L/lib hello.o --start-group -lgcc -lgcc_eh -lc --end-group /usr/lib/gcc/i486-linux-gnu/4.1.3/crtend.o /usr/lib/crtn.o

鏈接階段最重要的工作就是重定位,將所有的目標文件都鏈接起來盯腌,在 #include 文件中的函數聲明原本只會生成一個沒有跳轉地址的指令溉知,重定位的工作在其他目標文件中找到這些目標地址,并把地址填補進去腕够。

鏈接分為靜態(tài)鏈接和動態(tài)鏈接级乍,也就是我們通常說的私有對象和共享對象。這里得展開另外一篇來講了帚湘,內容太多玫荣。

鏈接就像將所有的組件合成一起,組成一個整體大诸。

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
  • 序言:七十年代末捅厂,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子资柔,更是在濱河造成了極大的恐慌焙贷,老刑警劉巖,帶你破解...
    沈念sama閱讀 206,126評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件贿堰,死亡現場離奇詭異辙芍,居然都是意外死亡,警方通過查閱死者的電腦和手機,發(fā)現死者居然都...
    沈念sama閱讀 88,254評論 2 382
  • 文/潘曉璐 我一進店門故硅,熙熙樓的掌柜王于貴愁眉苦臉地迎上來庶灿,“玉大人,你說我怎么就攤上這事吃衅⊥撸” “怎么了?”我有些...
    開封第一講書人閱讀 152,445評論 0 341
  • 文/不壞的土叔 我叫張陵捐晶,是天一觀的道長菲语。 經常有香客問我,道長惑灵,這世上最難降的妖魔是什么山上? 我笑而不...
    開封第一講書人閱讀 55,185評論 1 278
  • 正文 為了忘掉前任,我火速辦了婚禮英支,結果婚禮上佩憾,老公的妹妹穿的比我還像新娘。我一直安慰自己干花,他們只是感情好妄帘,可當我...
    茶點故事閱讀 64,178評論 5 371
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著池凄,像睡著了一般抡驼。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上肿仑,一...
    開封第一講書人閱讀 48,970評論 1 284
  • 那天致盟,我揣著相機與錄音,去河邊找鬼尤慰。 笑死馏锡,一個胖子當著我的面吹牛,可吹牛的內容都是我干的伟端。 我是一名探鬼主播杯道,決...
    沈念sama閱讀 38,276評論 3 399
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼责蝠!你這毒婦竟也來了党巾?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 36,927評論 0 259
  • 序言:老撾萬榮一對情侶失蹤霜医,失蹤者是張志新(化名)和其女友劉穎昧港,沒想到半個月后,有當地人在樹林里發(fā)現了一具尸體支子,經...
    沈念sama閱讀 43,400評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡创肥,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 35,883評論 2 323
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片叹侄。...
    茶點故事閱讀 37,997評論 1 333
  • 序言:一個原本活蹦亂跳的男人離奇死亡巩搏,死狀恐怖,靈堂內的尸體忽然破棺而出趾代,到底是詐尸還是另有隱情贯底,我是刑警寧澤,帶...
    沈念sama閱讀 33,646評論 4 322
  • 正文 年R本政府宣布撒强,位于F島的核電站禽捆,受9級特大地震影響,放射性物質發(fā)生泄漏飘哨。R本人自食惡果不足惜胚想,卻給世界環(huán)境...
    茶點故事閱讀 39,213評論 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望芽隆。 院中可真熱鬧浊服,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,204評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至免胃,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,423評論 1 260
  • 我被黑心中介騙來泰國打工脓恕, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人代虾。 一個月前我還...
    沈念sama閱讀 45,423評論 2 352
  • 正文 我出身青樓进肯,卻偏偏與公主長得像激蹲,于是被迫代替她去往敵國和親棉磨。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 42,722評論 2 345

推薦閱讀更多精彩內容

  • Android 自定義View的各種姿勢1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 171,498評論 25 707
  • 一学辱、溫故而知新 1. 內存不夠怎么辦 內存簡單分配策略的問題地址空間不隔離內存使用效率低程序運行的地址不確定 關于...
    SeanCST閱讀 7,776評論 0 27
  • (弟弟給了我一張圖 說是給我提供靈感 然后靈感就像害羞的處女 我再怎么使勁她都不愿意出來) 年少多輕狂乘瓤,為賦新詞 ...
    睢寧三哥閱讀 209評論 0 0
  • 第一句話 你的責任就是你的方向衙傀, 你的經歷就是你的資本, 你的性格就是你的命運萨咕。 第二句話 復雜的事情簡單做统抬,你就...
    游帥來也閱讀 258評論 0 0
  • 為了完成手勢識別,必須借助于手勢識別器——UIGestureRecognizer 利用UIGestureRecog...
    lancely閱讀 167評論 0 1