1. 程式人生 > >編譯原理:引言

編譯原理:引言

編譯器的概述

  • 編譯器是一個程式
  • 核心功能是把原始碼翻譯成目的碼
  • 原始碼:
    • C/C++, Java, C#, html, …
  • 目的碼:
    • x86, IA64, ARM, MIPS, …

編譯器的結構

編譯器具有非常模組化的高層結構,編譯器可看成多個階段構成的“流水線”結構。

在這裡插入圖片描述

每個階段將源程式從一種表示轉換成另一種表示:

  • 詞法分析器:字元流->單詞流
  • 語法分析器:單詞流->語法樹
  • 語義分析器:
    • 收集識別符號的屬性資訊:
      • 型別(Type)
      • 種屬(Kind)
      • 儲存位置、長度
      • 作用域
      • 引數和返回值資訊
    • 語義檢查:
      • 變數或過程未經宣告就使用
      • 變數或過程名重複宣告
      • 運算分量型別不匹配
      • 操作符與運算元之間的型別不匹配
  • 中間程式碼生成器:抽象語法樹->中間表示(與平臺無關的抽象程式):
    1. 易於產生
    2. 易於翻譯成目標程式
    3. 三地址碼:temp1=c*d;temp2=b+temp1;a=temp2
    4. 四元式
      :(op, arg1, arg2, result);(* , c , d , temp1);(+ , b, temp1 , temp2);(= , temp2 , - , a)
  • 程式碼優化器:試圖改進中間程式碼,以產生執行速度較快的機器程式碼:
    • temp1=c*d;temp2=b+temp1;a=temp2
    • change to:temp1=c*d;a=b+temp1
  • 程式碼生成器:生成可重定位的機器程式碼或彙編程式碼:
    • temp1=c*d;a=b+temp1
    • change to:Mov R2,c;Mul R2, d;Mov R1, b;Add R2, R1;Mov a, R2
    • 一個重要任務是為程式中使用的變數合理分配暫存器
  • 符號管理表:
    • 基本功能是記錄源程式中使用的識別符號,
    • 並收集與每個識別符號相關的各種屬性資訊,
    • 並將它們記載到符號表中。
  • 錯誤處理器:
    • 處理方式:報告錯誤,應繼續編譯
    • 大部分錯誤在語法分析、語義分析階段檢測出來
    • 詞法分析:字元無法構成合法單詞
    • 語法分析:單詞流違反語法結構規則
    • 語義分析:語法結構正確,但無實際意義

編譯技術的應用

  • 高階程式設計語言的實現
  • 針對計算機體系結構的優化(並行性與記憶體層次結構)
  • 新計算機體系結構的設計(CISC -> RISC)
  • 程式翻譯
  • 軟體生產率工具(查錯)