2.編譯、優化過程
將.i檔案翻譯成會變得彙編**.s檔案(在windows中,通常使用.asm便是彙編檔案)
具體過程:
詞法分析
語法分析
語義分析
中間**生成
**優化
**生成
將多個步驟組合成趟
編譯器構成工具
ps:這裡解釋一下」趟」的概念
這個」趟「指的是對源程式或者其等價的中間**語言程式進行從頭到尾掃視,並完成規定任務的過程。
趟數的確定:1)源語言:對於有些名字說明在使用之後的至少需要2遍 2)目標機:對於一些記憶體較小的機器適合多遍,因為編譯程式少佔的記憶體。
ps:說一些符號表
符號表是在編譯的時候建立的,編譯完成後會被儲存在目標檔案中,標準的elf格式可執行檔案就包含了符號表, 可以用nm命令檢視。舉例:舉例:gcc -otest.exe test.c
nm test.exe > symbal.txt
3.彙編
將彙編檔案翻譯成機器指令,並打包成可重定位目標程式的.o檔案(在windows中,通常使用.obj表示彙編生成的二進位制檔案)。該檔案是二進位制檔案,位元組編碼是機器指令。
.cpp**在linux中直接編譯為.o檔案,即目標檔案。目標檔案主要用來描述程式在執行過程中需要存放在記憶體中的內容。目標檔案分為**段和資料段。
**段(.text)中的內容是原始檔中定義個乙個乙個函式編譯後得到的目標**,包括main函式和一般的自定義函式等。資料段中包含對原始檔中定義的各個靜態生存期物件(包括基本型別變數)的描述。資料段又分為初始化的資料段和未初始化的資料段。這一部分對應於下文中記憶體分配小節中的常量區中的初始化區和未初始化區
4.鏈結
將引用的其他.o檔案併入到我們程式所在的.o檔案中,處理得到最終的可執行檔案(在windows中,通常是.exe檔案,縮寫表示executable)。
在彙編中實現程式的連線有兩種方式,一種是通過在asm中使用include命令匯入其他程式,進行彙編的編譯masm .asm,再進行連線link .obj,生成.exe;另一種方法是把分別彙編編譯每個.asm,生成多個.obj,之後使用連線命令link a.obj,b.obj…生成.exe.(第乙個組合語言的編譯器使用機器碼寫的)
C C 編譯過程
大神部落格1 大神部落格2 大神部落格3 過程主要有四個 編譯預處理 preprocessing 編譯 優化階段 compilation 彙編過程 assemble 鏈結程式 linking 1.編譯預處理 preprocessing 預處理用於將所有的 include標頭檔案以及巨集定義替換成其真...
C C 編譯過程
在學習c 過程中,遇到了標頭檔案為什麼最好是包含.h型別,而不是cpp型別的問題。在尋找結果的過程過,發現是跟語言的編譯過程有關,藉此機會學習一下c c 的編譯過程 目的就是 將高階語言轉換成二進位制語言,供計算機執行 1.預處理 替換 中的標頭檔案,巨集定義,去除 注釋 gcc e text.cp...
C C 編譯過程詳解
gcc編譯過程四個步驟 1 預編譯 處理標頭檔案,處理巨集定義 2 編譯 c 編譯成 s檔案 3 彙編 s頭檔案匯編成機器碼.o 4 連線 吧不同的.o檔案連線起來。生成乙個可執行檔案 分析器 將源語言程式 轉換為組合語言,因為要從一種格式轉換為另一種格式分析器需要知道目標機器的組合語言。c 彙編 ...