標籤:

1.2 程序被其他程序翻譯成不同格式

1.一般新手對整個編譯系統不敏感,所以啃的時候除了死記硬背,或者乾脆直接跳過。因為我們一開始玩編程只知道一個.c文件直接就變.exe了,現在看來竟然有那麼多未知東西也是難以消化。

簡單說明一下,預處理器是一個函數,編譯器是一個函數,彙編器也是一個函數,鏈接器也是一個函數。玩過文件操作的比較好理解,它的執行過程應該是這樣的,當你按下編譯的時候:

預處理器("hello.c」);然後輸出一個hello.i文件

編譯器(「hello.i」);然後輸出一個hello.s文件

彙編器(「hello.s」);然後輸出一個hello.o文件

鏈接器(「hello.o」);然後輸出一個hello.exe文件

看到了沒,實際上你按下編譯按鈕的時候會執行4大函數,然後生成exe文件給你運行。不過gcc編譯器比較智能:

gcc -o 的意思是只執行三個函數——預處理器、編譯器、彙編器。生成一個hello.o文件,這個文件裡面已經全是二進位了,但是卻無法運行,這涉及到和操作系統的配合,在第7章鏈接的時候會講解。

由於我們windows下編程,沒unix的gcc那麼細膩,通常都是直接一編譯就出了exe文件,那麼說好的先輸出hello.i、hello.s、hello.o在哪?我的理解是,如果你直接一連串調用4個大函數編譯成exe文件,它不會輸出i、s、o三個文件,而是以數據結構的形式存儲在內存當中提供信息,它編譯完成時就會丟棄這些信息了。不會數據結構的人可能很難理解,通俗點講就是文件載入進了內存就變數據結構,數據結構放到磁碟上就變了文件,調用函數時不做文件輸出讓它停留在內存里不就變數據結構了嘛。所以說學好數據結構重要啊!無法理解的建議補完數據結構再看,其實這裡再深入就涉及編譯原理了,我完全不會啊。

上面已經講的差不多了,由於操作系統不同,格式會有所不同,所以書沒寫死,可執行目標文件在windows就是exe文件,其他操作系統如linux和unix是不同的。
推薦閱讀:

數據結構之線性表
工廠模式、工廠方法模式和抽象工廠模式的差異分析
python自學周報(第0期):而今邁步從頭越
我好像有能力閱讀《深入理解計算機系統》了

TAG:自學編程 |