姓名 |
HelloWorld |
---|---|
性別 |
.cpp |
住址 |
D:\ |
身份證號(SHA1) |
25106D2879A9EA300BB264F8155A71D7C44DA2E8 |
源代碼:html
#include <iostream> using namespace std; int main() { cout << "Hello World!" << endl; return 0; }
預編譯輸入命令g++ -o HelloWorld.i -E HelloWorld.cpp
linux
該命令表示編譯環節的第一步,也就是預編譯!固然,這一步也能夠被稱爲「編譯預處理」!而這個 HelloWorld.i 便是預編譯事後的文件!ios
序號 | 主要行爲 |
---|---|
1. | 展開全部的宏定義,消除「#define」 |
2. | 處理全部的預編譯指令,好比#if、#ifdef等 |
3. | 處理#include預編譯指令,將包含文件插入到該預編譯的位置 |
4. | 刪除全部的註釋「/**/」、"//"等 |
5. | 添加行號和文件名標識,以便於編譯時編譯器產生調試用的行號信息以及錯誤提醒 |
6. | 保留全部的#program編譯指令,緣由是編譯器要使用它們 |
值得注意:這一步不會作出任何安全性和合法性的檢查!安全
編譯請輸入命令g++ -o HelloWorld.s -S HelloWorld.i
編輯器
該命令表示編譯過程,也就是生成相應的彙編文件 HelloWorld.s 。函數
主要行爲 | 具體描述 |
---|---|
詞法分析 |
將源代碼文件的字符序列劃分爲一系列的記號,通常詞法分析產生的記號有:標識符、關鍵字、數字、字符串、特殊符號(加號、等號);在識別記號的同時也將標識符放好符號表、將數字、字符放入到文字表等;有一個lex程序能夠實現詞法掃描,會按照以前定義好的詞法規則將輸入的字符串分割成記號,因此編譯器不須要獨立的詞法掃描器 |
語法分析 |
語法分析器將對產生的記號進行語法分析,產生語法樹----就是以表達式尾節點的樹,一步步判斷如何執行表達式操做;若是存在括號不匹配或者表達式錯誤,編譯器就會報告語法分析階段的錯誤;相同的存在一個yacc程序能夠根據用戶輸入的語法規則生成語法樹; |
語義分析 |
由語法階段完成分析的並無賦予表達式或者其餘實際的意義,好比乘法、加法、減法,必須通過語義階段才能賦予其真正的意義; |
代碼優化 |
將代碼進行優化處理 |
符號彙總 |
彙總全部符號 |
補充說明:其中語義分析又能夠分爲「靜態語義分析」和「動態語義分析」兩種。工具
語義分析 | 簡單說明 |
---|---|
靜態語義分析 | 一般在編譯器就能夠肯定的語義,主要包括「聲明」、「類型的匹配」以及「類型的轉換」 |
動態語義分析 | 只能在運行期才能肯定的語義 |
彙編請輸入命令g++ -o HelloWorld.o -C HelloWorld.s
優化
該命令表示對 HelloWorld.s 文件進行彙編處理,生成對應的可重定位的二進制文件 HelloWorld.o ,也就是咱們所熟知的機器語言對應的文件。spa
連接請輸入命令g++ HelloWorld.cpp -o HelloWorld.exe
操作系統
經過調用連接器ld來連接程序運行須要的一大堆目標文件,以及所依賴的其它庫文件,最後生成可執行文件., 連接的主要內容是把各個模塊之間相互引用的部分處理好,使得各個模塊之間可以正確地銜接。
須要指出:連接分爲「靜態連接」和「動態連接」。
連接類型 | 具體說明 |
---|---|
靜態連接 | 指在編譯階段直接把靜態庫加入到可執行文件中去,這樣可執行文件會比較大 |
動態連接 | 指連接階段僅僅只加入一些描述信息,而程序執行時再從系統中把相應動態庫加載到內存中去 |
須要補充:
庫文件類型 | 特色 |
---|---|
靜態庫文件 | 是一個二進制文件,存放的功能函數實現,在文件編譯時要訪問文件,編譯以後靜態庫文件能夠刪除 |
動態庫文件 | 是一個二進制文件,存放的功能函數實現,在文件執行時要訪問文件,編譯時不須要動態庫文件 |
額外說明:
操做系統 | 動態庫文件後綴名 |
---|---|
linux | .so |
window | .dll |
HelloWorld.i
能夠看到,代碼量驚人的大!足足有兩萬多行!可想這個HelloWorld也不簡單啊!
HelloWorld.s
HelloWorld.o
能夠看出,記事本已經顯示亂碼了!
工具 | 做用 | 負責過程 |
---|---|---|
編輯器 | 編寫代碼的一些窗口 | 編寫源代碼 |
編譯器 | 檢查用戶代碼的一些語法錯誤,將其編譯成彙編代碼 | 預編譯、編譯 |
彙編器 | 將編譯出來的彙編文件編譯成必定功能的目標代碼 | 彙編 |
鏈接器 | 將目標代碼鏈接成可執行文件 | 連接 |
原文做者:Seaver(海之戀SF)
如要轉載,請務必註明出處!
原文連接:http://www.javashuo.com/article/p-hwkelqzr-ga.html