C语言的实现经过(C代码到CPU执行)
生活随笔
收集整理的這篇文章主要介紹了
C语言的实现经过(C代码到CPU执行)
小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
2018-01-05 創(chuàng)建人:Ruo_Xiao
2018-01-06 修改人:Ruo_Xiao
1、添加編輯器之后,預(yù)處理之前的編譯器的操作。
2、添加對(duì)優(yōu)化器的簡(jiǎn)單的說明。
2018-01-12 修改人:Ruo_Xiao
修正最后的邏輯總圖,添加“源代碼處理”。
2018-01-20 修改人:Ruo_Xiao
增加對(duì)編譯器和連接器更詳細(xì)的說明。
用C語言編寫的程序都存儲(chǔ)在文本文件中,該文件被稱為源代碼文件(Source Code Files),大多數(shù)系統(tǒng)都以“.c”為擴(kuò)展名。
拓展:點(diǎn)號(hào)“.”前面的部分被稱為基本名(Basename),點(diǎn)號(hào)后面的部分被稱為擴(kuò)展名(Extension),基本名和拓展名的組合被稱為文件名。 常用的C編輯器有:
(1)windows:記事本(notepad)。(需要修改擴(kuò)展名)
(2)Linux:Vi、Vim。
(3)Unix:emacs、jove、Vi、X Window System文本編輯器。 有的C編輯器具有自動(dòng)糾錯(cuò)功能,例如Vim。
預(yù)處理器是在真正的編譯開始之前由編譯器調(diào)用的獨(dú)立程序。 預(yù)處理器指令以#號(hào)開頭標(biāo)識(shí),末尾不包含分號(hào)。 主要功能有文件包含、宏替換、條件編譯等。 在編譯的預(yù)處理階段實(shí)現(xiàn)的功能:
(1)將頭文件加載到代碼中。
(2)對(duì)宏進(jìn)行替換。等等
再根據(jù)條件編譯指令,最終生成新的源代碼,傳給編譯器。
英文: C Compiler。 是將經(jīng)過預(yù)處理器處理之后的C代碼翻譯成對(duì)應(yīng)于各種CPU能夠執(zhí)行的可執(zhí)行代碼的程序。
拓展:可執(zhí)行代碼,用計(jì)算機(jī)的機(jī)器語言表示的代碼,這種語言是由數(shù)字碼表示的指令組成,即CPU的微指令。 編譯器檢查的是語法、函數(shù)與變量的聲明是否正確。 存儲(chǔ)編譯器生成的可執(zhí)行代碼的文件被稱為目標(biāo)文件(Object file)。
拓展:目標(biāo)文件
(1)擴(kuò)展名:
Unix/Linux:“.o”。
Windows:“.obj”。
(2)目標(biāo)文件雖然包含機(jī)器語言代碼,但是不能直接運(yùn)行,原因如下:
A、缺少啟動(dòng)代碼(Startup Code),啟動(dòng)代碼充當(dāng)著程序和操作系統(tǒng)的之間的接口。
B、缺少庫函數(shù)代碼,只是包含了庫函數(shù)的指令。 種類
(1)GNU編譯器集合(GCC,其中包含GCC C 編譯器),Linux和Unix下使用gcc即可調(diào)用GCC C 編譯器。
(2)GCC編譯器在windows上的運(yùn)行的軟件是Cygwin和MinGW。
(3)LLVM項(xiàng)目的Clang編譯器,通過clang調(diào)用,應(yīng)用于Linux和FreeBSD(默認(rèn))中。
(4)VC和VS。
(5)cc 是 Unix系統(tǒng)的 C Compiler,一個(gè)是古老的 C 編譯器。
對(duì)目標(biāo)代碼進(jìn)行進(jìn)一步處理,使其效率更高。 只針對(duì)Release,Debug不進(jìn)行處理。
將編譯器生成的目標(biāo)文件中的代碼、系統(tǒng)的標(biāo)準(zhǔn)啟動(dòng)代碼和庫代碼三者合并成一個(gè)文件,即可執(zhí)行文件。 主要是鏈接函數(shù)和全局變量。鏈接器會(huì)在所有的Object File中找尋函數(shù)的實(shí)現(xiàn),如果找不到,那到就會(huì)報(bào)鏈接錯(cuò)誤碼(Linker Error)。在VC下,這種錯(cuò)誤一般是:Link 2001錯(cuò)誤,意思說是說,鏈接器未能找到函數(shù)的實(shí)現(xiàn),你需要指定函數(shù)的ObjectFile。
windows:擴(kuò)展名為“.exe”。 Unix/Linux:擴(kuò)展名“.out”。
能讓CPU執(zhí)行的只要其特有的微指令集。 可執(zhí)行文件就是由微指令集中的指令構(gòu)成,故在windows下,雙擊exe就可以讓CPU開始按照C源代碼中所設(shè)想的那樣工作了。
一、概括
C源代碼 -> C編輯器 -> 源代碼處理 -> 預(yù)處理器 -> C編譯器 ->(優(yōu)化器) -> 連接器 -> 可執(zhí)行文件 -> CPU執(zhí)行
二、C源代碼
英文:Source Code。
三、C編輯器
拓展:點(diǎn)號(hào)“.”前面的部分被稱為基本名(Basename),點(diǎn)號(hào)后面的部分被稱為擴(kuò)展名(Extension),基本名和拓展名的組合被稱為文件名。
(1)windows:記事本(notepad)。(需要修改擴(kuò)展名)
(2)Linux:Vi、Vim。
(3)Unix:emacs、jove、Vi、X Window System文本編輯器。
四、源代碼處理
1、編譯器把源代碼中出現(xiàn)的字符映射到源字符集,該過程處理多字節(jié)字符和三字符序列。
2、編譯器定位每個(gè)反斜杠后面跟著換行符實(shí)例,并刪除它們。也就是說把下面兩個(gè)物理行(physical line):
轉(zhuǎn)化為一個(gè)邏輯行(logical line)。
printf("Hello,my wife!/n");3、編譯器將文本劃分成預(yù)處理記號(hào)序列、空白序列和注釋序列(記號(hào)是由空格、制表符或換行符分隔的項(xiàng))。這里,編譯器將空白字符序列和注釋序列用一個(gè)空格替換。所以下面代碼
int/*我是注釋!*/i = 0;變成了
int i = 0;五、預(yù)處理器
(1)將頭文件加載到代碼中。
(2)對(duì)宏進(jìn)行替換。等等
再根據(jù)條件編譯指令,最終生成新的源代碼,傳給編譯器。
六、C編譯器
拓展:可執(zhí)行代碼,用計(jì)算機(jī)的機(jī)器語言表示的代碼,這種語言是由數(shù)字碼表示的指令組成,即CPU的微指令。
拓展:目標(biāo)文件
(1)擴(kuò)展名:
Unix/Linux:“.o”。
Windows:“.obj”。
(2)目標(biāo)文件雖然包含機(jī)器語言代碼,但是不能直接運(yùn)行,原因如下:
A、缺少啟動(dòng)代碼(Startup Code),啟動(dòng)代碼充當(dāng)著程序和操作系統(tǒng)的之間的接口。
B、缺少庫函數(shù)代碼,只是包含了庫函數(shù)的指令。
(1)GNU編譯器集合(GCC,其中包含GCC C 編譯器),Linux和Unix下使用gcc即可調(diào)用GCC C 編譯器。
(2)GCC編譯器在windows上的運(yùn)行的軟件是Cygwin和MinGW。
(3)LLVM項(xiàng)目的Clang編譯器,通過clang調(diào)用,應(yīng)用于Linux和FreeBSD(默認(rèn))中。
(4)VC和VS。
(5)cc 是 Unix系統(tǒng)的 C Compiler,一個(gè)是古老的 C 編譯器。
七、優(yōu)化器
八、連接器
九、可執(zhí)行文件
十、CPU執(zhí)行
十一、流程圖
總結(jié)
以上是生活随笔為你收集整理的C语言的实现经过(C代码到CPU执行)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: const int、const int
- 下一篇: C/Cpp / #include