環(huán)境
在ANSI的任何一種實現(xiàn)中盼铁,存在兩種不同的環(huán)境粗蔚。
翻譯環(huán)境:在這個環(huán)境里,源代碼被轉(zhuǎn)換為可執(zhí)行的機器指令饶火。
執(zhí)行環(huán)境:用于實際執(zhí)行代碼鹏控。
翻譯環(huán)境
組成一個程序的每個源文件通過編譯過程分別轉(zhuǎn)成目標代碼
各個目標文件由鏈接器捆綁在一起,形成一個單一而完整的可執(zhí)行程序肤寝。
鏈接器同時也會引入標準c函數(shù)庫中的任何被改程序所用到的函數(shù)当辐。
過程如下圖所示
實際上,翻譯環(huán)境本身也有幾個階段組成:
編譯
預(yù)編譯階段:在這個階段主要進行一些文本操作鲤看,如處理預(yù)處理指令缘揪,刪除注釋,#define宏替換义桂,條件編譯寺晌。
我們可以在linux平臺下測試一下,在這個階段會產(chǎn)生一個.i文件澡刹。
首先寫一個簡單的程序,比如hello world耘婚,保存為test.c文件罢浇。
使用如下代碼:
gcc -E test.c -o test.i
此時會出現(xiàn)一個test.i文件,vim打開可以觀察到里面的代碼已經(jīng)不再是原來的hello world了沐祷,這一步會將#include包含的文件全部復(fù)制過來嚷闭。
編譯階段
主要對代碼進行解析,分析出語法錯誤詞法錯誤赖临,并且符號匯總胞锰。這一階段完成后會形成.s文件,并且將c代碼轉(zhuǎn)成匯編語言兢榨。
使用如下代碼:
gcc -S test.i -o test.s
打開可以觀察到:都是匯編代碼嗅榕。
匯編階段
在這一階段,會形成符號表吵聪。并且將匯編代碼轉(zhuǎn)換成機器指令凌那,二進制序列。
使用如下代碼
gcc -c test.s -o test.o
打開可以看到吟逝,全部都是一些我們看不懂的東西帽蝶,其實就是二進制序列。
鏈接
鏈接這一階段主要是合并段表块攒,合并符號表和對符號表的重定位励稳。
編譯階段結(jié)束后佃乘,會生成一個a.out的文件,這個就是我們說的可執(zhí)行程序驹尼,中間產(chǎn)生的.i .s .o文件會被自動刪除(可使用代碼保留)趣避。
./a.out
此時可以看到屏幕上已經(jīng)打印了hello world了。
執(zhí)行環(huán)境
首先扶欣,程序必須載入內(nèi)存鹅巍,這個任務(wù)由操作系統(tǒng)完成。在獨立環(huán)境中料祠,必須手工安排骆捧,比如通過把可執(zhí)行代碼置入只讀內(nèi)存(ROM)來完成。
接著髓绽,調(diào)用main函數(shù)敛苇。
執(zhí)行程序代碼,程序?qū)⑹褂靡粋€運行時堆棧顺呕,用于存儲函數(shù)的局部變量和返回地址枫攀,程序同時也可以使用靜態(tài)內(nèi)存,存儲于靜態(tài)內(nèi)存中的變量在整個執(zhí)行過程中將一直保留他們的值株茶。
終止程序来涨。可以是正常終止启盛,也可能是出現(xiàn)錯誤自行中斷蹦掐。
如果你也想學編程,可以來我專欄的C語言/C++編程學習基地【點擊進入】僵闯!
還有免費的(源碼卧抗,零基礎(chǔ)教程,項目實戰(zhàn)教學視頻)鳖粟!? ?
涉及:游戲開發(fā)社裆、課程設(shè)計、常用軟件開發(fā)向图、編程基礎(chǔ)知識泳秀、黑客等等...