2005年11月22日星期二

难得的闲暇

今天中午去修自行车。在那里等师傅修的时候,一个人坐在那里,看着那个湖面,那些小草,那个碧蓝的天空,吹着小风,突然想到,现在这样什么都不用去思考、什么都不用去顾虑、完全无所事事的闲暇已经那么得少了。

修车师傅的小孩在那里玩着轮胎,看着他,我想到自己小的时候也是那样,做着现在觉得幼稚无比的事,却能从中找到无比的乐趣,相比起来,现在的我活得真的太累了。再想想以后大学毕业了,需要整天为生活而奔波的日子,似乎小时候的那种闲暇可能只能等到老来才有可能重拾了。说实话,现在的我,确实无法控制自己在有空的时候不去思考计算机的问题,思考生活的问题,我也早已有些厌烦了。

现在,对老人们可能又有了一些新的认识吧,他们走过了几十年的人生道路,经历了各种各样的是非,在老了有机会的时候,选择了自己认为最适合、最喜欢的生活方式,消磨人生的最后时光。好吗?令人羡慕吗?不好吗?不令人羡慕吗?

托福也考完了,虽然感觉作文考砸了,但心底深处还是隐隐约约有一点成就感的,毕竟,自己的英语水平也由此提高了一些。

2005年11月17日星期四

最近的情况

总的来说,虽然没有什么大的变化,但我觉得现在的我总是在逃避,总是告诉自己不喜欢就不要去做,以至于现在的生活变得非常单调和形式化。我不知道这是不是大三学生应该有的特点,至少,我不喜欢这样。

似乎越来越受到广东这个大环境里面的一些思想的影响,虽然这些思想我认为无可厚非,但我个人不喜欢它们。现在,思考自己的时间越来越少了,更多的实在考虑更实际、更世俗的东西。上个星期花了两天去买了一辆破自行车,这周又努力复习托福,可能下周又是泡在宿舍里搞 Linux。这一切我为的是什么?为的就是尽量少去想那些不愿触动的东西,就好像刚失恋或者刚死了亲人的人总是拼命地工作一样。我从来没想过我会变成这样,我也不希望自己变成这样,但看来,人还是很容易受影响的。

现在听音乐更加专注于那几首曲子,巴赫的 BWV 1057(第六钢协?),布鲁克纳第七交响,还有拉赫玛尼诺夫第三钢协。管很久没练过了,给自己找的理由是等托福考完再说。现在想起来,大一那时虽然是最傻的,但也是这么几年里活的最轻松最快乐的,不是学习任务或者其他的什么少,而是心理的压力最少,幻想破灭地最少,也最像高中时那个纯洁的自己。

可能人确实不得不随着年龄增大而改变。但愿这是“不得不”的吧。

2005年11月4日星期五

上帝的惩罚?

看来星期二的疯狂工作导致了到今天还在持续的头昏脑涨,脑部缺血。一整天人昏昏沉沉没精神,偏偏又没有任何其他的症状。今天从医院回来的路上,突然想到,这可能是上帝的惩罚。

对于每个人来说,时间都是相同多的,但每个人完成的事却不一样多。努力的人,聪明的人,在相同的时间能就能做很多事。然而,上帝是公平的。你不能超越别人太多,他不能容许这种极端的不公平出现。天才很少会遗传,天才也很少会长寿,否则,大多数的人就没有什么存在的价值了。上帝是公平的。

我想起了父亲,也是年轻的时候很刻苦,很努力,做到了绝大多数人无法想象的事。正打算在 30 岁以后大干一场,成就一番事业,上帝却看不过了。他或许是太努力了,把他的天才使用得太过度了,上帝告诉他:“凭什么你要在这么短的时间里面完成那么多事?既然这样,我就得让你生病,让你不能再做出成绩,直到你赎清了你的债。”无奈,他是太刻苦、太天才了,直到死的那一天都还不完。

我得出的结论是,上帝可能不公平(否则,他干嘛又麻麻烦烦要造出那么多天才来?大家一个样不更好?),父亲可能的确是寿终正寝,但有两件事是要记住的:一、什么事都要慢慢来,切不可急躁;二、每操作计算机一个小时,就要起来活动一下,疏络经骨,否则搞计算机这一行,短命。

2005年11月1日星期二

完成中间代码生成

最晚突发灵感,一口气写代码生成写到凌晨 5 点。睡了一觉,逃了一天课,下午又接着写,终于完成了这个 "Simple Compiler"。说实话,写这个编译器花的时间最多的不在代码生成,但确实感到代码生成的技术含量是最高的,也难怪每一本讲编译的书在代码生成上的章节是最长的。想想 2 个月前的暑假时还认为写编译器是一项不可能在短时间完成的任务,而现在基本上对编译器的流程有了一个大致的了解和实践,真的还是应了那句老话:“没有什么是学不会的。”

这个编译器,词法分析方面主要参照了《编译原理与实践》(Compiler Construction Principles and Practice) 里的那个 TINY Compiler 处理方法和技巧,构造 DFA,分状态处理输入字符。语法分析就是纯正的 LL(1)。

语义分析和中间代码生成这个阶段就不像前两个阶段那样有一个公式可以套。可以说,每个语言都有不同的、属于自己的分析方法,所以这个部分我更多的参照了教科书里面的方法。虽然说先根据语法分析的结果生成语法树,再根据语法树生成代码会简单一些,但这样会增加代码,降低效率,而且在某些情况下不适用,同时因为我的语法分析是 LL(1),所以我还是选择在不改变语法的情况下直接在语法分析中间添加语义分析的代码。

具体技术上,主要是使用“回填”技术。为了解决如何延后修改已经生成的代码的问题,我设立了一个四元式的数组,把生成的中间代码写进去,在 backpatch 函数中修改相应四元式。在分析完了所有程序后,用 emit 函数将四元式输出到控制台上。

其实,虽然感觉在实际编写代码上的时间并不是很多,但平时一直都在看关于编译的书,也正是有这些积累,才能够有比较清晰的思路来完成它。还要感谢那些前辈们宝贵的智慧和经验,没有他们,编译还是 Mission Impossible。

《编译原理》,Compilers: Principles, Techniques, and Tools,龙书
《编译原理与实践》,Compiler Construction Principles and Practice
《可变目标C编译器——设计与实现》,A Retargetable C Compiler: Design and Implementation,lcc
《编译器构造:C语言描述》,Crafting a compiler with C