看完這篇文章之后,終于明白了編譯到底怎么回事,
1
對于同一個陳述句,有如下三種:高級語言、低級語言、機器語言的表示
C語言:
a=b+1;
匯編語言:
mov -0xc(%ebp),%eax
add $0x1,%eax
mov %eax,-0x8(%ebp)
機器語言:
8b 45 f4
83 c0 01
89 45 f8
我們都知道,機器是只能做數字計算的,能夠讓機器去運算的、數字的語言就是機器語言,除此之外的所有計算機語言都是非機器語言,
這樣的相對于機器語言的高級語言都需要一個轉換,從高級、機器不可理解,轉換為機器可理解的機器語言,
這樣的一個轉換程序就叫做編譯(Compile),由編譯器(Compiler)來完成,
由C轉換為匯編語言這一程序是由匯編器(Assembler)來執行的,
C和匯編語言轉換為機器語言都是由編譯器來完成的,
2
這里面,C是可跨平臺的,也可以說是與平臺無關的,這里的平臺有兩種說法,一種是指計算機的體系(Architecture),另一種是指作業系統(Operate System),也可以是指兩種的結合,
不同的平臺,他們所需要的執行機器語言的指令集是不同的,C的跨平臺性是指,只需要撰寫一份不需要修改的C程式代碼,就可以在不同體系、不同作業系統的計算機上運行,
這都要靠編譯器的功勞,編譯器將C程式翻譯為了適合當前計算機體系的機器語言,
下面說一下將C語言編譯為機器語言的整個程序:
首先,我們寫出一份C程式代碼,命名該代碼為hello.c,這個代碼檔案,我們稱之為源代碼(Srouce Code),
然后我們運行編譯器,對該源代碼檔案進行編譯,在整個編譯的程序中,編譯器并不會執行該源代碼,只是生成一份新的機器語言代碼檔案,如hello.out,
這份新生成的代碼檔案稱為目標代碼(Object Code)或可執行代碼(Executable),
3
對于編譯程序,里面還涉及到具體的一些可以說的細節步驟,在Linux下,使用gcc編譯器:
? 預編譯hello.c檔案:
gcc -E -o hello.i hello.c
執行成功后就會生成一個新的hello.i的檔案,可以用編輯器(Vim)查看它的內容,這個檔案就是經過預編譯后的內容,
預編譯又稱為預處理,是做些代碼文本的替換作業,預編譯可以處理#開頭的指令,比如拷貝#include包含的檔案代碼,#define的宏定義的替換,條件編譯等,
? 純粹的進行編譯:
gcc -S -o hello.s hello.i
把.i檔案寫為hello.c也行,就是跳過手動預編譯,直接完成預編譯和編譯兩個程序,
這時會得到一個hello.s檔案,打開看一下,里面是編譯好的使用于當前體系結構的匯編代碼,
? 把匯編代碼處理為目標檔案:
gcc -c -o hello.o hello.s
把.s檔案換成.c也行,就是自動完成預編譯、編譯和匯編三個程序,
現在得到一個hello.o檔案,這是一個二進制檔案,但不是最后的可執行二進制檔案,因為它還缺少最后一步連接處理,
最后對目標檔案.o檔案進行連接,我們這里就一個.o檔案所以簡單,經常是需要有多個.o檔案需要連接,
? 連接執行:
gcc -o hello hello.o
如果把最后的.o檔案寫成.c,那就和最開始我們用hello.c編譯時示范的那樣了,實際上那樣是完成了預編譯、編譯、匯編和連接一連串的程序,
-o選項給輸出的檔案重新命名而不使用gcc默認的檔案名,
想了解更多gcc的姿勢可以到GNU上去看看,

最后,不管你是轉行也好,初學也罷,進階也可,如果你想學編程~
——【值得關注】我的 C/C++編程學習交流俱樂部!——
涉及:C語言、C++、windows編程、網路編程、QT圖形界面開發、Linux編程、游戲編程、資料結構與算以及資料庫......
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/240322.html
標籤:C
上一篇:十大經典排序演算法
