【第一章】編譯原理基礎

編譯器的結構

主要分爲2個部分:分析(analysis)部分和綜合(synthesis)部分前端

  • 分析部分:源程序分解爲多個組成要素,並再要素上加上語法結構,建立一箇中間表示,相關信息存入符號表。
  • 綜合部分:根據中間表示和符號表構造目標程序。java

    1.詞法分析

    詞法分析器讀入字節流,將他們組成有意義的詞素(lexeme)序列,以詞法單元(token)的形式輸出:後端

    <token-name,attribute-value>數組

例子:緩存

position = initial + rate * 60markdown

詞法分析後爲一個詞法單元序列編輯器

<id,1><=><id,2><+><id,3><*><60>函數

2.語法分析

語法分線器使用詞法分析器生成的各個詞法單元 建立樹形的中間表示,累似一顆二叉樹表的中間表示。工具

3.語義分析

使用語法樹和符號表中的信息檢查源程序是否和語言定義的語義一致。性能

  • 類型檢查 (如數組下表必須爲整數)
  • 類型和運算合法性檢查
  • 自動類型轉換 (如一個float*int)

4.中間代碼生成

完成語法分析和語義分析,編譯器生成一個類機器語言的中間表示。

意義:易於生成,容易被翻譯成目標機器上的語言

常見的有 三地址代碼(three-address code的中間表示。這種中間表示累死彙編語言的指令,每一個指令有三個運算份量,每一個運算份量像一個寄存器。

5.代碼優化

機器無關的代碼優化,能夠改進中間代碼,以便生成更好的目標代碼(更短更快)

//三地址代碼序列
    t1 = inttofloat(60)
    t2 = id3 * t1
    t3 = id2 + t2
    id1 = t3

//優化後
    t1= id3 * 60.0
    id1 = id2 + t1

6.代碼生成

以源程序的中間表示做爲輸入,映射到目標語言(機器代碼)。需要爲程序中的變量選擇寄存器或內存位置。合理分配寄存器以存放變量的值相當重要。

如使用寄存器R1和R2,完成中間代碼翻譯的機器代碼:

LDF R2, id3
    MULF R2, R2, #60.0
    LDF R1, id2
    ADDF R1, R1, R2
    STF id1, R1

7.符號表管理

符號表爲每個變量名字建立了一個記錄條目,包括類型,做用域。對於過程名字,包括參數數量和類型,參數的傳遞方式,反回類型。

8.將多個步驟組合趟

在特定的實現中,多個步驟的活動被組合成一趟(pass)。每趟讀入一個輸入文件併產生一個輸出文件。詞法語法,語義分析組成一個pass,代碼優化做爲一個可選的pass,爲特定目標機生成代碼爲一個pass。

經過把前端和不一樣的目標機後端結合,創建針對不一樣目標機的編譯器。

9.編譯器結構工具

實現一個完整的軟件開發環境,包含語言編輯器,調試器,版本控制,程序秒暑期,測試管理等工具。

程序設計語言的發展

  • 第一代:機器語言
  • 第二代:彙編語言
  • 第三代:Fortran、C、C++、Java高級程序設計語言
  • 第四代:爲特定應用設計的語言,如SQL,markdown

名詞解釋

  • 強制式語言:指名如何完成一個計算任務的語言(c,java)
  • 聲明式語言:指名要進行哪些計算的語言(ML,Haskell等函數式語言)

針對計算機體系結構的優化

幾乎全部的高性能計算系統都用到了兩種技術:並行(Parallelism)內存層次結構(memory hierarchy)

並行性

  • 現代微處理器都採用了指令集並行。
  • 在指令集層次,多個運算能夠被同時執行。
  • 處理器層次,同一個應用的多個不一樣線程再不一樣的處理器上運行。

內存層次結構

  • 幾百字節的寄存器
  • 幾K到幾M的高速緩存
  • 幾M到幾G的物體寄存器
  • 幾G的外部寄存器
相關文章
相關標籤/搜索