編譯系統透視 圖解編譯原理pdf

2019年8月26日13:48:21 評論 23

編譯系統透視 圖解編譯原理 內容簡介

本書是編譯原理領域的鴻篇巨著,中文版尚未出版,英文版權已經輸出到美國,將在世界范圍內產生重要影響。從以下多個角度講,本書都具有重要的里程碑意義:

它讓編譯原理不再像是一門高深晦澀的“數學課”,而是一個可以調試、可以接觸、可以真切感受的理論體系。本書用1140余幅信息量巨大的運行時結構圖和視頻動畫取代了同類書中復雜枯燥的數學公式,更加立體和直觀,生動地將編譯后的執行程序在內存中的運行時結構圖展現了出來;

它將GCC源代碼、編譯原理、運行時結構、編譯系統原理(包含匯編與鏈接)的內在關系、邏輯與原理梳理清楚了,并將它們結合成一個整體。真正能夠讓讀者透徹掌握編譯器如何運行和如何設計,以及為什么要這么設計;

它是系統解讀著名商用編譯器GCC核心源代碼的著作,GCC源代碼一共有600萬行,為了便于講解和閱讀,本書進行了取舍和裁剪,講解了與編譯本質相關的最核心的60萬行代碼。

全書一共8章,具體內容和邏輯如下:

第1章以一個C程序(先簡單,后復雜)的運行時結構為依托,對程序編譯的整體過程做了宏觀講述,讓讀者對編譯有整體認識,這樣更容易理解后面的內容。

第2~6章通過實際的程序案例、結合GCC的源代碼,根據程序編譯的順序和流程,依次講解了詞法分析、語法分析、中間結構和目標代碼的生成,遵循了由易到難的原則,先是通過簡單程序講解清楚原理,然后再通過復雜程序強化理解。

第7章講解了與編譯器緊密關聯的匯編器和鏈接器,能讓讀者對可執行程序的最終生成有一個完整的了解。

第8章講解了預處理,就編譯器的執行順序而言,預處理器的執行比較靠前,之所以放在*后講,是因為它比較獨立,在讀者已經了解整個編譯過程中之后再講解,讀者會更容易理解。

編譯系統透視 圖解編譯原理 目錄

前言

第1章 運行時結構及編譯過程概述

1.1 一個簡單C程序的運行時結構

1.2 更為復雜C程序的運行時結構

1.3 編譯過程概述

第2章 詞法分析

2.1 詞法分析概要說明

2.2 詞法分析過程

2.3 狀態轉換圖

2.4 GCC實現詞法分析的源代碼

第3章 語法分析

3.1 語法分析綜述

3.2 語法分析思路

3.3 產生式

3.4 匹配產生式,消除左遞歸

3.5 提取左公因子,消除回溯

3.6 語法分析結果:語法樹

3.7 GCC關于語法分析的源代碼解析

第4章 語法樹到目標代碼

4.1 總述語法樹到中間代碼的轉化過程

4.2 目標代碼到運行時結構的映射

4.3 語法樹轉高端gimple

4.4 高端gimple到低端gimple

4.5 低端gimple到cfg

4.6 cfg轉ssa

4.7 生成RTL

4.8 RTL生成目標代碼(匯編)

第5章 語句拓展案例的編譯過程

5.1 總述各個語句拓展案例的編譯過程

5.2 if語句的語法分析

5.3 帶標號語句的語法分析

5.4 switch...case、goto、break語句的語法分析過程

5.5 do...while、while、for語句的語法分析過程

5.6 各種語句嵌套組合的語法分析過程

5.7 所有案例語法樹轉中間結構的過程

第6章 數據拓展案例的編譯過程

6.1 數據拓展案例的編譯過程總述

6.2 基礎類型數據的語法分析過程

6.3 復合類型數據的語法分析過程

6.4 指針類型數據的語法分析過程

6.5 關于作用域和生存期的語法分析過程

6.6 表達式的語法分析過程

6.7 所有案例語法樹轉中間結構(RTL)的過程

第7章 匯編與鏈接

7.1 匯編器

7.2 鏈接器

第8章 預處理

8.1 文件包含

8.2 宏定義

8.3 條件編譯

8.4 帶參數的宏定義

附錄 RTX定義

編譯系統透視 圖解編譯原理 精彩文摘

為了讓讀者能更直觀和更容易地理解本章的內容,我們針對本章內容精心制作了視頻內容,感興趣的讀者可以掃描二維碼觀看和學習。

解決編程過程中的實際問題,需要透徹了解程序在內存中的運行時結構,而透徹的程度自然成為衡量計算機語言學習水平的重要標準,也成為衡量軟件項目開發水平的重要標準。

C程序運行的核心是函數的執行和調用,它構成了整個C程序運行時結構的基礎框架。這一運行過程主要是在程序指令的驅動以及數據壓棧、清棧的支持下實現的。為了介紹這一過程,我們設計了一個簡單C程序,如下所示:

int fun(int a,int b);

int m=10;

int main()

{

inti=4;

int j=5;

m = fun(i,j);

return 0;

}

int fun(int a,int b)

{

int c=0;

c=a+b;

return c;

}

程序很簡單,卻凸現了函數調用和執行的最基本情況。我們把此情景展現在內存中,共有三個區域,分別是代碼區、靜態數據區和動態數據區。情景如圖1-1所示。

代碼區裝載了這個程序所對應的機器指令,main函數和fun函數的機器指令裝載位置如圖1-2所示。

全局變量m的數值裝載在靜態數據區中,情景如圖1-3所示。

程序開始執行前,動態數據區中沒有數據,情景如圖1-4所示。

圖1-2 main函數和fun函數在代碼區的位置

這是因為,只有程序開始執行后,在指令的驅動下,這一區域才會產生數據,壓棧和清棧的工作就是在這一區域完成的,情景如圖1-5所示。

圖1-3 全局變量m在靜態數據區的位置

圖1-4 動態數據區沒有數據

程序執行的本質就是代碼區的指令不斷執行,驅使動態數據區和靜態數據區產生數據變化。這一過程需要計算機的管控。下面我們著重介紹對代碼區和動態數據區的管控。CPU中有三個寄存器,分別是eip、ebp和esp,情景如圖1-6所示。

圖書網:編譯系統透視 圖解編譯原理pdf

  • 我的微信
  • 掃一掃加好友
  • weinxin
  • 微信公眾號
  • 掃一掃關注
  • weinxin

發表評論

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen: