作者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://webptt.com/cn.aspx?n=bbs/CompilerDev/M.1592370461.A.B56.html
※ 编辑: mshockwave (169.234.228.195 美国), 06/17/2020 13:08:15
1F:推 b0920075: 如果想看实作玩具级编译器的书或 project 请问有没有推 06/17 15:43
2F:→ b0920075: 荐哪些是比较友好的? 06/17 15:43
3F:推 JackChung: MLIR简单好用 06/17 18:26
4F:→ Lipraxde: llvm kaleidoscope 06/17 18:48
5F:推 flypaper: 我觉得gcc难入手许多 常常想要理解某个API的用途就花很 06/18 20:50
6F:→ flypaper: 多时间 巨集重重 模组化没llvm清楚 有时候想用gdb也没方 06/18 20:52
7F:→ flypaper: 向 不过也有可能是我的慧根不够就是了 06/18 20:53
8F:推 Dracarys: 坐等原始码研读指南 06/20 14:05
9F:推 LLVMBackend: 这是小弟最近入门llvm所记录的一些心得 06/27 12:54
11F:推 nevak: 这篇值得自m 06/30 06:33
12F:推 JameC: 太晚发现这个版了,好多有用的资讯,推 07/10 21:05
13F:推 argc: 感谢分享 12/06 23:38
14F:推 kkk99923: 推推 09/10 19:49
15F:推 cseslowpoke: 推 08/29 14:11