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