实况:《编译原理》期末考试一天复习

大学的编译原理课程是讲解如何设计编译器的。我要做的,是在一学期没怎么听课的条件下,用我对算法的理解能力,和互联网以及身边同学的帮助,来在不足一天的时间中复习完考试所需的所有知识。

我手上有两份可用资料:

  1. 复习课上记录的,老师对考试知识点的回顾。
  2. 同学总结的,会考的算法的列表。

而现在的时间是晚上6:33,我刚刚看完大约四分之一,明天下午1:10就考试了。由于时间紧迫,我必须对自己的任务有个计划,不能浪费一点时间。这个计划会花去我大概半个小时的时间,但它是一定要做的,否则我一定复习不完。

考试涉及的有以下几部分知识:

  1. 编译各阶段功能,以及自展和移植的概念。
  2. 正规表达式,先消除左递归、提取左因子,然后构造成NFA、DFA、最简DFA的全过程。
  3. 构造文法的预测分析表、算符优先分析表、LR(0)项目集族、SLR分析表、LR(1)项目集族、规范LR(1)分析表的过程。
  4. 将语句翻译成三地址代码的方法。
  5. 将语句翻译成三地址代码过程中的优化。

鉴于考试的时间不多,我在算法弄懂之后,应该再过一遍,把会考到的部分熟记于心。否则,就算懂思路,考试也没有这么多时间让我去临场推导。

考试涉及的知识中,前两部分是我已经掌握的,第三部分我了解了大意,但再多的我手头并没有能让我快速掌握的教程,唯一的方法就是去让同学给我讲,可以快速弄明白。后两部分,是我今晚十点之前要看的,我必须把它们解决得七七八八,只留下一些疑问去问同学,否则时间将会不够。

我手头除了复习课的笔记,只有龙书。虽然很乱,但至少比老师那个更乱的PPT要强。因此我先去看书,配合复习课的笔记,看看可不可以对我有帮助。现在是6:48……

现在是6:59,我利用老师复习课的例子,基本搞懂了第四部分。其中的一些疑问,已经和之前的疑问一起记在纸上。这样,我现在应该去看第五部分了。

这过程中,我发现我必须尽可能地放弃书,才有可能看完。因此,我现在对资料使用的优先级是:复习课笔记 > 网上资料 > 脑中记忆 > PPT > 龙书,从资料中提取能迅速帮助我理解的部分,帮我快速学习概念的含义。

我现在复习地点是咖啡馆,旁边有同学打牌。这种时候,身边人的行为无疑会使你分心,你应当做的,就是专心于自己的事情,不要放弃。

这里很多概念需要了解,首先看到的是流图。网上教程没有图,因此去翻PPT。

运气很好,PPT中对此有简洁的演示,很容易懂。现在是7:14,我看懂了基本块和流图的概念,效率不错,继续看概念。

现在是7:25,我正在看基本块的dag构造。这时我有些分神,想起了上课的一些场景。在你看书看得很顺畅的时候,你容易感到轻松,并且容易分神。这时候,要保持自己的专心,因为你还没完成任务,只是看到了比较容易的部分而已。

现在是7:48,我正在看控制流和数据流分析。我感到有些乱,这时候应该理一理自己都看了哪些知识点,都有哪些需要记。切忌感到有些混乱的时候继续往下看,这样不一会儿你就会看不下去,从而感到无比沮丧,前面看的也忘了,只能从头看起。回头理清楚,你会发现只花了几分钟,而且思路瞬间清晰了。

我多花了点时间,从头整理了一遍,花了20分钟。不过很值得,我发现我对所有知识点的掌握情况已经了然于胸,并且很容易能看出接下来应该从哪儿看起。保持高效复习的一个诀窍,就是保持自己思路的自由和灵活,不断解决冒出的一个个小困难,这样你就会很快发现自己很厉害,并且获得巨大的信心。

我发现我把PPT看完了,但还有一些概念没有找到解释。OK,下面我选择先去网上查相关概念,先不看书。之所以这样,是因为书太罗嗦,现在看书会把我清晰的思路弄乱,而清晰的思路是高效工作时必不可少的条件。

好吧,运气不好……网上这方面的资料没有能看的。这样的话,我自己的复习只能到此为止了。下面,我要积极联系我的两位复习得差不多的同学,请求他们的帮助。我已经弄懂了几乎所有概念和大部分算法,只需要让他们给我讲几个算法、帮我纠正对几个算法的细节理解,然后我再理一遍思路,今天的复习就可以结束了。然后,明天上午再过一遍,复习就完成了。

好了,联系他们的时候,自己休息一下~

情况很乐观,A同学正好有时间,可以给我讲讲;B同学今晚有事,所以只能有问题留言,等他回我了。A同学一会儿就来,那我现在就先自己理理思路,想想他来了之后怎么问。

呼,要睡觉了。现在是12:39,我刚刚从A同学的宿舍回来。我们从咖啡馆复习到寝室,除了刚回寝室的时候我用一刻钟整理了一下程序设计语言的作业交上去,剩下的时间都在复习。所有的知识点已经都解决了,只是不知道会忘多少。

毫无疑问,现在是要睡觉了。等明天起床,再把该看的看一遍吧。明天还要交算法作业,所以起床先写算法作业,然后等十点课上交了作业,再开始复习编译原理。

其实这时候并不觉得困,但务必记住,在这种转天还要高强度工作的时候,一定要让自己去睡觉。不说了,睡觉。

现在是8:53,我刚刚洗了头、洗了脚,现在有些饿。我在想我要不要吃早饭。我一会儿需要先把算法作业写了,然后再去看编译原理。手头没有算法作业本,得,去东上院小卖部吧,买个本再来俩汉堡,然后去空教室自习去。

教师人还不多,挺好。右前方还有个妹子,看背影挺好看的,不过现在不是欣赏女孩的时候,戴上耳机,专心做算法。对了,坐女孩子附近有个好处,突然发现自己没带餐巾纸的时候可以借一张^_^

11:01,我交了算法作业,自己找了间清静的教室。放上许嵩的歌曲,开始最后的复习。

看到了分析表,虽然昨天我们一致认为,应该自己手推一遍,但现在时间已经不够了。那么,按照我的思路,去理解吧。最后这一遍,把算法的思路都理解了,记在心里,至于细节就去临场发挥吧。加油!

(忙碌中,暂无直播……)

呼,交卷啦~

现在是2:39,离考试结束还有半小时。照例,依旧是我交卷之前没人交卷……其实根本不是大家没做完,只是喜欢一次性做完不检查的极少罢了。

考试之前,从算法课离开之后,我把所有的算法思路都过了一遍,正好下课,和女朋友一起吃饭去了。吃饭聊聊天,完事儿回寝室拿伞(发现伞没在寝室,不知道忘哪儿了-_-#),就去考场了,那时候离考试还有半小时。我把之前复习的最后一点疑问找A同学问了,然后就趴桌子上休息去了。

然后就是发卷、答卷、交卷、离场,一气呵成,没遇到什么意外。分数的话,我觉得会扣几分,能不能上90看运气。

好啦,看看自己的一天复习记录,还挺有成就感的。下面就是在4点之前手写完《政府与市场》的论文,这段就不直播了。

 


在直播的最后,我要吐槽一下我们编译原理这门课:这门课质量真的不高,从它能让我用一天复习完就可见一斑了。

编译领域,研究的是编译器如何将高级语言编译成机器码的全过程。具体来说,首先把源代码预处理,分析成抽象语法树,然后再对它详细分析,开始编译器的正式工作:分析程序结构、数据流,看看哪里可以优化什么的,最终生成机器码。

显然,这过程中,如何分析程序结构和优化才是重点,而前面的预处理(语法分析)根本就是铺垫罢了,因语言而异。那么,我喜欢的编译原理课程,应该是主讲这些重点的。那样讲完,我们怎么也能写个简单的编译器后端了。

可惜,天不遂人愿。我们的教材是龙书,老师的思路也和龙书相同。看过的都知道,龙书主讲编译器前端和表层的后端。于是,我们考试考了很多基础知识,最难的题就是做个LR(1)分析表了。可老师只讲怎么做表,根本不讲表怎么用。所以,我才能一天复习完,也才能发现课都上完了,自己除了知道些名次之外,还是什么都写不出来。

当然,和这门课配套的还有一门编译原理实践课。可那门课也并不让我喜欢(幸好我没选,不过我去听了,所以知道她让做什么),只让做编译器前端中最基础的部分而已,后端一丁点都没涉及。还鼓励我们用现有的工具,不爽。

与这门课形成鲜明对比的,就是我们的《程序设计语言》课程。这门课的老师非常好,有水平,讲得也很棒(还是中文老师纯英文授课,口语也纯正,让我英语听力和口语提高了不少~)。这是我这学期唯一一门认真听的课程了,每节课都好好听,期末也很认真地复习。要是每门必修课都这样就好了!(《程序设计语言》是限选课……)

好了,3:01了,我要去抄《政府与市场》的2K字读后感了。明明之前没说非得手写,我都电子版写好了,还打印好了,结果上节课临时变卦让手写了,这老师真是蛋疼!

不说了,本次直播结束~

posted on 2015-11-12 16:27  IceDream61  阅读(5197)  评论(5编辑  收藏  举报

导航