預處理器,編譯器,匯編器,連接器


1.2程序被其它程序翻譯成不同的格式

  hello程序的生命周期是從一個源程序(hello.c)(稱為高級c語言)開始,被其它程序轉化為一系列的低級機器語言指令,這些指令按照一種稱為可執行目標程序的格式打包好,以二進制磁盤文件的形式保存。

  例:unix> gcc -o hello hello.c可以實現源文件向目標文件的轉化,該過程由編譯程序完成。

  hello.c  ---->hello.i  ---->hello.s  ---->hello.o  -->hello

(1).預處理(cpp):預處理器不止一種,而C/C++的預處理器就是其中最低端的一種——詞法預處理器,主要是進行文本替換、宏展開、刪除注釋這類簡單工作。

  • gcc -E 選項可以得到預處理后的結果,擴展名為.i;
  • C/C++預處理不做任何語法檢查,不僅是因為它不具備語法檢查功能,也因為預處理命令不屬於C/C++語句(這也是定義宏時不要加分號的原因),語法檢查是編譯器要做的事情;
  • 預處理之后,得到的僅僅是真正的源代碼;
  • GCC確實很強大,如果是用VC這種IDE,恐怕就不能看到預處理后的結果。

(2).編譯器(ccl):將文本文件.i翻譯成文本文件.s,得到匯編語言程序(把高級語言翻譯為機器語言),該種語言程序中的每條語句都以一種標准的文本格式確切的描述了一條低級機器語言指令。

  • gcc -S 選項可以得到編譯后的匯編代碼,擴展名為.s;
  • 匯編語言為不同高級語言的不同編譯器提供了通用的輸出語言,比如,C編譯器和Fortran編譯器產生的輸出文件用的都是一樣的匯編語言。

(3).匯編(as):將.s翻譯成機器語言指令,把這些指令打包成一種叫做可重定位目標程序的格式,並將結果保存在目標文件.o中(把匯編語言翻譯成機器語言的過程)。

  • gcc -c 選項可以得到匯編后的結果,擴展名為.o;
  • .o是一個二進制文件,它的字節編碼是機器語言指令而不是字符。如果在文本編輯器中打開.o文件,看到的將是一堆亂碼。
  • 把一個源程序翻譯成目標程序的工作過程分為五個階段:詞法分析;語法分析;語義檢查和中間代碼生成;代碼優化;目標代碼生成。主要是進行詞法分析和語法分析,又稱為源程序分析,分析過程中發現有語法錯誤,給出提示信息。

(4).鏈接(ld):gcc會到系統默認的搜索路徑”/usr/lib”下進行查找,也就是鏈接到libc.so.6庫函數中去。 函數庫一般分為靜態庫和動態庫兩種。靜態庫是指編譯鏈接時,把庫文件的代碼全部加入到可執行文件中,因此生成的文件比較大,但在運行時也就不再需要庫文件了。其后綴名一般為”.a”。動態庫與之相反,在編譯鏈接時並沒有把庫文件的代碼加入到可執行文件中,而是在程序執行時由運行時鏈接文件加載庫,這樣可以節省系統的開銷。動態庫一般后綴名為”.so”,如前面所述的libc.so.6就是動態庫。gcc在編譯時默認使用動態庫。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM