1. 程式人生 > >編譯原理(一)

編譯原理(一)

說明:本文參考 李文生 老師講義!如有不當之處請及時聯絡

程式設計語言

人與計算機之間溝通的工具。

低階語言

  • 機器語言
  • 符號語言 組合語言

問題:符號語言是什麼?

高階語言

  • 過程性語言——面向使用者的語言 如:C、Pascal
  • 專用語言——面向問題的語言 如: SQL

優點:

  • 獨立於機器。所程式設計序移植性比較好
  • 不必考慮儲存單元的分配問題,資料的外部形勢轉換成機器的內部形勢等細節
  • 具有豐富的資料結構和控制結構
  • 更接近於自然語言
  • 程式設計效率高

翻譯程式

源程式(高階語言/組合語言編寫)———(經過)翻譯程式——>(得到)目標程式(目標語言表示,此處目標不一定是機器語言)

組合語言程式——彙編程式——機器語言程式

高階語言程式——編譯程式——低階語言程式

高階語言程式:編譯階段處理源程式,執行階段處理資料。

解釋程式同時處理源程式和資料。邊解釋邊執行,不生成目標程式。

解釋程式的優缺點

 優點:與使用者通訊方便,比較節省記憶體空間
 缺點:效率很低
 解決辦法:先翻譯成某種中間形式的程式,如JAVA

編譯程式的組成

  1. 分析階段(靜態分析)

    根據源語言的定義,分析源程式的結構和語義(程式原始碼轉換為某種內部表示)

    • 詞法分析——詞法分析器——識別具有獨立意義的字串作為token(記號),並組織成記號流
    • 語法分析——語法分析器——將記號流根據相應語言的語法規則分組,形成語法短語——分析樹來表示
    • 語義分析——語義分析器——根據源語言的語義規則對語句的意義進行檢查(如型別檢查)
  2. 綜合階段

    根據分析結果構造出所要求的目標程式

    • 中間程式碼生成——中間程式碼易於翻譯成目的碼
    • 程式碼優化——對程式碼進行改進,使之佔用的空間少、執行速度快(首先是在中間程式碼上進行)
    • 目的碼生成——生成的目的碼一般是可以重定位的機器程式碼或組合語言程式碼
  3. 符號表的管理

  4. 錯誤診斷和處理

編譯原理的典型結構
這裡寫圖片描述

符號表管理

記錄源程式中使用的識別符號;收集每個識別符號的各種屬性資訊是編譯程式的重要工作。

符號表:若干記錄組成的資料結構

  • 每個識別符號在表中有一條記錄
  • 記錄的域是識別符號的屬性

對符號表結構的要求:

  • 允許快速地查詢到識別符號的記錄
  • 可在其中存取資料

識別符號的各種屬性是在編譯的各個不同階段填入符號表的。

前處理器

主要功能:

  • 巨集處理
  • 檔案包含
  • 語言擴充

連線裝配程式

兩個主要任務:

  1. 裝入:

    • 讀入 可重定位的機器程式碼
    • 修改重定位地址
    • 把修改後的指令和資料放在記憶體的適當地方或形成可執行檔案
  2. 連線

    • 把幾個可重定位的機器程式碼連線成一個可執行的程式