[C++]HelloWorld背後的故事!

人物介紹

姓名 HelloWorld
性別 .cpp
住址 D:\
身份證號(SHA1) 25106D2879A9EA300BB264F8155A71D7C44DA2E8

故事簡介

  1. 編寫源文件
  2. 預編譯
  3. 編譯
  4. 彙編
  5. 連接

1、編寫源文件

  源代碼:html

#include <iostream>
using namespace std;

int main()
{
	cout << "Hello World!" << endl;
	return 0;
}

2、預編譯

  預編譯輸入命令g++ -o HelloWorld.i -E HelloWorld.cpplinux

  該命令表示編譯環節的第一步,也就是預編譯!固然,這一步也能夠被稱爲「編譯預處理」!而這個 HelloWorld.i 便是預編譯事後的文件!ios

序號 主要行爲
1. 展開全部的宏定義,消除「#define」
2. 處理全部的預編譯指令,好比#if、#ifdef等
3. 處理#include預編譯指令,將包含文件插入到該預編譯的位置
4. 刪除全部的註釋「/**/」、"//"等
5. 添加行號和文件名標識,以便於編譯時編譯器產生調試用的行號信息以及錯誤提醒
6. 保留全部的#program編譯指令,緣由是編譯器要使用它們

值得注意:這一步不會作出任何安全性和合法性的檢查!安全

3、編譯

  編譯請輸入命令g++ -o HelloWorld.s -S HelloWorld.i編輯器

  該命令表示編譯過程,也就是生成相應的彙編文件 HelloWorld.s 。函數

主要行爲 具體描述
詞法分析 將源代碼文件的字符序列劃分爲一系列的記號,通常詞法分析產生的記號有:標識符、關鍵字、數字、字符串、特殊符號(加號、等號);在識別記號的同時也將標識符放好符號表、將數字、字符放入到文字表等;有一個lex程序能夠實現詞法掃描,會按照以前定義好的詞法規則將輸入的字符串分割成記號,因此編譯器不須要獨立的詞法掃描器
語法分析 語法分析器將對產生的記號進行語法分析,產生語法樹----就是以表達式尾節點的樹,一步步判斷如何執行表達式操做;若是存在括號不匹配或者表達式錯誤,編譯器就會報告語法分析階段的錯誤;相同的存在一個yacc程序能夠根據用戶輸入的語法規則生成語法樹;
語義分析 由語法階段完成分析的並無賦予表達式或者其餘實際的意義,好比乘法、加法、減法,必須通過語義階段才能賦予其真正的意義;
代碼優化 將代碼進行優化處理
符號彙總 彙總全部符號

補充說明:其中語義分析又能夠分爲「靜態語義分析」和「動態語義分析」兩種。工具

語義分析 簡單說明
靜態語義分析 一般在編譯器就能夠肯定的語義,主要包括「聲明」、「類型的匹配」以及「類型的轉換」
動態語義分析 只能在運行期才能肯定的語義

4、彙編

  彙編請輸入命令g++ -o HelloWorld.o -C HelloWorld.s優化

  該命令表示對 HelloWorld.s 文件進行彙編處理,生成對應的可重定位的二進制文件 HelloWorld.o ,也就是咱們所熟知的機器語言對應的文件。spa

5、連接

  連接請輸入命令g++ HelloWorld.cpp -o HelloWorld.exe操作系統

  經過調用連接器ld來連接程序運行須要的一大堆目標文件,以及所依賴的其它庫文件,最後生成可執行文件., 連接的主要內容是把各個模塊之間相互引用的部分處理好,使得各個模塊之間可以正確地銜接。

須要指出:連接分爲「靜態連接」和「動態連接」。

連接類型 具體說明
靜態連接 指在編譯階段直接把靜態庫加入到可執行文件中去,這樣可執行文件會比較大
動態連接 指連接階段僅僅只加入一些描述信息,而程序執行時再從系統中把相應動態庫加載到內存中去

須要補充:

庫文件類型 特色
靜態庫文件 是一個二進制文件,存放的功能函數實現,在文件編譯時要訪問文件,編譯以後靜態庫文件能夠刪除
動態庫文件 是一個二進制文件,存放的功能函數實現,在文件執行時要訪問文件,編譯時不須要動態庫文件

額外說明:

操做系統 動態庫文件後綴名
linux .so
window .dll

相冊

預編譯後的文件HelloWorld.i

HelloWorld.i

  能夠看到,代碼量驚人的大!足足有兩萬多行!可想這個HelloWorld也不簡單啊!

編譯後的文件HelloWorld.s

HelloWorld.s

彙編後的文件HelloWorld.o

HelloWorld.o

  能夠看出,記事本已經顯示亂碼了!

幫忙的朋友

工具 做用 負責過程
編輯器 編寫代碼的一些窗口 編寫源代碼
編譯器 檢查用戶代碼的一些語法錯誤,將其編譯成彙編代碼 預編譯、編譯
彙編器 將編譯出來的彙編文件編譯成必定功能的目標代碼 彙編
鏈接器 將目標代碼鏈接成可執行文件 連接

原創說明

原文做者:Seaver(海之戀SF)
如要轉載,請務必註明出處!
原文連接:http://www.javashuo.com/article/p-hwkelqzr-ga.html

相關文章
相關標籤/搜索