第一開始,我們的計算機只能識別010101這樣的二進制指令,而我們?yōu)榱俗層嬎銠C去計算我們所需要的結(jié)果。就需要去記憶一個又一個的二進制指令,這樣既繁瑣又容易出錯。后來人們想了一種方法,用簡單的十進制數(shù)字與字母的組合去對應機器能夠讀懂的一個個二進制指令,就這樣發(fā)明了匯編語言。匯編語言相比于機器語言,操作更簡單,記憶更便捷。但這樣遠遠不夠。之后人們又發(fā)明了高級語言,高級語言是一種相比于匯編語言邏輯更清晰,更易讀的語言。高級語言又與匯編語言有相似點。我們需要先通過類似對照表的東西,將高級語言翻譯成匯編語言。匯編語言再翻譯成機器語言。這個時候機器就可以去讀懂高級語言了。
我們將高級語言翻譯成匯編語言的過程叫做編譯。
將匯編語言翻譯成機器語言的過程叫做匯編。
計算機去允許它能讀懂機器語言,就能生成所對應的結(jié)果了。
C++從代碼到可執(zhí)行的二進制文件一般要進過以下4個流程,分別是預處理,編譯,匯編,鏈接。
我們在記事本或者ide里面編寫的一行一行的c++代碼,我們稱之為源代碼。計算機肯定是讀不懂我們所寫的源代碼的,計算機只能讀懂機器代碼也就是二進制指令。所以由我們寫的c++代碼需要經(jīng)過一系列的處理才能轉(zhuǎn)換成機器語言。
這其中這一些列的處理都是由一個叫做GCC(GNU Compiler Collection,GNU編譯器套件)編譯器套件去完成的。這里我們就不再去介紹GCC編譯套件是一個什么東西啦,我們主要的目的是去通過GCC這個工具去看看我們的源代碼是怎么一步步的變成計算機能讀懂的機器代碼。我們的這一步操作叫做源代碼的預處理。
通常的預處理操作有:
(1) 將所有的#define刪除,并且展開所有的宏定義
(2) 處理所有的條件預編譯指令,如#if、#ifdef
(3) 處理#include預編譯指令,將被包含的文件插入到該預編譯指令的位置。
(4) 過濾所有的注釋
(5) 添加行號和文件名標識。
這里我們可以自己在記事本或者ide里寫一個文件。然后我們在智能ide,Linux的命令行,或者unix的終端中輸入g++ -E 目標文件名稱 -o 生成文件名稱。就可以去具體的查看預處理操作到底對你的代碼做了怎么樣的處理。
nowcoder@nowcoder:~/Linux/lession02$ g++ -E test.c -o text.i
nowcoder@nowcoder:~/Linux/lession02$ ls
test.c text.i
//這里這個text.i就是我們通過GCC這個編譯器生成的預處理后的代碼。
代碼進行過預處理后緊接著需要執(zhí)行編譯操作。編譯操作會將預處理后的源代碼變?yōu)閰R編代碼。
使用命令 g++ -S 預處理文件名稱 -o 生成目標文件名稱 就可以得到一個含有匯編代碼的文件,我們同樣也可以點擊進文件去查看我們的匯編代碼,不過沒有學習過匯編的同學可能看不太懂其中寫的是什么,但是有一些英語單詞是我們一眼就能看出是什么意思的。也可以去猜猜表達的是什么。
nowcoder@nowcoder:~/Linux/lession02$ g++ -S test.i -o test.s
nowcoder@nowcoder:~/Linux/lession02$ ls
test.cpp test.i test.s
//test.s文件里面裝著的就是我們預處理后匯編生成的匯編代碼。
這個時候我們的匯編代碼還沒有通過編譯器生成機器可以讀懂的機器代碼,所以要執(zhí)行匯編操作,使匯編代碼轉(zhuǎn)換成機器代碼。輸入命令g++ -c 匯編文件名稱 -o 生成文件名稱 去將匯編代碼轉(zhuǎn)換成機器能讀懂的二進制指令。
nowcoder@nowcoder:~/Linux/lession02$ g++ -c test.s -o text.o
nowcoder@nowcoder:~/Linux/lession02$ ls
test.cpp test.i test.s text.o
//其中這個text.o就是我們生成的二進制文件,這個文件在我的vscode上打不開,
//因為我沒有安裝相應的配置文件,不過沒關系,打開了也看不懂,因為我們沒有學
//習過機器語言。
最后我們要進行鏈接操作,將目標代碼(機器代碼)和其他啟動代碼、庫代碼,和其他目標代碼(這些都是不同文件的機器代碼)進行鏈接,就可以生成一個可執(zhí)行的二進制文件(程序)了。
nowcoder@nowcoder:~/Linux/lession02$ g++ text.o -o test.out
nowcoder@nowcoder:~/Linux/lession02$ ls
test.cpp test.i test.out test.s text.o
nowcoder@nowcoder:~/Linux/lession02$ ./test.out
13
//其中這個test.out就是我們最終生成的可執(zhí)行文件了。
至此,我們就講解完成了如何將一行行c++代碼如何逐步從一行行代碼轉(zhuǎn)變成為一個可執(zhí)行程序的全過程。
附錄,一些常用的GCC指令。你是否還在尋找穩(wěn)定的海外服務器提供商?創(chuàng)新互聯(lián)www.cdcxhl.cn海外機房具備T級流量清洗系統(tǒng)配攻擊溯源,準確流量調(diào)度確保服務器高可用性,企業(yè)級服務器適合批量采購,新人活動首月15元起,快前往官網(wǎng)查看詳情吧
網(wǎng)站欄目:如何讓計算機去理解我們寫的c++代碼-創(chuàng)新互聯(lián)
網(wǎng)頁鏈接:http://www.rwnh.cn/article38/cehcpp.html
成都網(wǎng)站建設公司_創(chuàng)新互聯(lián),為您提供手機網(wǎng)站建設、全網(wǎng)營銷推廣、定制開發(fā)、Google、自適應網(wǎng)站、外貿(mào)網(wǎng)站建設
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)