編譯原理-0-編譯過程概述

     一直以來,都想好好學習學習編譯原理。但是一直各種理由沒有靜下心來好好看看。現在就用博客的形式,記錄自己學習編譯原理的點點滴滴。如有錯誤之處,還請指出。

    習慣糗事百科的分割,咱就先來一個華麗麗的分隔符

    ===============================分隔符=============================================

      對於我們常用的語言,C/C++,Java,C#等源程序是給我們IT狗自己看的,其實就是文本文件,可以使用vi,記事本等文本編輯程序打開、編輯。但是對於計算機來說,目前智能水平還不夠(google阿法狗也就只能和人類下下圍棋),無法理解我們IT狗所能看懂的源程序,怎麼辦呢?那就需要一個專門的程序來翻譯我們IT狗能看懂的源程序,讓計算機也能理解的語言。這個程序就是編譯器,它對源程序的翻譯過程,就是編譯過程。

    一個編譯器的大致步驟如下:

     

    例如:

int max(int a,int b)
{
     int c = a>b?a:b;
}
int main()
{
      int  c=max(2,3);
      return 0;
}



     對於上述源代碼,我們IT狗是很容易理解,以文本形式保存後,上述源代碼在計算中存儲的形式爲:

       69 64 74 20 66 7A 6B 74 30 ……

    就是一連串的16進制的數字而已,也就是字符流。對於字符流,看不出關鍵字、運算符、標識符。那編譯器第一步要做的工作就是詞法分析,目的就是在連續的字符中識別出一個一個的符號,儘可能識別出符號的屬性。例如: 

       69 64 74 => int  (數字隨便寫的,只是演示作用)

      20 66 7a => max

     ……

      詞法分析階段,能夠根據輸入的字符流能夠識別出符號的含義,它們所包含的關鍵字、數字、字符串、分隔符、數字等。

     詞法分析階段以後,就是把對應的輸出作爲語法分析。語法分析的作用就是把從詞法分析識別出的符號流中識別出符合編程語言語法的語句。語法分析的結果以樹型結構保存,稱之爲語法樹。語法樹承載了源程序的全部信息,後續的轉換工作就與源程序無關了。

    在當前,我們有很多不同的硬件平臺,intel、ARM、PowerPC,以及32位和64位等等,爲了能夠把我們的程序更好的在不同硬件平臺上運行,編譯器把語法樹先轉換爲一個通用的,抽象的“CPU指令”,這就是中間代碼最初的設計思路,然後根據具體選定的CPU,將中間代碼落實到具體CPU的目標代碼。

     選定具體CPU,操作系統後,中間代碼就轉換爲目標代碼--彙編代碼。然後彙編器依照選定操作系統的目標文件格式,將彙編文件轉換爲具體的目標文件。對於linux而言是.o文件,window系統是.obj文件。目標文件已經是選定CPU的機器指令了。

     最後一步就是鏈接器把一個或多個目標文件鏈接成符合操作系統指定格式的可執行文件。通過操作系統,可執行程序就可以被載入內存執行了。



這就是編譯器所做的工作。編譯器其實也就是一個軟件。

    

       

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章