內容簡介

本書以任務驅動的方式,帶領讀者編寫基於LLVM 的編譯器前端、優化器、后端。通過豐富的實例,讀者能夠從中理解LLVM的架構,以及如何使用LLVM來編寫自己的編譯器。相比於傳統的介紹編譯技術的書籍,此書更偏向於實戰,因此適合熟悉編譯但對LLVM比較陌生的人員,也適合正在學習編譯技術並且在尋找實戰機會的人員。

Mayur Pandey 是一名專業的軟件工程師,同時也是一位開源軟件的愛好者。他專注於編譯器以及編譯器工具的開發,是LLVM 開源社區的活躍貢獻者,也是Tizen 編譯器項目的一員,他對其他編譯器也有着親身實踐經驗。

Mayur 在印度阿拉哈巴德的Motilal Nehru 國家技術研究所獲得學士學位。目前居住在印度班加羅爾。

Suyog Sarda 是一名專業的軟件工程師,同時也是一位開源軟件的愛好者。他專注於編譯器以及編譯器工具的開發,是LLVM 開源社區的活躍貢獻者,也是Tizen 編譯器項目的一員。除此之外,Suyog 也參與了ARM和x86 架構的代碼改進工作。他對其他的編譯器也有着親身實踐經驗。他對編譯器的主要研究在於代碼優化和向量化。

除了編譯器之外,Suyog 也對Linux 內核的開發很感興趣。他曾在2012 年於迪拜由Birla技術協會舉辦的IEEE 國際雲計算技術應用大會的議程上發表技術論文,題為「SecureCo-resident Virtualization in Multicore Systems by VM Pinning and Page Coloring」。他在印度普納工程大學獲得計算機學士學位。目前居住於印度班加羅爾。
 

目錄

前言
第1章LLVM設計與使用
概述
模塊化設計
交叉編譯Clang/LLVM
將C源碼轉換為LLVM匯編碼
將LLVM IR轉換為bitcode
將LLVM bitcode轉換為目標平台匯編碼
將LLVM bitcode轉回為LLVM匯編碼
轉換LLVM IR
鏈接LLVM bitcode
執行LLVM bitcode
使用C語言前端——C1ang
使用GO語言前端
使用DragonEgg
第2章實現編譯器前端
概述
定義TOY語言
實現詞法分析器
定義抽象語法樹
實現語法分析器
解析簡單的表達式
解析二元表達式
為解析編寫驅動
對TOY語言進行詞法分析和語法分析
為每個AST類定義IR代碼生成方法
為表達式生成IR代碼
為函數生成IR代碼
增加IR優化支持
第3章擴展前端並增加JIT支持
概述
處理條件控制結構—if/then/else結構
生成循環結構
處理自定義二元運算符
處理自定義一元運算符
增加JIT支持
第4章准備優化
概述
多級優化
自定義LLVM Pass
使用opt工具運行自定義Pass
在新的Pass中調用其他Pass
使用Pass管理器注冊Pass
實現一個分析Pass
實現一個別名分析Pass
使用其他分析Pass
第5章實現優化
概述
編寫無用代碼消除Pass
編寫內聯轉換Pass
編寫內存優化Pass
合並LLVM IR
循環的轉換與優化
表達式重組
IR向量化
其他優化Pass
第6章平台無關代碼生成器
概述
LLVM IR指令的生命周期
使用GraphViz可視化LLVM IR控制流圖
使用TableGen描述目標平台
定義指令集
添加機器碼描述
實現MachinelnstrBuilder類
實現MachineBasicBlock類
實現MachineFunction類
編寫指令選擇器
合法化SelectionDAG
優化SelectionDAG
基於DAG的指令選擇
基於SelectionDAG的指令調度
第7章機器碼優化
概述
消除機器碼公共子表達式
活動周期分析
寄存器分配
插人頭尾代碼
代碼發射
尾調用優化
兄弟調用優化
第8章實現LLVM后端
概述
定義寄存器和寄存器集合
定義調用約定
定義指令集
實現棧幀lowering
打印指令
選擇指令
增加指令編碼
子平台支持
多指令lowering
平台注冊
第9章LLVM項目最佳實踐
概述
LLVM中的異常處理
使用sanitizer
使用LLVM編寫垃圾回收器
將LLVM IR轉換為JavaScript
使用Clang靜態分析器
使用bugpoint
使用LLDB
使用LLVM通用Pass
 

程序員在編程時沒有一刻可以離開編譯器。簡單來說,所謂編譯器就是把人類可讀的高級語言映射到機器執行碼。但你知道這里面發生了什麼嗎?編譯器在生成優化過的機器碼之前還做了很多處理工作,一個好的編譯器包含了很多復雜的算法。

這本書介紹了編譯的幾個階段:前端處理、代碼優化、代碼生成等。為了將這個復雜的過程簡化,LLVM使用了模塊化的思想,使得每一個編譯階段都被獨立出來;LLVM使用面向對象的C++語言完成,為編譯器開發人員提供了易用而豐富的編程接口和API。所以,LLVM可能是最容易學習的編譯器框架了。

作為作者,我們認為簡單的解決方案往往會比復雜的解決方案更加奏效;通過這本書,我們將會了解許多編譯技術,它能提升你的能力,讓你了解編譯選項,理解編譯過程。

我們也相信,那些從事編譯器開發的程序員會從本書收益良多,因為對編譯器技術的了解會幫助他們寫出更好的代碼。

我們希望你能喜歡這本書,享受這本書提供的技術盛宴,也能開發自己的編譯器。迫不及待了嗎?讓我們開始吧。

本書概述
第1章:LLVM設計與使用。本章介紹了模塊化的LLVM基礎架構設計,讓你學會如何下載安裝LLVM和Clang,通過一些例子來了解如何使用LLVM工作,也會介紹一些其他的編譯器前端。

第2章:實現編譯器前端。本章介紹了如何為一門編程語言編寫一個編譯器前端,我們通過為一門玩具語言寫一個玩具編譯器,來了解如何把前端語言映射到LLVMIR。

第3章:擴展前端並增加JIT支持。本章為這門玩具語言增加了一些現代語言的高級特性,以及對前端的JIT支持。

第4章:准備優化。本章介紹LLVMIR的Pass結構,以及不同的優化級別和每一級別上的優化技術。我們也將看到如何一步一步編寫自己的LLVMPass。

第5章:實現優化。本章介紹如何在LLVMIR上實施諸多優化Pass,以及在LLVM開源代碼上實現一些向量化技術。

第6章:平台無關代碼生成器。本章介紹了一個平台無關代碼生成器的抽象結構,如何把LLVMIR轉換到有向無環圖(DAG),以及如何進一步生成目標平台機器碼。

第7章:機器碼優化。本章介紹了DAG的優化過程,目標寄存器分配算法,還介紹了SelectionDAG上的各種優化技術及不同寄存器的分配技術。

第8章:實現LLVM后端。本章介紹了目標架構,包括寄存器、指令集、調用約定、編碼、子平台特性等。

第9章:LLVM項目最佳實踐。本章介紹了一些使用LLVMIR做代碼分析的其他項目。需要記住的是,LLVM不僅僅是一個編譯器,而且是一個編譯器框架。本章介紹了一段可應用到各種項目的代碼,可從中獲取有用信息。

閱讀背景
你只需要一台Linux計算機,最好是Ubuntu系統,就能完成本書的大部分例子。你也需要一個簡單的文本或代碼編輯器、網絡連接,以及一個瀏覽器。我們建議安裝兩個文件的合並包,它在大部分Linux平台都能運行。

讀者對象
本書適合那些熟悉編譯器概念並且想理解學習LLVM的程序員。
本書也適合不直接參與編譯器開發但參與大量代碼開發的程序員。具備一定的編譯器知識將會使你寫出更加優秀的代碼。

內容組織
在此書中你會頻繁地看到一些標題,例如准備工作、詳細步驟、工作原理、更多內容、另請參閱。
為了更好地呈現本書內容,我們采用了如下的組織方式。
准備工作
這部分對章節做了概述,並且描述了如何配置軟件及其他工具。
詳細步驟
這部分涵蓋了具體的實踐步驟。
工作原理
這部分涵蓋了前一部分的詳細解釋。
更多內容
這部分涵蓋了關於章節的更多信息。
另請參閱
這部分涵蓋了參考資料的鏈接。
約定
在本書中你會發現大量用不同格式展示的文字,這里舉例說明它們的涵義。
嵌入代碼、數據庫表名、目錄名、文件名、文件擴展名、路徑名、URL、用戶輸入、Twitter用如下方式展示:「我們可以用include指令引入其他的上下文。」
代碼塊用如下格式:
primary:=identifier_expr:
LLVMCookbook中文版
【XIV】
=numeric_expr
:=paran_expr
當我們想強調部分代碼塊時,相關行會使用粗體:
primary:=identifier_expr
:=numeric_expr
:=paran_expr
命令行輸入和輸出用如下格式:
$cattestfile.ll
新的術語和重要單詞也會用黑體顯示。你在屏幕上看到的內容,包括對話框或菜單,會這樣顯示:「單擊下一步將進入下一屏」。
下載示例代碼
你可以載所有已購買的博文視點書籍的示例代碼文件。
勘誤表
雖然我們已經盡力謹慎地確保內容的准確性,但錯誤仍然存在。如果你發現了書中的錯誤,包括正文和代碼中的錯誤,請告訴我們,我們會非常感激。這樣,你不僅幫助了其他讀者,也幫助我們改進后續的出版。如發現任何勘誤,可以在博文視點網站相應圖書的頁面提交勘誤信息。一旦你找到的錯誤被證實,你提交的信息就會被接受,我們的網站也會發布這些勘誤信息。你可以隨時瀏覽圖書頁面,查看已發布的勘誤信息。
網路書店 類別 折扣 價格
  1. 新書
    $450