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