Thursday, November 29, 2007

iveney学CS历险记之《编译原理》

刚才有个UST的朋友问我某个project怎么做,不得已就把compiler的东西又在脑海中翻了一遍。
考虑到刚考完没多久,还有印象,就顺便写写吧。

课本:编译程序设计原理,北大
经典教材:龙书 虎书 鲸书,还有本《编译原理及实践》(有个TINY实例的)也很不错

记得以前看文章介绍说,本来编译原理是cs为数不多的几门core course之一,但是由于目前其理论和实践都已经发展到很完美的阶段了,也就被剔出了acm还是什么的订的cs curriculum(不担保以上断言的真实性……)
事实上,我觉得这门课还是很有必要上的,不然我们就成了知其然而不知其所以然的民工。从我们刚刚接触程序设计时,我相信大家就经常遇到书本上说,"程序运行时xxxx","内存中xxxx",等等。我当时就一直在想,为什么会这样呢?为什么不是那样呢?而这些问题在"程序结构与组织"、"运行时刻环境","运行存储管理"等章节中有介绍。下次我们遇到BT的一些++--的问题,就可以大胆地说compiler-dependent了。

正如Leeman在这门课的outline中所说,我们学习应该是这样一个顺序:
入门:programming fundamental
进阶:compiler construction
大师:the principle of programming language

而编译原理是位于中间的,可见其重要性。
上次在科大时就曾经跟老师讨论过说为什么那里没有这门课程,他们说没有老师精通就没开了……但是奇怪的是有一门the principle of programming language,而且老师都是UC Berkeley和Standford出来的大牛,不会教不了compiler吧……这个学期有个师弟去那边交换选了这门课,看了看介绍,发觉貌似是编译原理与程序设计语言原理的压缩体,两者都讲了。
其实分类也不必这么拘泥,学到东西就好了。

还记得Prof. Jun Zhang在数值计算课程中所说,"我们整个学期所学的东西归纳下来就是这个流程图"。在编译原理这门课中,我觉得我们也是围绕着CS dept@SYSU所采用多年的那本北大的《编译程序设计原理》中那幅编译过程的流程图来展开的。
不过我们课程的着重点貌似在词法分析,语法分析和语义分析中,而后续的中间代码生成,代码优化,代码生成则比较简略。

词法分析比较简单,其中的有限自动机理论非常奇妙与好玩。不能不说的就是正则表达式,实在是one of the most powerful tools,强烈有朝一日可以精通之……
语法分析有点难度,我反反复复看了好多遍,每次都有很多收获。两大类分析法又可再细分之,各种分析法优劣参半。
语法指导定义与翻译模式则是让语言按你的想法工作的重点,解释了符合语法的语句应该执行什么动作。
运行时刻环境则可以让人对程序在内存中的组织有了深入的了解,以及过程调用,参数传递,符号表等的组织也能得到认识。
后面的几章没有重点学习……就不说了……
可以学的还有很多,比如一些类、重载、多态的实现,以及函数式语言,解释器的构造都值得深入了解。

Leeman:"编译原理是理论与实践的完美结合",在这里得到了完美的体现。
FA理论应用于regular expression以及词法分析器,LR分析法的正规化使得编译程序的自动生成成为可能。

关于项目:
我们的项目分为五步,分别是:
0.给出类似TINY语言的语法(参考《编译原理及实践》),给出两个错误与正确的src
1.手工写lexer
2.用JFlex写lexer
3.用JavaCUP自动生成parser
4.用top-down方法写parser

有3个加分实验,
1.从正则表达式构造有限自动机的方法研究(报告形式)
2.正则表达式匹配器(考察有限自动机、LR分析法)
3.计算器(考察算符分析法)

都非常有趣~可惜我能力有限,遇到很多难题,基本上都是向吴毅大牛咨询的,在此谢过 m(_ _)m
仍然记得第二个加分实验用了我整个星期而大牛一晚就解决了,差距阿差距……
顺带赞美Java的Exception handling,真的是非常方便与强大,为编写代码带来了很大帮助。

由于特殊原因,没能上成Leeman的课,是暑假自学然后参加缓考的,希望大四下学期能有时间去听听课。
最后,我想说,这是一门古老而经典的课程,赞美。

No comments: