客服公告:2026年春節期間各項服務說明。詳情

新到貨新春促案
LLVM編譯器實戰教程
(0)

LLVM編譯器實戰教程

  • 定價:474
  • 優惠價:87412
  • 運送方式:
  • 臺灣與離島
  • 海外
  • 可配送點:台灣、蘭嶼、綠島、澎湖、金門、馬祖
  • 可配送點:台灣、蘭嶼、綠島、澎湖、金門、馬祖
載入中...
  • 分享
 

內容簡介

LLVM是一個世界領先水準的編譯器框架。它包含有豐富軟體庫,可以為編譯器的初學者提供良好的學習體驗,並大大降低編譯器開發的學習門檻。

本書的前半部分將向您介紹怎麼樣去配置、構建、和安裝LLVM的不同軟體庫、工具和外部項目。接下來,本書的後半部分將向您介紹LLVM的各種設計細節,並逐步地講解LLVM的各個編譯步驟:前段、中間表示(IR)、後端、即時編譯(JIT)引擎、跨平臺編譯和外掛程式介面。本書包含有大量翔實的示例和代碼片段,以幫助讀者平穩順利的掌握LLVM的編譯器開發環境。
 
 

作者介紹

布魯諾·卡多索·洛佩斯(Bruno Cardoso Lopes)

在巴西坎皮納斯大學獲得計算機科學博士學位。自2007年以來,他一直是LLVM的貢獻者,從頭開始實現MIPS後端,並且已經維護了幾年。另外,他還編寫了x86 AVX支持方案,並改進了ARM彙編器。他的研究興趣包括代碼壓縮技術和對ISA進行位寬壓縮。之前他還開發了Linux和FreeBSD作業系統的驅動程式。 拉斐爾·奧勒(Rafael Auler)是巴西坎皮納斯大學的博士生,並擁有該大學計算機科學碩士學位和計算機工程學士學位。在作為碩士生期間,他編寫了一個可以根據體系結構描述檔自動生成LLVM後端的概念驗證工具。目前,他的博士研究課題包括動態二進位翻譯、即時編譯器和計算機體系結構。 Rafael還是微軟研究院2013年研究生研究獎學金獲得者。
 
 

目錄

出版者的話
譯者序
前言
關於作者
關於審稿人

第1章 構建和安裝LLVM 1
1.1 瞭解LLVM版本 1
1.2 獲取預構建包 2
1.2.1 獲取官方預構建二進位檔案 2
1.2.2 使用套裝軟體管理器 3
1.3 從原始程式碼構建 4
1.3.1 系統要求 4
1.3.2 獲取原始程式碼 4
1.3.3 構建和安裝LLVM 5
1.3.4 Windows和Microsoft Visual Studio 10
1.3.5 Mac OS X和Xcode 12
1.4 總結 14

第2章 外部專案 15
2.1 Clang外部項目介紹 15
2.1.1 構建和安裝Clang外部工具 16
2.1.2 理解Compiler-RT 17
2.1.3 實驗Compiler-RT 17
2.2 使用DragonEgg外掛程式 18
2.2.1 構建DragonEgg 19
2.2.2 使用DragonEgg和LLVM工具瞭解編譯流程 19
2.2.3 理解LLVM測試套件 20
2.2.4 使用LLDB 21
2.2.5 libc++標準庫介紹 23
2.3 總結 25

第3章 工具和設計 26
3.1 LLVM的基本設計原理及其歷史 26
3.2 理解目前的LLVM 27
3.3 與編譯器驅動程式交互 29
3.4 使用獨立工具 30
3.5 深入LLVM內部設計 33
3.5.1 瞭解LLVM的基本庫 33
3.5.2 介紹LLVM的C++慣例 34
3.5.3 演示可插拔的流程介面 37
3.6 編寫你的第一個LLVM項目 38
3.6.1 編寫Makefile 38
3.6.2 編寫代碼 40
3.7 關於LLVM原始程式碼的一般建議 41
3.7.1 將代碼理解為文檔 42
3.7.2 請求社區的幫助 42
3.7.3 應對最新:使用SVN日誌作為文檔 42
3.7.4 結束語 44
3.8 總結 44

第4章 前端 45
4.1 Clang簡介 45
4.1.1 前端操作 46
4.1.2 庫 47
4.1.3 理解Clang診斷 49
4.2 Clang前端階段介紹 52
4.2.1 詞法分析 52
4.2.2 語法分析 58
4.2.3 語義分析 63
4.2.4 生成LLVM IR代碼 65
4.3 完整的例子 65
4.4 總結 68

第5章 LLVM中間表示 69
5.1 概述 69
5.2 操作IR格式的基本工具示例 71
5.3 LLVM IR語法介紹 71
5.4 編寫自訂的LLVM IR生成器 76
5.4.1 構建和運行IR生成器 79
5.4.2 使用C++後端編寫代碼來生成IR構造 80
5.5 在IR層執行優化 80
5.5.1 編譯時優化和連結時優化 80
5.5.2 發現最佳編譯器流程 82
5.5.3 流程間的依賴關係 83
5.5.4 瞭解流程API 85
5.5.5 自訂流程 85
5.6 總結 89

第6章 後端 90
6.1 概述 90
6.2 後端代碼結構介紹 92
6.3 後端庫介紹 93
6.4 如何使用TableGen實現LLVM後端 94
6.4.1 TableGen語言 95
6.4.2 代碼生成器.td檔介紹 96
6.5 指令選擇階段介紹 100
6.5.1 SelectionDAG類 100
6.5.2 降級 102
6.5.3 DAG合併以及合法化 103
6.5.4 DAG到DAG指令選擇 104
6.5.5 指令選擇過程視覺化 107
6.5.6 快速指令選擇 107
6.6 調度器 107
6.6.1 指令執行進程表 108
6.6.2 競爭檢測 109
6.6.3 調度單元 109
6.7 機器指令 109
6.8 寄存器分配 110
6.8.1 寄存器合併器 111
6.8.2 虛擬寄存器重寫 114
6.8.3 編譯目標的資訊 115
6.9 前序代碼和結束代碼 116
6.10 機器代碼框架介紹 116
6.10.1 MC指令 116
6.10.2 代碼輸出 117
6.11 自訂機器流程 119
6.12 總結 121

第7章 即時編譯器 122
7.1 LLVM JIT引擎的基礎知識介紹 122
7.1.1 介紹執行引擎 123
7.1.2 記憶體管理 124
7.2 llvm::JIT框架介紹 124
7.2.1 將二進位大物件寫入記憶體 125
7.2.2 使用JITMemoryManager 125
7.2.3 目標代碼輸出器 125
7.2.4 目標資訊 127
7.2.5 學習如何使用JIT類 127
7.3 llvm::MCJIT框架介紹 131
7.3.1 MCJIT引擎 131
7.3.2 MCJIT中模組編譯過程 132
7.3.3 使用MCJIT引擎 135
7.4 使用LLVM JIT編譯工具 137
7.4.1 使用lli工具 137
7.4.2 使用llvm-rtdyld工具 138
7.5 其他資源 139
7.6 總結 139

第8章 跨平臺編譯 140
8.1 GCC和LLVM對比 140
8.2 目標三元組介紹 141
8.3 準備自己的工具鏈 142
8.3.1 標準C/C++庫 143
8.3.2 運行時庫 143
8.3.3 彙編器和連結器 144
8.3.4 Clang前端 144
8.4 用Clang命令列參數進行交叉編譯 145
8.4.1 針對目標的驅動程式選項 145
8.4.2 依賴包 145
8.4.3 交叉編譯 146
8.4.4 改系統根目錄 148
8.5 生成Clang交叉編譯器 149
8.5.1 配置選項 149
8.5.2 構建和安裝基於Clang的交叉編譯器 149
8.5.3 其他構建方法 150
8.6 測試 151
8.6.1 開發板 151
8.6.2 模擬器 151
8.7 其他資源 152
8.8 總結 152

第9章 Clang靜態分析器 153
9.1 靜態分析器的作用 153
9.1.1 傳統警告資訊和Clang靜態分析器比較 153
9.1.2 符號執行引擎的高效性 156
9.2 測試靜態分析器 158
9.2.1 使用驅動程式與使用編譯器 158
9.2.2 瞭解可用的檢查器 158
9.2.3 在Xcode IDE中使用靜態分析器 160
9.2.4 生成HTML格式的圖形
9.2.5 處理大型專案 161
9.3 使用自訂的檢查器擴展靜態分析器 164
9.3.1 熟悉項目架構 164
9.3.2 自訂檢查器 165
9.4 其他資源 173
9.5 總結 174

第10章 基於LibTooling的Clang工具 175
10.1 生成編譯命令資料庫 175
10.2 clang-tidy工具 176
10.3 代碼重構工具 178
10.3.1 Clang Modernizer(代碼轉換器) 178
10.3.2 Clang Apply Replacements(替換執行器) 178
10.3.3 ClangFormat (格式化工具) 180
10.3.4 Modularize(模組化工具) 181
10.3.5 Module Map Checker(模組映射檢查器) 187
10.3.6 PPTrace(追蹤工具) 187
10.3.7 Clang Query(查詢工具) 189
10.3.8 Clang Check(檢查工具) 190
10.3.9 remove-cstr-calls(調用移除工具) 190
10.4 編寫自己的工具 190
10.4.1 問題定義:編寫一個C++代碼重構工具 191
10.4.2 配置原始程式碼位置 191
10.4.3 剖析工具的範本代碼 192
10.4.4 使用AST匹配器 195
10.4.5 編寫回呼函數 199
10.4.6 測試編寫的重構工具 200
10.5 其他資源 201
10.6 總結 201

索引 202
 

LLVM是一個非常具有啟發意義的軟體專案,它起始於Chris Lattner個人對編譯器的熱情。LLVM最初版本發行後出現的一系列事件以及後來被廣泛採用的經歷也遵循了一種其他開源專案常見的成功發展模式:這些項目通常是人們對某個問題的強烈好奇心的產物,並非始於某個公司。例如,第一個Linux內核的誕生源于一名芬蘭學生對作業系統領域的興趣,因而產生了強烈動機去理解和實踐一個真正的作業系統應該如何工作。

對於Linux或LLVM,許多程式師的貢獻使它們迅速成長為一流軟體,在品質上可以與現有的任何其他競爭對手相媲美。因此,把任何一個大項目的成功歸功於特定個人是不公平的。無可否認的是,在開源社區中,一個學生的軟體專案想要飛躍成為複雜且健壯的軟體需要一個關鍵因素:吸引那些願意在該項目上花費時間的貢獻者和程式師。

這樣的因素天然存在於充滿教育氣息的校園氛圍之中。教育的重要任務是教會學生理解任務的工作原理,因此對學生而言,他們可以在解開錯綜複雜的機制並最終掌握它們的過程中享受到勝利的喜悅。伊利諾伊大學厄巴納–香檳分校(UIUC)的LLVM項目正是在這種環境下發展起來的,它既被用作研究原型,也被用作Lattner的碩士導師Vikram Adve講授編譯器課程的教學框架。學生們為最初的bug排查做出了貢獻,這也為LLVM最終成為一個設計良好且易於學習的項目奠定了發展方向。

軟體理論和實踐之間的顯著差異使許多電腦科學專業的學生感到困惑。計算理論中一個簡潔明瞭的概念可能涉及多層級的實現細節,這些細節使得現實中的軟體專案變得過於複雜而無法讓人們掌握,特別是其所有微妙之處。巧妙的抽象設計是幫助人類大腦掌握專案所有層面的關鍵:從高層級的視圖(抽象意義下的程式實現和工作方式)到最低層級的細節。

理論與實踐之間的差異在編譯器這一軟體中尤為顯著。對學習編譯器工作原理有極大熱情的學生,在理解編譯器的實際實現時常常面臨艱巨的挑戰。儘管學校已經教授了編譯器的相關理論,但在LLVM項目之前,如果充滿好奇心的學生要學習實現真正的編譯器,GCC專案是少數開源選項之一。

然而從最純粹的意義上說,軟體專案反映的是其創建者的觀點。這些觀點通過跨多個元件對模組和資料表示進行抽象來實現。但對於同一主題,程式師可能有不同的看法。因此,對於GCC這樣已有近30年歷史的老舊軟體庫而言,其中集合了不同時代的程式師的不同觀點,這使得該軟體越來越難以被新程式師和好學者理解。

LLVM項目不僅吸引了經驗豐富的編譯器程式師,還吸引了許多年輕且具有好奇心的從事科研的學生,他們從中看到一片更乾淨、更簡單的駭客土壤,它代表了一個具有很大潛力的編譯器。這一點可以從選擇LLVM作為研究原型的科學論文的龐大數量得到驗證。學生們做出如此選擇的原因很簡單:在學術界,學生通常負責專案的具體實現,因此對他們來說,掌握實驗框架代碼庫對於研究是至關重要的。由於LLVM使用C++語言(而不是GCC中使用的C)、模組化(而不是GCC的單一龐大結構)以及更容易映射到現代編譯器理論的概念,因此,很多研究人員發現修改LLVM代碼以實現他們的科研想法是很容易的,並且有很多這方面成功的例子。LLVM在學術界的成功可以說是理論與實踐之間縮小差距的結果。

除了作為科研工作的實驗框架之外,與GCC的GPL許可證相比,LLVM項目還有更加自由的許可證,因而引起了產業界的興趣。對於一個從學術界發展起來的項目,編寫其代碼的研究人員通常會擔心寫好的代碼在用於單獨的某個實驗後遭遇被丟棄的命運。為了克服這種局限性,在UIUC的碩士專案中,Chris Lattner決定根據伊利諾伊大學/NCSA開源授權合約對該專案進行許可,該許可只要求保留版權聲明就允許包括商用目的在內的使用。Chris的目標是使LLVM被最大限度地採用,最終結果超出預期。2012年,LLVM榮獲ACM軟體系統獎,這是對為科研做出傑出貢獻的軟體的高度認可。

許多商業公司基於不同的需求使用LLVM專案,也為該專案做出不同的貢獻,擴展了基於LLVM的編譯器可以使用的語言範圍以及能夠為其生成代碼的機器範圍。最終,LLVM項目具備了前所未有的成熟的庫和工具,進入了新的階段:從學術軟體的實驗狀態,進入被商業產品使用的健壯框架狀態。因此,項目的名稱也從低級虛擬機器(Low Level Virtual Machine)更改為縮寫LLVM。

停用低級虛擬機器的名稱,轉而使用LLVM,這一決定反映了該專案在不同時期的目標。起初,LLVM是一個碩士科研專案,目標是成為一個可以用於研究程式終身優化的框架。相關工作成果發表在2003年MICRO(微體系結構國際研討會)的一篇名為《LLVA: A Low-level Virtual Instruction Set Architecture》的論文以及2004年CGO(代碼生成和優化國際研討會)的一篇名為《LLVM: A Compilation Framework for Lifelong Program Analysis & Transformation》的論文中。前者描述了LLVM的指令集,而後者對整個框架進行了描述。

在學術環境之外,LLVM被廣泛用作一個設計良好的編譯器,它具有將中間表示寫入磁片等有用的特性。在商業系統中,它從未真正像Java虛擬機器(JVM)一樣被使用,因此繼續使用低級虛擬機器名稱毫無意義。另一方面,其他一些奇怪的名字仍然作為LLVM的歷史遺產而存在。在磁片檔中存儲的LLVM中間表示程式稱為LLVM位元碼。位元碼的名稱類似於Java的位元組碼,但前者反映了LLVM中間表示所需的空間,與Java位元組碼的含義不同。

我們編寫此書有雙重目的。首先,由於LLVM專案發展速度很快,我們希望將其循序漸進地呈現給你,使本書的內容盡可能簡單易懂,同時讓你享受使用功能強大的編譯器庫的樂趣。 其次,我們希望喚起你開源駭客的精神去探索超出本書的概念,永遠不要停止擴充知識的腳步。

祝你閱讀愉快!
 
 

詳細資料

  • ISBN:9787111631972
  • 規格:平裝 / 212頁 / 16k / 19 x 26 x 1.06 cm / 普通級 / 單色印刷 / 初版
  • 出版地:中國

最近瀏覽商品

 

相關活動

  • 豐盛順遂,才財兩得~2026 成為更好的人!創富思維、成長心態有聲書/線上課程66折起
 

購物說明

溫馨提醒您:若您訂單中有購買簡體館無庫存/預售書或庫存於海外廠商的書籍,建議與其他商品分開下單,以避免等待時間過長,謝謝。

大陸出版品書況:因裝幀品質及貨運條件未臻完善,書況與台灣出版品落差甚大,封面老舊、出現磨痕、凹痕等均屬常態,故簡體字館除封面破損、內頁脫落...等較嚴重的狀態外,其餘所有商品將正常出貨。 

 

請注意,部分書籍附贈之內容(如音頻mp3或影片dvd等)已無實體光碟提供,需以QR CODE 連結至當地網站註冊“並通過驗證程序”,方可下載使用。

調貨時間:若您購買海外庫存之商品,於您完成訂購後,商品原則上約21~30個工作天內抵台(若有將延遲另行告知)。為了縮短等待的時間,建議您將簡體書與其它商品分開訂購,以利一般商品快速出貨。 

若您具有法人身份為常態性且大量購書者,或有特殊作業需求,建議您可洽詢「企業採購」。 

退換貨說明 

會員所購買的商品均享有到貨十天的猶豫期(含例假日)。退回之商品必須於猶豫期內寄回。 

辦理退換貨時,商品必須是全新狀態與完整包裝(請注意保持商品本體、配件、贈品、保證書、原廠包裝及所有附隨文件或資料的完整性,切勿缺漏任何配件或損毀原廠外盒)。退回商品無法回復原狀者,恐將影響退貨權益或需負擔部分費用。 

訂購本商品前請務必詳閱商品退換貨原則

  • 古籍精選3本72折
  • 百大2本75折