摘要:一翻譯環(huán)境和執(zhí)行環(huán)境標(biāo)準(zhǔn)是由美國國家標(biāo)準(zhǔn)協(xié)會及國際化標(biāo)準(zhǔn)組織推出的關(guān)于語言的標(biāo)準(zhǔn)。開始執(zhí)行程序代碼,這個時候程序?qū)⑹褂靡粋€運(yùn)行時堆棧,內(nèi)存函數(shù)的局部變量和返回地址。正常終止函數(shù)也有可能是意外終止。棧幀中保存了該函數(shù)的返回地址和局部變量。
程序環(huán)境是什么?我們都 "經(jīng)歷" 過,但不曾感知到 "他" 的存在。我們其實(shí)在不知不覺中早就已經(jīng)接觸到了程序環(huán)境…… 第一次創(chuàng)建了一個文件(test.c),敲下那句 "hello world"? 隨后保存后點(diǎn)擊運(yùn)行后編譯出可執(zhí)行文件(test.exe)時,其實(shí)就已經(jīng)接觸到了 "他" 了。
我們只是按下了運(yùn)行,然后好像所有東西都像變魔術(shù)一樣直接就產(chǎn)生了,這一切都似乎是理所當(dāng)然的事。但是你是否思考過他是如何變成 "可執(zhí)行程序" 的呢?在這一章,我們將簡單地探討一個 "源程序"是如何變成 "可執(zhí)行程序" 的,作一個大概了解。
ANSI C是由美國國家標(biāo)準(zhǔn)協(xié)會(ANSI)及國際化標(biāo)準(zhǔn)組織(ISO)推出的關(guān)于C語言的標(biāo)準(zhǔn)。ANSI C 主要標(biāo)準(zhǔn)化了現(xiàn)存的實(shí)現(xiàn), 同時增加了一些來自 C++ 的內(nèi)容 (主要是函數(shù)原型) 并支持多國字符集 (包括備受爭議的三字符序列)。
? ANSI C 幾乎被所有廣泛使用的編譯器所支持,且多數(shù)C代碼是在ANSI C基礎(chǔ)上寫的。
? ANSI C 的任何一種實(shí)現(xiàn)中,存在兩種不同的環(huán)境:
????? ① 翻譯環(huán)境:在該環(huán)境中,源代碼被轉(zhuǎn)換為可執(zhí)行的機(jī)器指令。
????? ② 執(zhí)行環(huán)境:用于實(shí)際執(zhí)行代碼。
?? 組成一個程序的每個源文件通過編譯過程分別轉(zhuǎn)換成目標(biāo)代碼(object code)
每個目標(biāo)文件由鏈接器(linker)捆綁在一起,形成一個單一而完整的可執(zhí)行程序。
連接器同時也會引入標(biāo)準(zhǔn)C庫函數(shù)中任何被該程序所用到的函數(shù),且可以搜索程序員個人的程序庫,將其需要的函數(shù)也鏈接到程序中。
? 舉個例子:test.c、add.c、minu.c
? 舉個例子:
① sum.c
int global_val = 2021;void print(const char* string) { printf("%s/n", string);}
② test.c
#include int main(void) { extern void print(char* string); extern int global_val; printf("%d/n", global_val); printf("Hello,World!/n"); return 0;}
test.c sum.c | 預(yù)編譯截?cái)啵?strong>*.i) 預(yù)處理指令 …… | 編譯(*.s) 語法分析 詞法分析 語義分析 符號匯總 | 匯編(生成可重定位目標(biāo)文件 *.O) 形成符號表 匯編指令 → 二進(jìn)制指令 ----→ test.o ?????????????????????????????? ?? ?? ? ----→ sum.o | 鏈接 1. 合并段表 2. 符號表的合并和符號表的重定位 |
隔離編譯,一起鏈接。 |
? main.c
extern int sum(int, int);int main(void) { sum(1, 2); return 0;}
? sum.c
int sum(int num1, int num2) { return( num1 + num2);}
? 解析圖(VS2019):
? 程序執(zhí)行過程:
① 程序必須載入內(nèi)存中。在有操作系統(tǒng)的環(huán)境中:程序的載入一般由操作系統(tǒng)完成。在獨(dú)立環(huán)境中:程序的載入必須手工安排,也可能是通過可執(zhí)行代碼置入只讀內(nèi)存來完成。
② 程序的執(zhí)行便開始。接著便調(diào)用 main 函數(shù)。
③ 開始執(zhí)行程序代碼,這個時候程序?qū)⑹褂靡粋€運(yùn)行時堆棧(stack),內(nèi)存函數(shù)的局部變量和返回地址。程序同時也可以使用靜態(tài)(staic)內(nèi)存,存儲與靜態(tài)內(nèi)存中的變量在整個執(zhí)行過程中一直保留他們的值。
④ 終止程序。正常終止 main 函數(shù)(也有可能是意外終止)。
? 舉個例子:這段代碼的執(zhí)行過程
int Add(int x, int y) { return( x + y);}int main(void) { int a = 10; int b = 20; int ret = Add(a, b); return 0;}
? 這里還有一個概念:函數(shù)棧幀 (目前做簡單了解,后續(xù)我將專門寫一篇函數(shù)棧幀的講解)
【百度百科】C語言中,每個棧幀對應(yīng)著一個未運(yùn)行完的函數(shù)。棧幀中保存了該函數(shù)的返回地址和局部變量。
?
?
Microsoft. MSDN(Microsoft Developer Network)[EB/OL]. []. .
俞甲子 / 石凡 / 潘愛民. 《程序員的自我修養(yǎng)》[M]. 電子工業(yè)出版社, 2009-4.
比特科技. C語言進(jìn)階[EB/OL]. 2021[2021.8.31]. .
本章完。
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://specialneedsforspecialkids.com/yun/119118.html
摘要:淺析微信支付前篇大綱本文是淺析微信支付系列文章的第一篇,主要會介紹一下為何寫下這個系列以及對于微信支付的一點(diǎn)小經(jīng)驗(yàn),與君共勉。下面講一下我是如何去學(xué)習(xí)微信支付的。 淺析微信支付:前篇大綱 本文是【淺析微信支付】系列文章的第一篇,主要會介紹一下為何寫下這個系列以及對于微信支付的一點(diǎn)小經(jīng)驗(yàn),與君共勉。 以下會分幾個步驟講一下我學(xué)習(xí)微信支付的過程,也是一部辛酸史,也是希望朋友們不要再次跌進(jìn)...
摘要:淺析筆者在此整理了常見的命令,的重要性無需多言,與其再百度海中搜索命令,不妨嘗試收藏筆者的此篇作品。旨在快速高效地處理無論規(guī)模大小的任何軟件工程。其最大特色就是分支及合并操作非常快速簡便。 淺析git 筆者在此整理了常見的git命令,git的重要性無需多言,與其再百度海中搜索git命令,不妨嘗試收藏筆者的此篇作品。希望對你的學(xué)習(xí)有所幫助。 版本控制系統(tǒng)之git Git: (一)簡介:G...
閱讀 933·2021-09-07 09:58
閱讀 1484·2021-09-07 09:58
閱讀 2869·2021-09-04 16:40
閱讀 2500·2019-08-30 15:55
閱讀 2404·2019-08-30 15:54
閱讀 1363·2019-08-30 15:52
閱讀 423·2019-08-30 10:49
閱讀 2598·2019-08-29 13:21