臨近開學(xué),相信有一批好學(xué)的準(zhǔn)計(jì)算機(jī)相關(guān)行業(yè)的小伙伴在暑假期間開始自學(xué)C語言了。憑心而論,小編覺得python更適合作為初學(xué)者第一次學(xué)習(xí)的語言,他的安裝配置以及語法各方面都比C語言易學(xué)。但C語言也有其學(xué)習(xí)的優(yōu)點(diǎn),這不是本篇要討論的內(nèi)容。今天小編要介紹的,是關(guān)于C語言的編譯器,以及其中一款比較出名的編譯器MinGW的安裝。
什么是編譯?
我們把人說的話,稱為自然語言。同理,機(jī)器與機(jī)器之間的交流,使用的就是機(jī)器語言。我們知道機(jī)器與機(jī)器之間的交流是通過導(dǎo)線為基礎(chǔ),電流的變化傳遞的相關(guān)信息。通俗的講,電路中有兩種狀態(tài),一種是有電,一種是沒電。如果用數(shù)字0代表沒電,數(shù)字1代表有電1,那么連續(xù)的狀態(tài)變化,就能轉(zhuǎn)化為一串由0和1構(gòu)成的信息串。機(jī)器與機(jī)器之間的交流,就建立在這樣的信息串上2。
1. 這里的有電沒電是一種比較通俗的說法,實(shí)際上應(yīng)該稱其為高電平,低天平。
2.這樣的信息串,又被稱為機(jī)器語言,在計(jì)算機(jī)中常見的兩個(gè)處理信息的結(jié)構(gòu)中,內(nèi)存負(fù)責(zé)將這樣的信息存儲下來,方法也很簡單,每個(gè)內(nèi)存單元分別記錄響應(yīng)的0和1,這就是內(nèi)存的存儲過程,按一定的順序?qū)⑦@些0和1讀取出來,這就是內(nèi)存的讀取過程。而CPU按一定的間隔讀取這些信息串(比如以64位計(jì)算機(jī)為例,他可以一次讀取64個(gè)這樣的信息串),這些信息串具有不同的效果,有些是指令,比如讀到某些串后它就執(zhí)行加法等等,這些是計(jì)算機(jī)組成原理的知識,有興趣可以前往相關(guān)手冊進(jìn)行學(xué)習(xí)。
機(jī)器語言中的內(nèi)容有一部分是固定的指令,我們通過一些助記符(比如ADD,JUMP等)來代替這些固定的指令,這就是匯編語言。匯編語言要運(yùn)行前需要將這些固定的指令進(jìn)行替換,這個(gè)過程我們稱其為匯編。
匯編語言跟機(jī)器語言更為接近,人比較難以讀懂這樣的語言,所以這樣的語言被稱為底層語言,或者低級語言。我們之前說過,機(jī)器語言是跑在不同的機(jī)器上的,不同的機(jī)器存在著“方言”,也就是說不同的機(jī)器對同樣的信息串理解是不同的,這也就導(dǎo)致了不管是機(jī)器語言還是匯編語言,他只能跑在對應(yīng)的機(jī)器上,在別的機(jī)器上需要重新編寫匯編代碼。
匯編并不是編程的好工具。1972年,丹尼斯·里奇開發(fā)出了C語言,這是一種比匯編語言更適合用來編程的語言(在當(dāng)時(shí)確實(shí)是如此,但隨著時(shí)代的變革,后來者以更加易學(xué)和更加優(yōu)雅將前浪拍在了沙灘上),他通過一些符號來表述一個(gè)運(yùn)算過程,這些符號就是代碼(c語言的代碼,后綴為.c或者.cpp,另外還有.h作為頭文件)。這些代碼對于人來說是比較易讀的,但對于機(jī)器來說是完全不可讀的,那么怎么將這些代碼變成可讀的呢?這就要介紹編譯器的存在了。
C語言跟自然語言比較接近,而相對遠(yuǎn)離了機(jī)器語言,這種人容易讀懂的語言被稱為高級語言。編譯就是將高級語言轉(zhuǎn)化為低級語言的一個(gè)過程。
補(bǔ)充:其實(shí)還有另一種轉(zhuǎn)化方式叫解釋,編譯和解釋的區(qū)別是:編譯一次性將所有的高級語言翻譯為低級語言,解釋一句一句的將高級語言解釋為低級語言。著名的解釋型語言有JavaScript,python。Java的字節(jié)碼在jvm上也是解釋執(zhí)行的。
什么是編譯器?
編譯器就是用來將高級語言轉(zhuǎn)化為低級語言的程序。
最流行的C語言編譯器有以下幾種:
- GNU Compiler Collection 或稱 GCC(GCC編譯器的Windows版本被稱為MinGW)
- Microsoft C 或稱 MS C(也叫MSVC)
- Borland Turbo C 或稱 Turbo C
這些C語言版本不僅實(shí)現(xiàn)了ANSI C標(biāo)準(zhǔn),而且在此基礎(chǔ)上各自作了一些擴(kuò)充,使之更加方便、完美。
GCC是類Unix操作系統(tǒng)(Linux,macOS,BSD等)所用的編譯器,MSVC是Windows所用的編譯器,編譯的結(jié)果不能混用,也就是說使用MSVC編譯的可執(zhí)行文件是不能在linux上運(yùn)行的(另外linux的可執(zhí)行文件也不是.exe)。
怎么安裝和使用這些編譯器(Windows平臺下)?
MSVC只能在Windows平臺下安裝,安裝方式也是比較簡單的,直接安裝visual studio全家桶(舉幾個(gè)常見的例子,visual C++6.0,visual studio2010,visual studio2017都有該編譯器),就會附帶MSVC編譯器,一般來說直接使用VS全家桶就可以達(dá)到很不錯(cuò)的學(xué)習(xí)效果,但如果你想要單獨(dú)使用代碼編輯器加編譯器的開發(fā)方式,可以參考這篇文章:VSCode配置C++環(huán)境的方法步驟(MSVC)
MinGW的安裝也是比較簡單的,如果使用codeblock的話有些版本是有自帶MinGW的,可以直接使用這些MinGW,在這篇文章VSCode配置C++環(huán)境的方法步驟(MinGW)中兩款工具也都提供了MinGW的下載,想單獨(dú)使用代碼編輯器+編譯器的開發(fā)方式也可以直接參考該文章。接下來我們講講如何單獨(dú)安裝MinGW。
下載鏈接:sourceforge
下載后直接按照要求安裝即可。
注意,下載的是安裝器,安裝器本體比較小,需要聯(lián)網(wǎng)獲取MinGW的本體,整體安裝大概需要400M到600M左右,版本不同大小也不同。
安裝完成后可以在安裝路徑下找到MinGW64的文件夾,將其中的bin文件夾添加到環(huán)境變量中即可。
囿于篇幅原因,MinGW的詳細(xì)安裝部分小編放在單獨(dú)的一篇文章中介紹,小伙伴可以前往:如何安裝MinGW?GCC編譯器安裝教程!查看
編輯代碼
使用記事本或者代碼編輯器寫一段程序(這里不推薦使用記事本,小編使用vscode)。
首先通過命令行進(jìn)入你準(zhǔn)備要?jiǎng)?chuàng)建文件的目錄下進(jìn)行后續(xù)操作。
編譯過程
編譯過程分為四個(gè)步驟:預(yù)處理、編譯、匯編、鏈接。
1.預(yù)處理
預(yù)處理主要處理源文件中的“#include”、“#define”等預(yù)處理命令。
預(yù)處理主要完成的工作有:
(1)刪除#define,展開宏;
(2)處理?xiàng)l件編譯指令,預(yù)處理程序先判斷條件,在根據(jù)條件修改源代碼;
(3)刪除注釋;
(4)添加行號,以及文件名標(biāo)識,便于調(diào)試
(5)刪除“#include”,插入相應(yīng)的頭文件;
使用?g++ -E test.cpp -o test.i
??命令,預(yù)處理后得到?test.i
?文件
2.編譯
生成匯編代碼的過程,使用命令?g++ -S test.i -o test.s.
?生成匯編文件?test.s
?文件,當(dāng)然直接從?test.cpp
?文件得到匯編文件也可以。
3.匯編
將匯編代碼轉(zhuǎn)化成機(jī)器指令,生成目標(biāo)二進(jìn)制代碼。
使用命令?g++ -c test.s -o test.o
?生成?test.o
?文件
4.鏈接
通過鏈接庫文件,將目標(biāo)文件轉(zhuǎn)化成可執(zhí)行文件
使用命令?g++ test.o -o test.exe
?
當(dāng)然,一般情況下,可以直接使用?g++ test.cpp -o test
? 就可以生成可執(zhí)行程序了。
運(yùn)行程序
最后使用命令test.exe,即可運(yùn)行程序。
也可以直接點(diǎn)擊exe文件進(jìn)行運(yùn)行。
編譯器使用小結(jié)
通常情況下我們并不會手動(dòng)編譯,而是借助代碼編輯器的插件功能(比如上面介紹的vscode)或者IDE集成化項(xiàng)目構(gòu)建,但是手動(dòng)編譯的技術(shù)也是相當(dāng)重要的,小伙伴們應(yīng)該學(xué)習(xí)一下。
總結(jié)
以上就是關(guān)于C語言編譯器的全部介紹,希望能對各位小伙伴有所幫助。