編譯器:閱讀以某一種語言(源語言)編寫的程式,並把該程式翻譯成為乙個等價的、用另一種語言(目標語言)編寫的程式。
直譯器:並不通過翻譯的方式生成目標程式,直接利用使用者提供的輸入執行源程式中指定的操作。
編譯器直譯器
執行速度更快
錯誤診斷效果更好
建立可執行的目標執行還需要的其他程式,比如
預處理器:把分割為多個模組的源程式聚合在一起。
彙編器:生成可重定位的機器**。
載入器:把所有的可執行目標檔案放到記憶體中執行。
詞法分析
詞法分析器讀取組成源程式的字元流,並且將它們組織成為有意義的詞素的序列。
對於每個詞素,詞法分析器產生如下形式的詞法單元(token)作為輸出。
(token-name, attribute-value)
比如:
position = initial + rate * 60
- position是乙個詞素,被對映成(id,1),其中id表示識別符號的抽象符號,而1指向符號表中position對應的條目。
- =是乙個詞素,被對映成(=),因為不需要屬性值,所以忽略第二個分量。
- initial是乙個詞素,被對映成(id,2)
- +是乙個詞素,被對映成(+)
- rate是乙個詞素,被對映成(id,3)
- 是乙個詞素,被對映成()
- 60是乙個詞素,被對映成(60)
(id, 1)(=)(id,2)(+)(id,3)(*)(60)
符號表符號表資料結構為每個變數名字建立了乙個記錄條目。記錄的字段就是名字的各個屬性,包括儲存分配、型別、作用域等,過程名字包括引數數量和型別、傳遞方法(傳值或傳引用)、返回型別等。
1position…2
initial…3
rate…
語法分析
語法分析器使用由詞法分析器生成的各個詞法單元的第乙個分量來建立樹形的中間表示。乙個常用的表示方法是語法樹,樹中的每個內部節點表示乙個運算,而該節點的子節點表示該運算的分量。
語義分析
使用語法書和符號表中的資訊來檢查源程式是否和語言定義的語義一直。它同時也收集型別資訊,並把這些資訊存放在語法樹或符號表中,以便在隨後的中間**生成過程中使用。
語義分析的乙個重要部分是型別檢查。
中間**生成
在把乙個源程式翻譯成目標**的過程中,乙個編譯器可能構造出乙個或多個中間表示。這些中間表示可以有多種形式。語法樹是一種中間表示形式。
**優化
機器無關的**優化步驟試圖改進中間**,以便生成更好的目標**。
**生成
**生成器以源程式的中間表示形式作為輸入,並把它對映到目標語言。
編譯器初識
組合語言對應cpu指令集 二進位制機械碼 相容性不好,不能跨平台,arm的彙編和x86彙編差別很大 處理器指令集 多核cpu和多cpu 彙編中沒有執行緒概念,程序是作業系統為了實現併發組織的集合結構 編譯目標 x86 gcc arm arm linux gcc編譯 等處理器架構 彙編直譯的 可以可以...
初識goto cc編譯器
what?對c和c 原始檔的編譯器,產生程式的控制流圖。goto cc屬於靜態分析器,並不能檢測出檔案的錯 誤,但是它產生的控制流圖可以繼續地被用來動態分析,後續的工作可以交給cbmc或satabs來處理。how?方法一 配置cl環境 命令列目錄.microsoft visual studio 9....
編譯方舟編譯器
環境 mac os parallels desktop 安裝ubuntu 16.04 安裝基礎包 sudo apt get y install openjdk 8 jdk git core gnupg flex bison gperf build essential zip curl zlib1g ...