• 本帖长期收集关于编译原理相关的资源🥲
    (接MingLLuo )

编译原理就是CS的屠龙术(观龙书封面有感)

很显然,作为一名还未上过yulian课的人,似乎无法把握清楚学院的编译原理会讲什么,会上成什么样,观察了课程的目录,我愿将编译原理拆分成两门课:

  1. 形式语言与自动机
  2. 编译器

等等,两门课???
没错,教学安排涉及的内容就应该这样分解出来,并且应该认真对待,可见在一学期顺着讲下来(加上一些教学问题),学生的收获会如何可以预见?
所以,我的推荐会直接划分成两个Part,内容较多会涉及英文课程/书本资源的分享并借此向外延伸(函数式语言,编译语言(PL)...)

温馨提示,本人还没有深入学习编译的内容,接下来一切的一切都是经验+立Flag+吹水

形式语言与自动机

  • 推荐:Introduction To The Theory Of Computation(Sipser)

本科阶段提前接触自动机,正则表达式等计算理论知识的人可能没有1/10(这里不提22级,毕竟大一就上ITOC~)
我是通过ITOC(计算理论导引)了解这部分知识的,暂时不列出其他资源(没去学),可以去B站大学看看

编译器

龙书作为一本编译相关的经典图书,值得读,但我更倾向于其他选择。

编译,是将编程语言所写的代码翻译成其他语言(机器码,字节码或者其他),能够正确的转换代码成为我们的首要目的
  • PS:为什么要转化代码?答:可能你自己设计了一种语言,需要正确执行,你可以把它翻译(归约?这个描述貌似也不错)成C语言并且使用gcc/clang等强大的编译器。绕了一圈,你写C代码想跑得用它。

  • PS:为什么要学习编译原理?答:编译原理说起来其实很抽象,也不抽象,它既有形式化的文法定义,也有...作为计算机专业的学生,以后都是要成为“码农”的人,了解计算机提供的抽象不就是学计算机的应该做的吗(手动滑稽,很多代码的优化工作可能还是需要我们干预,即使现在AI大火(反正我挺期待学习Compiler的),(省去部分例子以及我说不出来的事情)

我们继续,这里我想给出一篇论文An Incremental Approach to Compiler Construction(莎莎推荐的,要不然遇不到它了),作者用简洁的形式带读者实现了一个支持大部分语法的Scheme编译器,写这个帖子前我又看了一遍

  • 什么是Scheme?这是一种函数式语言。
  • 什么是函数式语言?这是xxx(自行Wiki)

阅读这篇论文前,你需要了解Scheme的语法,与其如此,不如直接学吧!(开玩笑的,随你)

  • CS61A的最后部分学习了Scheme,你可以跟着那部分的内容学习
  • SICP原版使用Scheme编写,可以参考阅读,不过想学还是看61A吧
  • TL;DL(Too Long(Time to Learn); Didn't Learn):直接看这个link,或者找找速成资料

现在很多语言都支持函数式编程特性(C++/Python...),如果了解了Scheme,可以尝试实现一个Scheme解释器(61A Project),或者看Fluent Python关于Scheme的interpreter(132 Lines in Python)

接下来看论文,你就能大概摸清编译在做什么了(你也可以直接阅读)

时间可能不够啊,我也觉得,大二暑假不去实习不就有大把时间?(本人妥妥的废物,暑假只能呆在家里学习)

都来到函数式语言了,在此夹带点私货,快来学OCaml吧!你可以通过CS3110了解OCaml的函数式编程,为啥推荐它?

  • 来到第一门推荐的编译课,用OCaml实现编译器Brown CSCI1260 Compilers and Program Analysis,除了Recording不公开,其他都很全,暑假我会过一遍这门课,不会OCaml也没关系,跟着指引走就行。

  • 更多人知道Stanford CS143,不过我没有深入学习,可以看看CSDIY的评论区怎么说

  • 国内有一门比较受欢迎的编译课,来自南京大学(好多好课呜呜呜),你可以通过link来访问相关资源,b站也有课程视频

这些课程的难度可能对大多数朋友来说,具有挑战性(这里忽略语言),因为他们并不只是从零到一,还更深入的学习了一些知识,都很重要,但对于看到这个帖子只想要期末不挂科的人来说,还是太过深入辣,或者说,方向错辣

  • 这一门编译课是不对外公开的,整一门课就是带你从零到一实现一个编译器,想要学习的朋友需要自己摸索(SFU cmpt379),资源很全,感谢NULL哥

诶,不选龙书你就选着刷课是吗,不不不,还是要看书的,先列出来吧,等以后我读完再写感想

  • Modern Compiler Implementation in C(现代编译原理:C语言实现):常称虎书
  • Engineering a Compiler:已经出到第三版,国内的翻译还没跟上,建议读第三版
  • CRAFTING INTERPRETERS:最近很受欢迎的一本书
  • Compilers: Principles,Techniques,and Tools(龙书):要看要看

(PS:读书不一定要从头读到尾,更应该有体系框架,选择性的读,让我连着读上面四本还不如...)

说了一堆废话,我会在暑假怎么学?

  • 主要聚焦于CSCI1260/CRAFTING INTERPRETERS/Engineering a Compiler,我会优先阅读完CRAFTING INTERPRETERS,学习CSCI1260(可能还有379),其他书作为参考资料
  • 暑假怎么久这么点很轻松吧?答:...感觉学习量小多,而且还有其他要学和整理的东西(CS咕咕咕Plan)
  • 一起学吧!答:很欢迎,不过我提倡先自学,有问题就提,在没有人带的情况下小组学习进展会有些问题?
  • PL去哪了?答:来了来了,系统学习可以看Software Foundations,我还没机会看。。。所以我根本就不懂PL🥲

暂时不扯这么多了,大家肯定都看烦了,等我熬过期末再看看怎么修改和补充吧
v0 2023.6.15(also typo fix

    7 个月 后

    谷歌搜编译原理搜到此文,于是吃了安利去看 ITOC ,确实很不错

    MingLLuo 你现在作为一个已经为yulian拼过命的人(上个yl课的人),可以出来再补一刀了!哈哈哈......

    有空再写
    终于出成绩了,没挂,可以动笔了😇

      8 个月 后

      列举一些我们参加编译器实现赛用到的比较重要的文献:
      [1] Braun, Matthias, et al. "Simple and efficient construction of
      static single assignment form." Compiler Construction: 22nd
      International Conference, CC 2013, Held as Part of the European
      Joint Conferences on Theory and Practice of Software, ETAPS 2013,
      Rome, Italy, March 16-24, 2013. Proceedings 22. Springer Berlin
      Heidelberg, 2013.
      [2] Appel, Andrew W. Modern compiler implementation in C.
      Cambridge university press, 2004.
      [3] Torczon, Linda, and Keith Cooper. Engineering a compiler.
      Morgan Kaufmann Publishers Inc., 2007.
      [4] George, Lal, and Andrew W. Appel. "Iterated register
      coalescing." ACM Transactions on Programming Languages and Systems
      (TOPLAS) 18.3 (1996): 300-324.
      [5] Poletto, Massimiliano, and Vivek Sarkar. "Linear scan register
      allocation."ACM Transactions on Programming Languages and Systems
      (TOPLAS)21.5 (1999): 895-913.

      2 个月 后

      © 2018-2025 0xFFFF