作者mshockwave (夏克維夫)
看板CompilerDev
標題[分享] 新手指南
時間Wed Jun 17 13:07:37 2020
應版友要求 來列個簡單的新手指南和書單好了
首先我個人非常不推 Dragon Book,原因在於他花太多時間在講 Lex/Parse 了
而且也非常多章節都過時了 用字遣詞方面也顯得過於學究不好懂
(Lex/Parse是必須學 但由於現代程式語言不像C/C++,基本上用top-down parser就可以
解決 而top-down parser老實講不需要什麼domain knowledge 所以在學習的過程
個人認為不要花太多時間在 Lex/Parse上)
Engineering a Compiler
個人認為這本書算是比較平衡 也能夠陪伴你比較久的新手教科書:
https://www.amazon.com/Engineering-Compiler-Keith-Cooper/dp/012088478X
Building an Optimizing Compiler
上面那本書的後半章節已經有涵蓋 IR 以及 backend,如果您想在 IR optimization
(通常我都會稱為"middle-end")方面有更深入了解的話 有一本不錯的入門書:
https://tinyurl.com/ybvs54mr
這本書還蠻薄的 程度的話大概只比 Engineering a Compiler 深一些些 算是一本
很不錯的銜接用書
閱讀原始碼
很可惜,就小弟所知 再接下去就沒有「普通」書可以讀了 我個人在這之後就是閱讀
大量的原始碼和paper。其中原始碼特別有幫助 不僅你可以知道怎麼實作 也可以深切
感受到學術與產業界在實務需求的差別 例如:在提到 pointer/alias analysis的時候
文獻一定會提到 Anderson/Steengaards 的演算法,但在LLVM裡面....兩者預設
都沒開啟XDD 最大的原因在於最普通、依靠一堆手寫規則/heuristic的 alias analysis
就已經「夠好了」,用前述的兩個演算法不僅花時間 成果也不見得比較好
至於要挑選GCC還是LLVM來閱讀,由於我還真的完全沒讀過GCC的原始碼(掩面
就不方便比較兩者的優缺點。如果就單講LLVM的話,因為他用的是 modern C++
(C++14)來開發,而且都有把最新的 feature 發揮得淋漓盡致,也將抽象的idea用物件
包裝起來,所以個人認為比較容易理解。除此之外 也是個學習良好C++ programming
習慣的優良範本。但您大概也知道 LLVM專案的規模以接近指數倍的速度增長
如果第一次看到大概感覺像是迷宮一樣,因此改天我會寫個簡單的原始碼研讀指南
系統架構相關書籍
即便 compiler 底下有分很多子領域,但最常見的依然是面向系統底層的需求,例如
針對某個特殊硬體功能做優化。因此熟悉處理器架構基本上也算必修課題之一
相信各位大學一定修過 Computer Architecture,用的不外乎也是暱稱「白算盤」
的 Computer Organization:
https://tinyurl.com/yawxuu8z
這本書已經算不錯了,建議也閱讀他的進階版本:
https://tinyurl.com/y86usjqb
再來如果是結合 compiler 與進階硬體架構的書,就不得不推 "The Blue Book":
https://tinyurl.com/y924fkmo
這本書我個人是視為聖經 因為雖然裡面只focus在各種層級的平行化問題
但第一,平行化就算過幾十年還是一個難解的問題XDD。第二,該書前三章提出的
dependency analysis 後來變成編譯器開發最重要的基石之一。可以用在非常廣泛的
問題上
除此之外雖然他是在本世紀初出版 但裡面非常多針對特定硬體功能的優化 現在
(意外地)依然可以用
目前就想到這些 如有其他建議歡迎來補充!
--
※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 169.234.228.195 (美國)
※ 文章網址: https://www.ptt.cc/bbs/CompilerDev/M.1592370461.A.B56.html
※ 編輯: mshockwave (169.234.228.195 美國), 06/17/2020 13:08:15
推 b0920075: 如果想看實作玩具級編譯器的書或 project 請問有沒有推 06/17 15:43
→ b0920075: 薦哪些是比較友好的? 06/17 15:43
推 JackChung: MLIR簡單好用 06/17 18:26
→ Lipraxde: llvm kaleidoscope 06/17 18:48
推 flypaper: 我覺得gcc難入手許多 常常想要理解某個API的用途就花很 06/18 20:50
→ flypaper: 多時間 巨集重重 模組化沒llvm清楚 有時候想用gdb也沒方 06/18 20:52
→ flypaper: 向 不過也有可能是我的慧根不夠就是了 06/18 20:53
推 Dracarys: 坐等原始碼研讀指南 06/20 14:05
推 LLVMBackend: 這是小弟最近入門llvm所記錄的一些心得 06/27 12:54
推 nevak: 這篇值得自m 06/30 06:33
推 JameC: 太晚發現這個版了,好多有用的資訊,推 07/10 21:05
推 argc: 感謝分享 12/06 23:38
推 kkk99923: 推推 09/10 19:49
推 cseslowpoke: 推 08/29 14:11