文章目錄
-
-
- 編譯器結構
- 編譯器和解釋器的差別
- 編譯器研究熱點
- 圖檔筆記
- 即時編譯(JIT)
- 習題
-
編譯器結構

預 處 理 器 : \color{#0AAD1A}{預處理器:} 預處理器:一個源程式可能被分成多個子產品并存放于不同的檔案中,一個叫預處理器(preprocessor)的程式可以把源程式聚合在一起,預處理器還負責把那些稱為宏的所寫形式轉換為源語言的語句。然後,将經過預處理的源程式作為輸人傳遞給一個編譯器。
彙 編 器 : \color{#0AAD1A}{彙編器:} 彙編器:編譯器可能産生一個彙編語言程式作為其輸出,因為彙編語言比較容易輸出和調試。接着,這個彙編語言程式由稱為彙編器(assembler)的程式進行處理,并生成可重定位的機器代碼。(可重定位是指變量等在記憶體中的位置是不固定的,後面的加載器修改這些位址)
鍊 接 器 / 加 載 器 : \color{#0AAD1A}{連結器/加載器:} 連結器/加載器:可重定位的機器代碼經常和其他可重定位的目标檔案以及庫檔案連接配接到一起,形成真正在機器上運作的代碼。一個檔案中的代碼可能指向另一個檔案中的位置,而連結器(linker)能夠解決外部記憶體位址的問題。(外部記憶體位址是指: 一個檔案可能會引用另一個檔案的資料對象或過程,這對于這個檔案來說,是外部記憶體位址)最後加載器( loader)把所有的可執行目标檔案放到記憶體中執行。
一個三位址指令唯一确定了一個運算完成的順序
除了z=x op y這種指令外,其他指令基本上隻有一個操作符,即隻能完成一個動作。
編譯器和解釋器的差別
解釋器是一條一條的解釋執行源語言。編譯器是把源代碼整個編譯成目标代碼,執行時不在需要編譯器,直接在支援目标代碼的平台上運作,是以,在把使用者輸入映射成為輸出的過程中,由一個編譯器産生的機器語言目标程式通常比一個解釋器快很多。然而,解釋器的錯誤診斷效果通常比編譯器更好,因為它逐個語句地執行源程式。
解釋器是動态翻譯,編譯器是靜态翻譯
解釋器沒有代碼優化的環節
更多差別(解釋器:詞法分析–>文法分析–>語義分析–>執行)
編譯器研究熱點
并行編譯:
并行化編譯面臨的任務是:給定一個在單處理機上運作較長的串行程式和一台具有多個處理器可同時工作的并行計算機,目的是将串行程式分解成若幹個能并行執行或至少能重疊執行的代碼段,使其在并行機上能較快地運作。是以并行編譯器主要工作就是尋找代碼的并行性,然後将其排程在并行機上高速正确地執行。(參考:并行編譯器)
中間代碼:
在編譯器的分析-綜合模型中,前端對源程式進行分析并産生中間表示,後端在此基礎上生成目标代碼。理想情況下,和源語言相關的細節在前端分析中處理,而關于目标機器的細節則在後端處理。和中間代碼相關的内容包括中間代碼表示、靜态類型檢查和中間代碼生成(參考:中間代碼)
代碼優化
所謂代碼優化是指對程式代碼進行等價(指不改變程式的運作結果)變換。程式代碼可以是中間代碼(如四元式代碼),也可以是目标代碼。等價的含義是使得變換後的代碼運作結果與變換前代碼運作結果相同。優化的含義是最終生成的目标代碼短(運作時間更短、占用空間更小),時空效率優化。原則上,優化可以在編譯的各個階段進行,但最主要的一類是對中間代碼進行優化,這類優化不依賴于具體的計算機。(參考:代碼優化)
圖檔筆記
參考:哈工大編譯原理(慕課)
設定字元串表是因為符号表裡NAME字段有大小限制,辨別符的屬性資訊有可能會超過這個限制,是以要建立字元串表
即時編譯(JIT)
JIT是一種提高程式運作效率的方法。
具體提高方法看下面的圖和超連結
比如java的位元組碼(class檔案裡面),當位元組碼被加載到虛拟機之後,它會被解釋器運作一段時間,當發現某些情況,比如有些代碼被頻繁執行,這時就會将這些代碼轉換成機械碼,提高運作效率(本地的機械碼執行效率更高)
(圖檔參考下面的連結)
即時編譯
習題
通常一個編譯程式中,不僅包含詞法分析,文法分析,中間代碼生成,代碼優化,目标代碼生成等五個部分,還應包括(C)。
A.模拟執行器
B.解釋器
C.表格處理和出錯處理
D.符号執行器
将編譯程式分成若幹個“遍”是為了(B) 。
A.提高程式的執行效率
B.使程式的結構更加清晰
C.利用有限的機器記憶體并提高機器的執行效率
D.利用有限的機器記憶體但降低了機器的執行效率
(參考:https://www.nowcoder.com/questionTerminal/f2b1c628ef514f80b486bf1da4595ba9?toCommentId=715634)