C C 編譯原理及過程整理

2021-09-24 01:14:59 字數 2038 閱讀 9243

面試被問到c編譯原理,所以回來整理一下。

編譯主要分為四個大步驟:預編譯、編譯(.s、.asm)、彙編(.obj、.o、.a、.ko)、鏈結(.exe、.elf、.axf等),在c/c++中統稱為編譯。

前面文章 介紹過整合開發環境、編譯器,這裡再說明一下,整合開發環境是用於提供程式開發環境的應用程式,一般包括**編輯器、編譯器,偵錯程式和圖形使用者介面工具。整合了**編寫功能、分析功能、編譯功能、除錯功能等一體化的開發軟體服務套。

編譯器:檢查使用者**的一些語法錯誤,將其編譯成彙編**。

彙編器:將編譯出來的彙編檔案編譯成一定功能的目標**。

聯結器:將目標**連線成可執行檔案。

(一)預編譯

使用的gcc命令是:gcc –e

對應於預處理命令cpp

a. 巨集定義指令:將所有的#define刪除,並且展開所有的巨集定義。

b. 條件編譯指令:處理所有的條件預編譯指令,比如#if #ifdef #elif #else #endif等。

c. 標頭檔案包含指令:處理#include 預編譯指令,將被包含的檔案插入到該預編譯指令的位置。

d. 特殊符號指令:預編譯器可研識別一些特殊的符號,例如:刪除所有注釋 「//」和」/* */」。

e.為debug及日誌新增行號和檔案標識,以便編譯時產生除錯用的行號及編譯錯誤警告行號。

f. 保留所有的#pragma編譯器指令,因為編譯器需要使用它們。

(二)編譯

使用的gcc命令是:gcc –s

對應於編譯命令cc –s

a.詞法分析

使用掃瞄器將原始碼分隔為一系列的記號(token),即原始碼中的不可分隔項,較為容易理解,比如下面的:

int index = (2 + 8) * c 會被折分為 :int index = ( 2 + 8 ) * c 10個token,左右半括號各為乙個

b.語法分析

將a中分出來的token,對映為語法樹。

c.語義分析

靜態語義(在編譯器可以確定的語義)、動態語義(只能在執行期才能確定的語義)。

在b中語法樹的基礎上,分析是否有錯誤語義,編譯器所能分析的語義為靜態語義,包括:宣告是否正確、型別是否匹配、型別的轉換是否符合要求。

d.源**優化

經過前面三個過程後,將源**轉換為中間**,(中間**是與目標機器和執行環境無關的),可以理解為將c中通過的語法樹通過一定的規則拍平,變為類假於目標**的結構,為什麼要引入中間語言呢,目標語言很多時候是硬體相關的,而中間語言與硬體無關。

e.生成目標**並進行相應優化

目標**的檔案組織格式為.o檔案,其內部的格式與具體裝置有很大關係,比如在android中,對arm7和x86cpu要編譯出不同的so檔案,此處同理,不同的硬體環境生成不同的目標**。目標**的優化也是針對不同情況有不同處理,在此不再展開,感興趣的同學可以參考編譯原理相關書籍。

(三)彙編

使用的gcc 命令是:gcc –c

對應於彙編命令是as

彙編的目的是把組合語言轉為機器語言,基本是一條轉一條,沒啥特殊的,每乙個彙編語句幾乎都對應一條機器指令。根據彙編指令和機器指令的對照表一一翻譯即可。

(四)鏈結

使用的gcc 命令是:gcc

對應於鏈結命令是ld

鏈結是要解決目標檔案之間的互相依賴關係,當a檔案中的aa方法中呼叫了b檔案的bb方法時,在彙編完成後,a檔案的bb方法並沒有準確的記憶體位址,鏈結後會轉換為虛擬位址,虛擬位址可以依據一定的規則轉換為實際位址,即可以執行時找到該方法。鏈結過程包括:位址和空間分配、符號決議和重定位。

函式庫分靜態鏈結庫(又稱靜態庫*.lib)和鏈結動態庫(又稱動態庫*.dll)。

靜態庫的鏈結在編譯時會被編譯進彙編檔案,這樣的操作會改變檔案大小;而動態庫則是在執行時(雙擊執行),當需要動態庫中的檔案時才被鏈結到可執行檔案的。

主要參考以下博文

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 語言編譯過程

2.編譯 優化過程 將.i檔案翻譯成會變得彙編 s檔案 在windows中,通常使用.asm便是彙編檔案 具體過程 詞法分析 語法分析 語義分析 中間 生成 優化 生成 將多個步驟組合成趟 編譯器構成工具 ps 這裡解釋一下 趟 的概念 這個 趟 指的是對源程式或者其等價的中間 語言程式進行從頭到尾...