跳转至

编译器设计与实践入坑指南

前言

一开始是在往届学姐的推荐下去选修这门课的,可能大部分人在大三上就已经修够了大部分的学分,因此这样一门需要编写代码,实际实现一个小的编译器的课程可能就不受同学们的青睐了。但是我要说的是,正是这些课程才是给你帮助最大的。

这门课是和编译原理开在同一学期,一般来说它是从学期的中期开始进行上课,貌似是第9周,可能主要考虑的就是让同学们先学习一些编译原理的理论知识,然后在实际上手。任课教师在我当时是李希萌老师,开发语言是 C 语言,开发工具无限制,分阶段与老师进行交流,展示自己的进度,这个不要怕,李老师不会责怪你,哪怕你进度慢,重要的是你要认真去做,不要放弃。

你能学到什么

我想主要有以下几点:

  • 实现一个小型编译器的成就感
  • 编译原理理论知识在代码中的具体体现
  • 简单数据结构的回顾(诸如链表)
  • 程序分析流的思想(下述)
  • 形式化验证的思想(下述)

前三点自不必说,什么是程序分析流的思想呢?在下面的应用场景中简单来说就是我们用程序去分析程序,发现程序中可以优化的空间,帮助编译器简化生成的代码,进而提高生成代码的执行效率。当然这里的内容都是理论知识,我们不需要具体去实现一个分析程序。重在体会这样的思想,这一点也是很多高校老师所看中的。

再者就是形式化验证的思想,众所周知首师大在全国形式化验证领域占据一席之地(当然这是我后面才知道的)。王瑞老师的团队就是做形式化验证的工作的,感兴趣的同学可以去跟老师交流,首师大的老师们都很和蔼可亲的,不要害怕。说回正题,什么是形式化验证呢?举个不是很恰当的例子:平时我们进行编程的语言,诸如 C 语言,它有自己的 BNF (上下文无关文法),我们用这种抽象的表述定义了这个语言。

然后根据文法规则,我们实现一个编译器来验证我们所写的程序,如果通过编译器这个抽象的模型检查,那么我们就认为我们的程序至少在语法层面是无任何 bug 的,反过来说,我们的任何 bug 都可以被编译器所找到。这整个的过程就是形式化验证的大致流程,我们通过抽象的数理逻辑定义,然后构造模型,分析程序,进而排除程序错误。目前国内也有很多高校的老师们在从事形式化验证的开发工作,例如西南交大就结合自己学校的特色将形式化验证开发的思路迁移到轨道交通程序上,从而构造出高可靠的程序,以确保安全。

你所学有什么用

这是我们每个人都会遇到的问题,就跟每天一日三餐一样稀疏平常。我们为什么要学编译器设计这门课程呢?特别是在我自己学分已经修够的情况下,学习这门课能带给你带来的其实远比我上述提到的多。拿我自己来说,我在学习这门课程的时候给自己增加了很多自己想实现的功能,首先我为程序写了自动化测试的脚本,然后我实现了一些额外的附加功能(诸如一次性查错等等)。

这些东西在我 9 月的预推免中起到了很大的作用,我一开始给北交的导师发邮件简述自己的工作,并附上了自己的个人项目地址链接。因为契合导师的研究方向,所以我很快得到了老师的认可并进入北交的复试,虽然最终因为一些原因没能拿到 offer,但是还是认识了一个聊的很投机的老师,我觉得也是一件不错的事。另外就是西南交大的老师,他的研究方向正好是形式化验证,因此我也给他发了邮件,由于我做过编译器,了解形式化验证的思想,所以很契合他的条件,我也侥幸进入复试并最终拿到了西南交大的 offer

从上面你可以看出来,假设我一开始没选择这门课,那么当我 9 月侥幸拿到保研名额,我也很难有机会去到其他高校就读,因为自己没能像大部分保研同学那样拿到了高校的夏令营优营。但是因为这些我实实在在完成的项目,我能向别人讲述我自己在其中的工作,我的亮点,我认为可以改进的地方等等。恰巧就是这些东西最终帮助了我,这也是我向各位推荐这门课的一个原因,因为它真正让我学到了很多知识。不管你保研还是考研甚至直接工作,我认为你积累的一点一滴都会无形中帮助到你。

怎么展示你的所学

作为一名计算机专业的学生,我很推荐各位尽早学会 Github 或者 Gitee 的使用并将自己认为不错的项目进行维护。同时参考别人的项目,逐步规范自己的一些风格。比如你最后实现了一个编译器你可以在 README 中简述自己的工作和设计思想并开源,这样你可以随时发给你联系的人看。他(她)也能第一时间看到你的工作。如果你有时间并且愿意折腾,那么我推荐你去搭建自己的博客,利用现有的博客框架也能很快的搭建好,这个貌似也不是太折腾。总而言之,不建议你放在本地,因为你总不能发一个压缩包给别人看(虽然也不是不行),但是貌似有更好的选择。


最后更新: June 2, 2023