(六)Languages and Compilers语言和编译器学习路径
1. 初阶
顺序 | 资源 | 知识分类/使用方法 | 链接和介绍 |
学习思路:先自己实现一个麻雀虽小五脏俱全的编译器,在实践过程中建立大局观,学习why、how。
| |||
1 | 《自制编译器》 青木峰郎(日) | 【编译原理】【实战】 两个1二选一,目的都是写编译器 | https://32931414.s21i.faiusr.com/61/ABUIABA9GAAgxr6IuwYo_L7h7AM.pdf 可以通过重写《自制编译器》的c-flat编译器来练手更接近于现实的编译器。其中你可以用递归下降来写parser,这样自顶向下和自底向上的语法解析器你都熟悉了。当然这个练手项目的着重点更多是在编译器后端。 == 本书将带领读者从头开始制作一门语言的编译器。本书对以编译器为中心的编程语言的运行环境,即编译器、汇编器、链接器、硬件、运行时环境等都有所提及,介绍了程序运行的所有环节。 |
1 | Crafting Interpreters | 【编译原理】【实战】 两个1二选一,目的都是写编译器 | https://craftinginterpreters.com/ 全书作者通过教大家分别用java和c来实现自创语言lox的解释器,讲解编译器相关知识。 |
2 | CS143: Introduction to Compilers | 【编译原理】 | http://web.stanford.edu/class/cs143/ https://www.bilibili.com/video/BV17K4y147Bz https://github.com/skyzluo/CS143-Compilers-Stanford 教材是龙书 设计者开发了一个 Class-Object-Oriented-Language,简称 COOL 语言。这门课的核心就是通过理论知识的学习,为 COOL 语言实现一个编译器,将 COOL 高级语言编译为 MIPS 汇编并在 Spim 这个 MIPS 模拟器上成功执行。 理论部分基本按照龙书的顺序覆盖了词法分析、语法分析、语义分析、运行时环境、寄存器分配、代码优化与生成等内容,实践部分则相应地分为词法分析、语法分析、语义分析、代码生成四个阶段,难度循序渐进,并在优化部分给学生留下了很大的设计空间。 5 个书面作业 + 5 个编程作业带你实现一个编译器。作业有C,C++,Java版本。 |
2 | (龙书)《编译原理》 Compilers: Principles,Techniques,and Tools | 【编译原理】 2的教材 当做参考书来看,不需要事无巨细都要看懂 | https://32931414.s21i.faiusr.com/61/ABUIABA9GAAgyr6IuwYo_JXI1wU.pdf 前端部分适合入门,后端比较晦涩。 == 龙书特点就是信息密度极大,如果漏掉一两句话,可能后面就看不懂了,如果不往后翻1-2页看例子,可能前面的证明和原理也不怎么懂,平心而论我觉得最适合入门的就是龙书了,看完龙书前六章可以去看<编程语言实现模式><虎书>然后和龙书交替着看,实现一个自己语言的编译器,就算搞定了 |
2’ | 编译原理 华保健 中科大 | 【编译原理】 2的平替 | |
2’ | 编译原理,哈工大,81集 | 【编译原理】 2的平替 | |
3 | (optional)看Javascript引擎V8源码中的编译功能 | V8的编译功能比GCC等编译器要简单很多,适合入门。 | |
顺序 | 资源 | 知识分类/使用方法 | 链接和介绍 |
(虎书)《Modern Compiler Implementation In ML/C/Java》 ,现代编译原理-C语言描述,Andrew W.Appel,with Jens Palsberg | 【编译原理】 | C版: https://32931414.s21i.faiusr.com/61/ABUIABA9GAAgx76IuwYo5_bz5wc.pdf Java版: https://32931414.s21i.faiusr.com/61/ABUIABA9GAAgy76IuwYonpD9iQQ.pdfML版: https://32931414.s21i.faiusr.com/61/ABUIABA9GAAgx76IuwYohIvQowY.pdf有三种语言的版本:C版,java版和ML版。这三本书的内容基本相同。但是使用不同的语言来实现书中给出的一个编译器。 | |
(龙书)《编译原理》 Compilers: Principles,Techniques,and Tools | 【编译原理】 入门阶段已经粗略看过的人,这个阶段精度 | https://32931414.s21i.faiusr.com/61/ABUIABA9GAAgyr6IuwYo_JXI1wU.pdf 前端部分适合入门,后端比较晦涩。 == 龙书特点就是信息密度极大,如果漏掉一两句话,可能后面就看不懂了,如果不往后翻1-2页看例子,可能前面的证明和原理也不怎么懂,平心而论我觉得最适合入门的就是龙书了,看完龙书前六章可以去看<编程语言实现模式><虎书>然后和龙书交替着看,实现一个自己语言的编译器,就算搞定了 | |
《编译器设计-第二版》Engineering a Compiler, EAC | 【编译原理】【实战】 和龙书互为参考 | https://32931414.s21i.faiusr.com/61/ABUIABA9GAAgxr6IuwYo8Lakag.pdf 通过这本书全面的学习了后端优化知识。 == 我目前看过的几本编译原理书里面,《Engineering a Compiler》是写的最好的,基本概念都讲解的很清晰,不会像看龙书那样似懂非懂。 | |
《Compiler Construction Using Java, JavaCC, and Yacc》(Dos Reis) | 【编译原理】 龙书平替 | https://32931414.s21i.faiusr.com/61/ABUIABA9GAAgxr6IuwYo7Nf-wQU.pdf 内容和龙书基本一致,但充满了细节和设计思路。你可以尝试看第二章节,一定可以回答你看龙书的困惑。与龙书相比,这本书更加注重实践,很多章节都附有实现编译器的示例代码,能够更好地帮助读者理解编译原理的概念和实现方法。 它使用Java、JavaCC和Yacc作为编译器的开发环境,通过编写一个简单的编译器来讲解编译原理的概念和实现方法。 | |
《Essentail of Programming Languages》,Dan Friedman等 | 【PL】 | https://32931414.s21i.faiusr.com/61/ABUIABA9GAAgxr6IuwYona7SwAQ.pdf 想对编程语言的设计了解的稍微深入一点,又不想学的太理论,EOPL这本书确实不错。学完这个后续如果感兴趣还可以再深入,这本书挺适合对编程语言的设计与实现入门学习的人。让我对这些东西有了不少更直观的认识。总共看了一个多月时间,做了很多习题,收获很大。 | |
PFPL,Robert Harper, 《Practical Foundation of Programming Languages》 | 【PL】 | https://32931414.s21i.faiusr.com/61/ABUIABA9GAAgxr6IuwYotIv6hQU.pdf | |
CS242 Programming Languages | 【PL】 | https://stanford-cs242.github.io/f19/ PL没有特别多人推荐的视频课程,这里就推荐这一门课。 CS242是一门讲程序语言 (Programming Language, PL) 的课程,但不是传统意义上的纯理论导向。这门课程首先介绍了如 Lambda 演算,类型系统这样的经典 PL 理论,然后借助系统编程的思想和实际的编程语言来驱动学生理解这些理论,展示了它们是如何在实际编程中帮助开发者避免各种错误。 这些作业涵盖知识跨度非常大,从最经典的编程语言理论证明和实践到以 Rust 为例的编程语言对于编程和系统设计的影响,再到最后各有特色的大作业。几乎所有的编程作业都有详尽的本地测试,尤其是大作业中的深度学习框架更有超过 200 个测试,适合自学。 前面几次的作业偏 PL 理论,后面几次的作业偏系统编程。 如果你觉得前面几次的课程内容和作业过于理论,可以重点尝试使用 OCaml 实现解释器的作业,它既能让你对之前的理论有更深刻的理解,又能让你实战一个函数式语言的类型检查和解释。 而后面的作业则更倾向于利用理论来指导系统编程与设计,尤其是 Rust 和它独特的所有权机制与类型系统。虽然我们要经常与编译器搏斗,但这也恰好说明了类型系统和理论对于编程和设计的意义。 个人自学过程中感觉作业还是偏难的,但收获很大,在后续作业的编程实践和前面所学的理论知识产生交集时会有恍然大悟的愉悦。如果你在完成作业时遇到了困难,这是十分正常的,请静下心来认真思考,或者再读一遍实验指导。 | |
南京大学 软件分析 课程 | 【PL】 | https://tai-e.pascal-lab.net/lectures.html |
顺序 | 资源 | 知识分类/使用方法 | 链接和介绍 |
学习思路:工业级别的编译器实现 | |||
(鲸书)《Advanced Compiler Design and Implementation》,高级编译器设计与实现 ,Steven S.Muchnick | 【编译原理】【后端】 | https://32931414.s21i.faiusr.com/61/ABUIABA9GAAgpsKIuwYogc3JpAM.pdf 书中针对现代语言和体系结构全面介绍了编译器设计与实现的高级论题,从编译器的基础领域中的高级问题开始,然后深入讨论了各种重要的代码优化。 | |
《Parsing Techniques 2》 | 【编译原理】【前端】 | https://32931414.s21i.faiusr.com/61/ABUIABA9GAAgpsKIuwYo99CZxAQ.pdf 这本书让我理解了如何手写Parser(这是从不会到会的飞跃)。 | |
(SICP)CS 61A: Structure and Interpretation of Computer Programs | 【编译原理】 | 主要讲的是:
| |
(SICP)计算机程序的构造和解释 Structure and Interpertation of Computer Programs | 【编译原理】 CS61a的教材 | https://32931414.s21i.faiusr.com/61/ABUIABA9GAAgp8KIuwYo4JLQ_Qc.pdf 另外 SICP(计算机程序的构造和解释)这本很多人推荐的书其实并不适合初学者,前3章和后面几章难度差别有点大。可能是自己水平不行,看 SICP 解释器和编译器那两章也是看不懂。 | |
The LLVM Compiler Infrastructure | 【编译原理】 | ||
C编译器剖析 《C编译器剖析(高等学校计算机专业规划教材) 》 | 【编译原理】【源码】 | https://32931414.s21i.faiusr.com/61/ABUIABA9GAAgp8KIuwYo5Nn98wc.pdf 以一个开源的C编译器(UCC)为案例,在源代码分析 的过程中,展开对编译原理相关知识的学习和讨论。 == 该书是一本以剖析C语言编译器源码的方式,讲解编译原理的优秀教材。博文风格,通俗易懂。 书的第1章结合一个迷你型类C语言编译器(约800行)的源码,讲解编译原理的基本理论。如果时间有限,只需阅读第1章,即可对“编译原理”有一个总体的认识。 第2-6章剖析一个完整的C语言编译器UCC(约20,000行)。 == 博文风格,通俗易懂。而且可以在作者的博客上在线阅读。 | |
《Types and Programming Languages》 | 【PL】 | https://32931414.s21i.faiusr.com/61/ABUIABA9GAAgpsKIuwYoqIjKpgE.pdf 这是一本比较务实的入门书籍,里面有各种类型系统的代码实现,而且讲的也比较通俗易懂。 | |