Legend Since 1984
Cruising between Fantasy and Reality...

Saturday, June 10, 2006

Why not make a compiler yourself

时间是凌晨3点05分,还有30个小时就是编译原理考试了。复习还处在攻坚阶段,而现在的我,却为自己的一个想法激动得难以入眠。

编译原理课程的5个实验我都是一步步兢兢业业走过来的,通过这五个实验,一套简单的编译器前端已经初具雏形。这个前端接受三个输入文件:文法产生式集合、关键字集合、待翻译原程序,输出了翻译后的四元式。

我自己最为满意的部分就是语法分析表的自动构建。不管是采用哪种语法分析策略(自顶向下、自底向上),我都费了很大的功夫在分析表的自动构建上面。现在看来,这笔投入是相当划算的。有了分析表的自动构建,我可以随意修改输入语言的文法构成而不必重新手工计算修改后语言的分析表(这是一个相当大计算量的工作,如果人脑完成的话)。在作语义分析的时候,为了验证我设计的翻译方案和属性的存放方法,通常是采用一个非常简单的文法来进行验证。有了前面工作的基础,在更换文法的时候,我要做的仅仅是替换那三个编译前端接受的输入文件——文法产生式集合、关键字集合、待翻译原程序;在配以相应的语义动作处理函数重新编译,我的前段就可以正常工作了。(实际上,如果不做语义分析的话,甚至连程序都不用重新编译就可以直接运行)。尤其是在采用自顶向下的语义分析时,属性的存放方式经历了较大的变化,每次变化都先采用一个简单的“计算器”文法进行了验证。还有后来对原文法进行了修改,使之改成了类C语言的定义规则,还加入了控制循环的break、continue语句的实现。这些改变都没有对原来程序的语法分析部分作任何的修改。

以下两图是两种分析策略分别的结构图。尽管他们采用的方法有所差异,但是最终的输出都是一致的——未经过优化的标准四元式及程序内部符号表。



图表 1:自底向上分析器的整体结构


图表 2:自顶向下分析器的整体结构

这是课程设计的终点,也许绝大多数人到了这里也就停下了。但是我想做得更多!前面的工作已经有了很好的开端——功能上我已经实现了分析表的自动构造,实现上我也没松懈:首先是采用面向对象从数据结构入手模块化的设计思想,每个类完成特定的功能、封装内部数据成员、依靠函数接口对外提供服务;各模块内聚性高,添加功能容易;编程语言采用最高效的C++而不是Java或者C#等使用方便但效率低下的基于虚拟机的语言;采用STL作为容器的实现,既高效又节省了大量精力;后期在实现上也作了一些优化,能用简单数据类型的地方尽量不用复杂的容器类,利用C++的异常来处理产生的编译错误,代码中使用宏来力求简洁,多次重构力求代码扼要而优雅;……

这些基础都是对后续工作的铺垫。我的梦想是完成一个完整的编译器,至少能输出通用格式的汇编代码。虽说从四元式到汇编只有一步之遥,但要想做到功能的完整还有很多难关需要攻克。最艰巨的要数支持函数调用。仅仅这一个名词下就包含的很多东西:运行时环境、活动记录、参数传递、局部变量与全局变量的访问、函数返回等。其他的还有对数组的支持、汇编代码的格式。初拟的一份TO DO List如下:

表格 1:Compiler DIY 's TO DO List

功能描述相关概念/说明
函数调用运行时环境、活动记录、参数传递、局部变量与全局变量的访问、函数返回
数组是否使用指针的形式、相应的翻译方案
更多数据类型指针、结构体、数组、浮点数
浮点数词法分析器
符号表的扩充内情向量、相对地址
非终结符的扩充把原先采用单个大小写字符作为非终结符的方式改为以一个字符串来标示
输出汇编格式Windows下:cl /Fa(VC++)、Linux下gcc –S(gcc)
标准IO可能需要用汇编编写、或者连接现成的库函数
错误处理忽略错误继续编译

如果能全部完成以上功能也就是一个较为完整的编译器成品了,但是我很明白这不是一个短期内可以完成的任务。明白前方的障碍才是前进的基石。也许,我可以申请把它作为毕业设计来完成吧。

一直以来,编译器就是令我感到神秘而向往的东西。如今,一个自己独立实现的编译器已经不再那么遥不可及了。什么才是计算机科学的基石?不管现在各种流行技术怎么发展,试问哪门语言的运行离得开后台编译器的支持?Java,PHP,C#,Perl,JSP?如果说操作系统是连接计算机硬件和软件的桥梁,那么编译器就是沟通操作系统与高级语言的纽带;如果把操作系统比作谁与争锋的倚天剑,那么编译器绝对是号令江湖的屠龙刀!

现在回到床上,在梦中给我未来的编译器想个诱人的名字才是当前最重要的~~~Zzzzz

Labels: ,

Tuesday, January 17, 2006

Dilemma

Dilemma n.进退两难的局面, 困难的选择 ——摘自iciba.net

面对今年的GRE和嵌入式设计大赛,想必这个词是最能代表我此刻心情的了。

原本应该在暑假期间进行的嵌入式设计大赛这次居然提前到6月底截止,着实令我吃了一惊。以前的打算是05年春季学期全面准备GRE考试,嵌入式比赛可以放到暑假集中进行开发。现在看来二者是不可避免地冲突了。

按照Cliff的意见,这次比赛难度相当地大,既然要参加,就要100%地投入。这一点我非常清楚。比赛不光是我自己的,还涉及到同组的两个队友以及俱乐部和学院的利益。如果我不放弃GRE(3月份考作文,6月笔试),全身心投入是肯定不可能的。

期末的时候还想抱点侥幸心理,心想两边都参加,争取都不耽误。昨晚跟Cliff说明情况,他认为这样是不允许的。其中的道理我很明白。毕竟每个人有自己利益的出发点,即使从我自身来看,脚踏两条船的做法也是非常不理智的。首先,同时开展两项截然不同的工作,势必分散精力,到时候可能任何一方都不能顺利的进展下去;其次,作为项目负责人,这么做也是对同组队友的不负责任,对老师信任的辜负。如果因为我的分心导致比赛的失败或者没有达到预计的期望,无论对谁都是无法交代的。

在GRE和嵌入式比赛必须割爱其一的前提下,what my option will be?

如果放弃6G,报名费倒是小事,关键是这样就相当于放弃了本科出国这条路,这是我无论如何也不愿意接受的。既然10T都考出了较为满意的成绩,放弃了岂不太可惜?后来和豆豆(if I may?) 又讨论了一下,觉得她说得蛮有道理得:“如果你要锁定一个目标就不要分心,同时要低得住外界的诱惑,越是能力强的人越要能够权衡取舍。”“但关键是哪个离你的目标更近更直接 我觉得电子大赛要是耽误你申请和平时学习时间的话……倒是离你的直接目标比较远。”Very convincing! 既然坚定了出国这条路,就应该看准目标,不要流连于路边的风景。

相比起来放弃嵌入式比赛所带来的损失会小很多。当初为什么希望参加,除了纯粹的兴趣,还有希望在大学阶段能有一个真正属于自己的完整的Project(Proxy Adapter参与太少,不算),更重要的一点也许看重竞赛获奖带来的加分。豆豆说:“那个比赛是很好的锻炼机会 但是你要想一下成功的机率有多大 就是拿到奖的几率 同时你在相同的时间内考到GRE高分的可能性会更大。”Cliff也是这么建议的。同时,下学期课程对GPA的高低也是至关重要的。按Cliff的意思,为了比赛还得放弃一些学习,对此我一直持保留意见。

废话了这么多,结论已经self-evident了。同寝哥们的一句话给我印象很深:“当所有机会都向你敞开大门时,你唯一要做的就是学会放弃。”

Finally, the dilemma becomes an alternative. Hope that after a whole year I won't be sorry for the option I made this time.

Labels:

Tuesday, November 29, 2005

The Way Abroad

出国之路的第一步——TOEFL,终于完结了。
今天中午回到寝室,居然有一封信,还是黑龙江大学国外考试中心寄过来的。脑中电光一闪,哎呀,TOEFL成绩寄过来了!
本来还以为12月中旬才拿得到成绩,不想来得这么快,一点心理准备都没有。怀着忐忑不安的心情拆开了信封,晕,信封里面居然还有一个小信封。白色的小信封上ETS的标志十分显眼。剪开封口的时候手都在抖个不停。God help me get through this.
废话不多说了。总分637,听力、语法、阅读分别是63、68、60,写作4.5。满足了满足了,看到这个分数,我嘴里一直不停地念念有词。回想起准备TOEFL的那段日子,不免感慨良多,有种热泪盈眶的冲动。
暑假在北京的10多天里,早上不到7:00就得起床,坐小Bus,转轻轨到五道口,再步行4、5里路到新东方总部。中午加上吃饭只能休息50分钟。下午2:30在原路返回。到亲戚家再洗完澡差不多4点了。马上把今天课堂上讲解的东西再看一遍,还要背单词,很快就到11:00。那段日子里睡眠是特别的好,每天步行10里路是功不可没的。
十一期间是完全泡在准备TOEFL上面了。每天一套完整的TOEFL题,到第五天都崩溃了,看见英语就想吐。对考试的患得患失也是我一度十分郁闷。
还好我有那么多善解人意的同学和朋友。当我郁闷的时候,来自他们鼓励的短信总能使我重新燃起自信的火焰、点亮我前进的方向。尤其在10月14日最后一天晚上,收到了那么多祝福,难以忘怀! 还要致谢IBM俱乐部Proxygroup开发小组全体成员,感谢你们的理解和宽容。
637,没有辜负你们的期望。虽然辛苦,但是值得。在出国的道路上,我已勇敢的迈完了第一步……

Labels: ,

Saturday, November 26, 2005

3年后的一封信

3年后自己会在哪里?
或者说三年后还能回想起现在的状况吗?
在胡子的blog上发现这样一个网站,帮你把书信放入“胶囊”中,若干年后再寄给你。
最长的期限竟然能选20年,对这么长的时间我没有信心。3年是一个可以接受的分水岭。

3年后的我,会在太平洋彼岸收的自己此时的capsule吗?

http://forbes.codefix.net/capsule/

Labels: ,