天天看點

1、編譯原理概述

編譯程式(系統)和作業系統一起建構成立計算機中兩大系統軟體;一個是計算機資源的操縱者;另一個是計算機軟體資源的開拓者。

1、我們為什麼需要編譯程式?

1、編譯原理概述
  • 了解它是怎麼将我們編寫的源代碼轉換成可執行程式;
  • 為什麼它要這麼設計;
  • 為了提升自己 (如 了解底層機制,才能有更深入思考問題,以及深層次解決問題的能力,而不是隻能盲目地搜尋答案,從表面解決問題。而學習編譯原理能讓我們從前端的文法次元、代碼優化的次元、與硬體結合的次元幾個方面,加深對計算機技術的了解,提升自己的競争力)。

2、什麼是編譯程式?

什麼是程式:按照我們編寫的邏輯去執行相應的動作;

編譯程式(compiler):是一種翻譯程式,它特指把某種進階程式設計語言翻譯成與之等價的具體計算機上的低級程式設計語言。

編譯程式的執行過程包括兩個階段:編譯階段、運作階段。
1、編譯原理概述

就好比我們寫的java源程式,首先通過javac編譯成.class位元組碼檔案,之後再通過解釋器java運作此位元組碼檔案。

3、什麼是解釋程式?

解釋程式(interpreter):也是一種翻譯程式,它将源語言書寫的源程式作為輸入,解釋一句後就送出計算機執行一句,并不形成目标程式。

1、編譯原理概述

兩者的差別:

  • 編譯程式有目标程式;
  • 解釋程式無目标程式;
  • 編譯程式運作效率高;(我們直接運作目标程式就可以了,不需要完成翻譯的過程)
  • 解釋程式便于人機對話;(不斷擷取外界資料,不斷的執行)

4、編譯程式的邏輯結構的6個階段;

1、編譯原理概述

詞法分析:識别出有意義的單詞(保留字,辨別符,常量,運算符,分隔符),傳回單詞的類别和單詞的值,單詞是組成語言程式的最小機關;

文法分析:在詞法分析的基礎上将單詞序列分解成各類文法短語(如 程式、語句、表達式等)。這種文法短語也稱為文法機關,可表示成文法樹。

語義分析:審查源碼程式有無語義錯誤,為代碼生成階段收集類型資訊;(完整性,一緻性)

中間代碼生成:将源程式變成一種内部表示形式,這種内部表示形式叫做中間語言或中間代碼;

代碼優化:對前一階段産生的中間代碼進行變換或進行改造,目的使生成的目标代碼更為高效,即省時間和空間;(優化作用,比如 文法合并之類的 java中的三元表達式可以節省if)

目标代碼生成:這一階段的任務是把中間代碼變成特定機器上絕對指令代碼或可重定位的指令代碼或彙編指令代碼;

前端(詞法、文法、語義):将源語言翻譯成一個中間代碼的形式;

後端(中間代碼生成,中間代碼優化,目标代碼生成):将中間代碼的形式翻譯成目智語言的形式。

5、編譯程式與外文翻譯的類别

I wish you success!
           

詞法分析 :識别單詞,确認詞類;

文法分析:識别 短語和句型的文法屬性;

語義分析:确認單詞、短語和句型的語義特征;

中間代碼生成和代碼優化:修辭、文本編輯;

目标代碼生成:生成譯文;

6、遍

編譯程式對源程式或等價程式從頭到尾掃描的次數。

我通常将整個編譯過程分為兩遍:

  • 第一遍:詞法分析、文法分析、語義分析;
  • 第二遍:中間代碼生成、代碼優化、目标代碼輸出;

如:使文法分析器處于核心的位置。當文法分析需要下一個單詞時,就調用詞法分析器,識别一個單詞一旦識别出一個文法機關,就調用語義分析器,完成語義分析并産生中間代碼。

1、編譯原理概述

7、編譯過程的分析

如下c語言片段代碼

int a,b;
...
b=a+2*5;
           

1、詞法分析,識别源程式中的單詞并分類;

(1) 關鍵字(keywords)   -- int
(2) 辨別符(identifier) -- a,b
(3) 常數(constant)     -- 2,5
(4) 界符(p 這裡有逗号、分号、指派符号、加号、乘号) -- , ; = + *        
           

2、文法分析:組詞成句及文法錯誤檢查;

b=a+2*5 的分析過程生成的結果是一棵文法樹!
           
1、編譯原理概述

構造句子成功後進行語義分析;

3、語義分析:分析各種文法成分的語義特征;

  • 建構辨別符的語義辭典 -- 符号表
    1、編譯原理概述
  • 建構語句的語義樹 -- 中間語言
    如  b = a + 2 * 5
               
    語義樹形式:
    1、編譯原理概述
    四元式形式(中間代碼生成):文法格式:(運算符,運算對象1,運算對象2,結果)
    (1) ( *  2  5  t1 )  //第一條将2*5結果賦給t1
    (2) ( +  a  t1 t2 )  //第二條将a+t1結果賦給t2  
    (3) ( = t2  _   b )   //第三條将t2的結果賦給b
               

4、代碼優化:提高目标程式的品質;

如  b = a + 2 * 5
           

經常數合并,可分别獲得優化後的中間代碼;

優化前
1、編譯原理概述

中間代碼:

(1) ( *  2  5  t1 )
(2) ( +  a  t1 t2 )
(3) ( = t2  _   b )
           
優化後
1、編譯原理概述
(1) ( +  a  10 t2 )
(2) ( = t2  _   b )
           

5、目标代碼生成;

  • 最終,可生成目标代碼(彙編指令);
    (1) ( +  a  10 t2 )
    (2) ( = t2  _   b )
               
    ① LD R,10   //将10這個常量加載到R當中,R為寄存器(指令有取、加、存), LD指取或加載的意思
    ② ADD R,a   //将a的值加到寄存器當中所存儲的變量的值上面去,結果存在寄存器R當中
    ③ ST R,b    //将寄存器當中的值存到b所指定的記憶體當中
               

繼續閱讀