程序環境

在我們最開始學c語言時,我們知道:
源文件(.c) -> 編譯 +鏈接(.obj) -> 可執行程序 (.exe)

那麼計算機在每一步具體幹了什麼?:

在ANSI C的任何一種實現中,存在兩個不同的環境。

一. 翻譯環境(編譯+鏈接):在這個環境中源代碼被轉換成可執行的機器指令。

  • 組成一個程序的每個(有可能有多個)源文件單獨通過編譯器分別轉換成目標代碼(.obj)。

  • 各個目標文件由鏈接器(linker)捆綁在一起,形成一個單一而完整的可執行程序。

  • 鏈接器同時也會引入標準C函數庫中任何被該程序所用到的函數,而且它也可以搜索程序員個人的程序庫,將其中需要使用的函數也鏈接到程序中。

其中,編譯過程也由幾個階段構成:

二. 執行環境(操作系統):用於實際執行代碼。

  • 程序必須載入到內存中。在宿主環境中(也就是具有操作系統的環境),這個任務由操作系統完成。那些不是存儲在堆棧中的尚未初始化的變量將在這個時候得到初始值。在獨立環境中,程序的載入必須由手工安排,也可能是通過把可執行代碼置入只讀內存(ROM)來完成。

  • 程序的執行便開始。在宿主環境中,通過一個小型的啓動程序與程序鏈接在一起。它負責處理一系列日常事務,如收集命令行參數以便使程序能夠訪問它們。接着,便調用main函數。

  • 開始執行函數代碼。在絕大多數機器裏,程序將使用一個運行時堆棧(stack),用於存儲函數的局部變量和返回地址。程序同時也可以使用靜態(static)內存,存儲於靜態內存中的變量在程序的整個執行過程中將一直保留它們的值。

  • 終止程序,它可以由多種不同原因引起。「正常」終止就是main函數返回。除此之外,程序也可能是由於用戶按下break鍵或者電話連接的掛起而終止,另外也可能是由於在執行過程中出現錯誤而自行中斷。