1. 程式人生 > >程式的編譯和執行過程

程式的編譯和執行過程

程式的編譯

  • 組成一個程式的每個原始檔通過編譯過程目的碼(objiect code)。
  • 每個目標檔案由連結器(linker)捆綁在一起,形成一個單一而完整的可執行程式。
  • 連結器同時也會引入標準C函式庫中任何被該程式所用到的函式,而且它可以搜尋程式設計師個人的程式庫,將其需要的函式也連結到程式中。

這裡寫圖片描述

編譯本身也分為幾個階段組成
看以下程式碼:
sum.c

int g_val = 2018;
void print(const char *str)
{
    printf("%s\n", str);
}

test.c

#include <stdio.h>
int main() { extern void print(char *str); extern int g_val; printf("%d\n", g_val); print("hello world.\n"); return 0 }

這裡寫圖片描述

檢視編譯過程的每一步:
test.c

#include <stdio.h>

int mian()
{
    int i = 0;
    for (i = 0; i < 10; i++){
        printf("%d", i);
    }
    return 0;
}

1.預處理 選項:gcc -E test.c -o test.i
預處理完成之後就停頓下來,預處理之後產生的結果都放在test.i檔案中。

2.編譯 選項:gcc -S test.c
編譯完成之後就停頓下來,結果儲存在test.s中。

3.彙編 gcc -c test.c
彙編完成之後就停頓下來,結果儲存在test.o中。

程式的執行過程

  1. 程式必須載入記憶體中,在有作業系統的環境中:⼀般這個由作業系統完成;在獨立的環境中,程式的載入必須由手工安排,也可能是通過可執行程式碼置入記憶體來完成。
  2. 程式的執行便開始,接著便呼叫main函式。
  3. 開始執行程式程式碼,這個時候程式將使用一個執行時堆疊(stack),儲存函式的區域性變數和返回地址,程式同時也可以使用靜態(static)記憶體,儲存於靜態記憶體中的變數在程式的整個執行過程一直保留他們的值。
  4. 終止程式,正常終止main函式,也可能是意外終止。