做酒店網(wǎng)站營(yíng)銷策劃公司主要做些什么
? ? ? ?? ? 你好!感謝支持孔乙己的新作,本文就程序的編譯及鏈接與大家分析我的思路。
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?希望能大佬們多多糾正及支持 !!!
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 個(gè)人主頁(yè):愛(ài)摸魚(yú)的孔乙己-CSDN博客??
???
?
1.翻譯譯環(huán)境與運(yùn)行環(huán)境
當(dāng)我們進(jìn)行程序設(shè)計(jì)時(shí),使用編譯器、開(kāi)發(fā)工具編寫(xiě)代碼(.c文件),則需要在翻譯環(huán)境,通過(guò)編譯將文件中源代碼轉(zhuǎn)換為可執(zhí)行的機(jī)器指令(二進(jìn)制指令),作用于運(yùn)行環(huán)境實(shí)際執(zhí)行代碼。
1.1.翻譯環(huán)境
顧名思義,翻譯環(huán)境是由編譯和鏈接兩大過(guò)程組成的,編譯又可拆分為:預(yù)處理(有些書(shū)籍或許稱之為預(yù)編譯)、編譯、匯編三個(gè)過(guò)程。?
在一個(gè)包含多個(gè).C文件的項(xiàng)目中,多個(gè).C文件單獨(dú)進(jìn)行編譯并生成對(duì)應(yīng)的目標(biāo)文件(Windows環(huán)境下的目標(biāo)文件后綴是.obj,Linux環(huán)境下后綴是.o) 多個(gè)目標(biāo)文件和鏈接庫(kù)一起經(jīng)過(guò)鏈接器處理生成最終的可執(zhí)行程序(鏈接庫(kù)是指運(yùn)行時(shí)庫(kù)支持程序運(yùn)行的基本函數(shù)集合或者第三方庫(kù))
接下來(lái),我們觀察一下編譯器的進(jìn)程:
????????首先,編譯過(guò)程始于源文件,通常是以.c或.cpp結(jié)尾的代碼文件。接下來(lái),這些源文件經(jīng)過(guò)預(yù)處理,生成一個(gè)中間文件(通常是.i文件),在這個(gè)階段,預(yù)處理會(huì)處理宏定義和文件包含等指令。隨后,預(yù)處理后的文件被編譯,生成匯編語(yǔ)言文件(通常是?
.s
?文件)。在這個(gè)過(guò)程中,編譯器將源代碼轉(zhuǎn)換為更接近機(jī)器語(yǔ)言的形式。接下來(lái)是鏈接階段,編譯器將生成的匯編文件與標(biāo)準(zhǔn)庫(kù)(如?libc.a
)進(jìn)行鏈接。鏈接器在這一階段負(fù)責(zé)將所有目標(biāo)文件和庫(kù)文件合并,最終生成可執(zhí)行文件。最后,經(jīng)過(guò)鏈接器處理后,輸出的可執(zhí)行文件便是用戶可以運(yùn)行的最終結(jié)果。
1.2.預(yù)處理(預(yù)編譯)
在預(yù)處理階段,源文件和頭文件會(huì)被處理為.i 為后綴的文件。在預(yù)處理階段主要是處理源文件中#開(kāi)始的預(yù)編譯指令,處理規(guī)則如下:
? 將所有的 #define 刪除,并展開(kāi)所有的宏定義。? 處理所有的條件編譯指令,如: #if 、 #ifdef 、 #elif 、 #else 、 #endif 。? 處理#include 預(yù)編譯指令,將包含的頭?件的內(nèi)容插?到該預(yù)編譯指令的位置。? 這個(gè)過(guò)程是遞歸進(jìn)?的,也就是說(shuō)被包含的頭?件也可能包含其他?件。? 刪除所有的注釋? 添加?號(hào)和?件名標(biāo)識(shí),?便后續(xù)編譯器?成調(diào)試信息等。? 或保留所有的#pragma的編譯器指令,編譯器后續(xù)會(huì)使?。
1.3.編譯
????????編譯過(guò)程就是將預(yù)處理的文件進(jìn)行一系列操作:詞法分析、語(yǔ)法分析、語(yǔ)義分析及優(yōu)化,并生成相應(yīng)的匯編代碼文件。
????????1.3.1.詞法分析
?????????將源代碼程序輸入掃描器,進(jìn)行簡(jiǎn)單的詞法分析,把代碼中字符分割成一系列的記號(hào)(關(guān)鍵字、標(biāo)識(shí)符、字面符與特殊符號(hào))???????
? 記號(hào) | ?類型 |
array | 標(biāo)識(shí)符 |
【 | 左方括號(hào) |
index | 標(biāo)識(shí)符 |
? 】 | 右方括號(hào) |
= | 賦值 |
( | 左圓括號(hào) |
index | 標(biāo)識(shí)符 |
+ | 加號(hào) |
4 | 數(shù)字 |
) | 右圓括號(hào) |
* | 乘號(hào) |
( | 左圓括號(hào) |
2 | 數(shù)字 |
+ | 加號(hào) |
6 | 數(shù)字 |
) | 右圓括號(hào) |
? ? ? ? ? ? 1.3.2.語(yǔ)法分析

????????1.3.3.語(yǔ)義分析?

1.4.鏈接? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?
? ? ?鏈接作為一個(gè)復(fù)雜的過(guò)程,鏈接時(shí)需要把一堆文件鏈接在一起方可生成可執(zhí)行程序。鏈接的過(guò)程主要包括:地址和空間分配,符號(hào)決議和重定位這些步驟;鏈接解決的是一個(gè)項(xiàng)目中多文件、多模塊之間互相調(diào)用的問(wèn)題。
? ? ? ?
1.5.運(yùn)行環(huán)境? ??
????????程序必須載入內(nèi)存中,在有操作系統(tǒng)的環(huán)境中:一般這個(gè)由操作系統(tǒng)完成。在獨(dú)立的環(huán)境中,程序的載入必須由手工安排,也可能是通過(guò)可執(zhí)行代碼置入只讀內(nèi)存來(lái)完成;程序的執(zhí)行便開(kāi)始,緊接著,調(diào)用main函數(shù),開(kāi)始執(zhí)行程序代碼,這個(gè)時(shí)候程序?qū)⑹褂靡粋€(gè)運(yùn)行時(shí)堆棧(stack),存儲(chǔ)函數(shù)的局部變量和返回地址。程序同時(shí)也可以使用靜態(tài)(static)內(nèi)存,存儲(chǔ)于靜態(tài)內(nèi)存中的變量在程序的整個(gè)執(zhí)行過(guò)程一直保留他們的值,終止程序。
? ?
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ??