編譯原理第一章學習筆記

第1章 編譯程序的基本概念

1.1什麼是編譯程序

java中反編譯命令:javap前端

彙編語言本質上是一種助記符java

編譯程序和解釋程序兩大不一樣:git

  • 編譯程序有目標程序而解釋程序沒有
    • 好比在C語言中,.exe就是目標程序
  • 前者效率高然後者交互性好

1.2 編譯程序的邏輯結構

編譯程序分爲五個階段github

  • 詞法分析
    • 結果是一個token序列
  • 語義分析
    • 結果是一個語義樹
  • 語法分析
    • 結果是一個語法樹/中間代碼
    • 中間代碼形式與源語言和目標語言沒有關係
  • ——————————————————以此爲界,上面是前端,下面是後端express

  • 優化處理
  • 目標代碼生成後端

在編譯過程當中,編譯程序不斷地和符號表管理程序和錯誤處理程序打交道函數

1554533997370

1.3編譯程序的實現機制

遍:編譯程序對源程序或等價程序掃描的遍數優化

在整個編譯過程當中,看似掃描了五遍,其實只有兩遍,分別是對前端和後端進行的掃描指針

即第一遍:詞法分析、語法分析、語義分析。code

第二遍:代碼優化和中間代碼生成

每遍中的各階段的工做是穿插進行的,例以下圖:

T9B01CF129~C4$Z6NANH3~W

其中,語法分析器處於核心地位,每當語法分析器須要一個完整的語法單位時,便向詞法分析器請求一個Token。當接收到所須要的token以後,便調用語義分析器生成中間代碼。

1.4 編譯程序的生成方法

涉及三個語言:源語言、目標語言 和 編譯程序的實現語言

編譯程序的生成方法:

  • 用:利用已有的編譯器
  • 寫:本身動手寫一個
  • 半用半寫:重寫現有編譯器的後端

自動生成編譯程序:

  • 詞法分析程序生成器LEX
  • 語法分析程序生成器YACC
  • 編譯程序生成器

輸入:詞法規則、語法規則和語義解釋

1.5 編譯過程實例分析

對以下C語言程序進行編譯:

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

1.詞法分析:識別單詞並分類

UZMHL)%268U%8@FYZNY(S`G

詞法分析的結果是以token的形式傳給語法分析

2.語法分析:組詞成句並進行語法錯誤檢查

生成結果是一棵語法樹

分支語句由變量和表達式組成:

  • 變量
  • 賦值語句(expression)
    • 賦值語句能夠分紅項(item)/項之間的加減
    • 項能夠分紅因式(factor)/因式的乘除
    • 因式則能夠是具體的常數/變量

W_{VJL1T5_Y@(9PK8M5I(ZG

3.語義分析:分析各類語法成分

語義分析須要構建兩個東西——標識符的語義辭典(符號表)&語句的語義樹(中間語言)

符號表分爲:

  • 名字
  • 類型,好比整型int
  • 種類,好比變量,常量,函數的名字等等,這裏是值value
  • 地址,是一個指針

圖片

接下來是語義樹,和語法樹很相似,可是是徹底不一樣的,前者是描述語義信息,然後者描述的確實構成。

圖片

固然了,還能夠採用四元式的形式:

  • 第一位是運算的符號
  • 第二位是參與運算的第一個元素
  • 第三位是參與運算的第二個元素
    • 若是是單元運算,這一位能夠用下劃線代替
  • 第四位是存放運算結果的位置

圖片

4.優化:提升目標程序質量

爲了提升運算速度,這裏能夠進行的優化是將2*5直接運算出來,不須要特地爲它生成一條中間代碼。

下圖是對b=a+2*5優化以後的結果:

圖片

5.目標代碼生成

這裏採用彙編指令做爲目標代碼,對步驟四中的中間代碼對應生成三條彙編指令:

LD R,10 ;將10加載到寄存器中
ADD R,a ;將a與寄存器相加
ST R,b  ;將寄存器中的值存儲(store)到b中
相關文章
相關標籤/搜索