程式到程序的過程

2021-07-07 04:09:20 字數 2052 閱讀 9238

程式就是一堆**組合起來實現某種功能,程序可以說是跑起來的程式。
程式經過編譯之後會生成乙個.exe可執行檔案

#include

#include

int global = 1; //全域性變數

int func()

int main(void)

size=2>程式中有兩種變數(區域性變數和全域性變數),宣告在函式體外部

的為全域性變數,全域性變數作用在整個程式的存活週期裡,宣告在函式裡面的是區域性

變數,區域性變數的作用域是它存在的哪個函式裡面,當函式return後,變數就會

被釋放。font>

重點是程式的執行過程:

當成需檔案執行為程序的時候是需要記憶體的,但是程序從記憶體中獲取的程序空間是什麼樣子的呢?

text區域用來儲存指令(instruction),說明每一步的操作。global data用於存放全域性變數,棧(stack)用於存放區域性

變數,堆(heap)用於存放動態變數 (dynamic variable. 程式利用malloc系統呼叫,直接從記憶體中為dynamic variable

開闢空間)。text和global data在程序一開始的時候就確定了,並在整個程序中保持固定大小。

棧(stack)以幀(stack frame)為單位。當程式呼叫函式的時候,比如main()函式中呼叫func()函式,stack會向下增長一幀。幀中儲存該函式的引數和區域性變數,以及該函式的返回位址(return address)。此時,計算機將控制權從main()轉移到func(),func()函式處於啟用(active)狀態。位於棧最下方的幀,和全域性變數一起,構成了當前的環境(context)。啟用函式可以從環境中呼叫需要的變數。典型的程式語言都只允許你使用位於stack最下方的幀 ,而不允許你呼叫其它的幀 (這也符合stack結構「先進後出」的特徵。但也有一些語言允許你呼叫棧的其它部分,相當於允許你在執行func()函式的時候呼叫main()中宣告的區域性變數,比如pascal)。當函式又進一步呼叫另乙個函式的時候,乙個新的幀會繼續增加到棧的下方,控制權轉移到新的函式中。當啟用函式返回的時候,會從棧中彈出(pop,讀取並從棧中刪除)該幀,並根據幀中記錄的返回位址,將控制權交給返回位址所指向的指令(比如從func()函式中返回,繼續執行main()中賦值給var3的操作)。

在程序執行的過程中,通過呼叫和返回函式,控制權不斷在函式間轉移。程序可以在呼叫函式的時候,原函式的幀中儲存有在我們離開時的狀態,並為新的函式開闢所需的幀空間。在呼叫函式返回時,該函式的幀所佔據的空間隨著幀的彈出而清空。程序再次回到原函式的幀中儲存的狀態,並根據返回位址所指向的指令繼續執行。上面過程不斷繼續,棧不斷增長或減小,直到main()返回的時候,棧完全清空,程序結束。

當程式中使用malloc的時候,堆(heap)會向上增長,其增長的部分就成為malloc從記憶體中分配的空間。malloc開闢的空間會一直存在,

直到我們用free系統呼叫來釋放,或者程序結束。乙個經典的錯誤是**記憶體洩漏**(memory leakage), 就是指我們沒有釋放不再使用

的堆空間,導致堆不斷增長,而記憶體可用空間不斷減少。

棧和堆的大小則會隨著程序的執行增大或者變小。當棧和堆增長到兩者相遇時候,也就是記憶體空間圖中的藍色區域(unused area)完全消失的時候,再無可用記憶體。程序會出現棧溢位(stack overflow)的錯誤,導致程序終止。在現代計算機中,核心一般會為程序分配足夠多的藍色區域,如果清理及時,棧溢位很容易避免。即便如此,記憶體負荷過大,依然可能出現棧溢位的情況。我們就需要增加物理記憶體了。

程序篇 程式編譯鏈結的過程

乙個原始檔生成最終的可執行檔案的過程可以分為四步 預編譯編譯 彙編鏈結 如下圖執行過程 使用gcc命令不跟任何的選項的話,會預設執行預編譯 編譯 彙編 鏈結這整個過程,就會得到乙個可執行檔案,預設為a.out 1.預編譯 gcc e hello.c o hello.i e 提示編譯器只執行完預編譯處...

關於源程式到可執行程式的過程

源程式,是指未經編譯的,按照一定的程式語言規範書寫的,人類可讀的文字檔案,我們通常理解為源程式就是我們所寫好的 可執行程式,我們常說的.exe程式,可以執行程式,完成計算機功能。在c語言中,c檔案就是所謂的原始檔,接下來,我們剖析一下,源程式到可執行程式的過程。在這個過程中,會發生如下的變化 c檔案...

關於源程式到可執行程式的過程

源程式,是指未經編譯的,依照一定的程式語言規範書寫的,人類可讀的文字檔案,我們通常理解為源程式就是我們所寫好的 可執行程式。我們常說的.exe程式,能夠執行程式。完畢計算機功能。在c語言中,c檔案就是所謂的原始檔,接下來,我們剖析一下,源程式到可執行程式的過程。在這個過程中。會發生例如以下的變化 c...