published on
tags: tech pl

对长期纠结的PL和CC相关内容做一个小结 2013

回顾一下在编程语言和编译原理方面的各种纠结,没有什么记录,凭记忆写。

我从高中毕业开始使用C++,到现在挺多年了。语法是靠高中看数据结构的书看会的,后来到了大学里面喜欢泡图书馆,大一时靠读了不少C++的经典奠定的基础,像是Effective C++,Exceptional C++等系列,有蹭着和学软件工程的同学讨论项目,自己翻一翻设计模式什么的书,学会了一点怎么用C++写项目,算是我第一个用着很熟悉的语言了(之前用过VB Pascal,均仅限于学习写所要的程序的必要的知识部分)。

在大二的样子,出于学习算法的目的也要考虑编译方面的算法,于是在图书馆了翻了不少相关的书,诸如传说中的三件套:龙书,虎书,鲸书,当然还有一些其他的玩意。比较喜欢的是虎书,所以借过好几次,慢慢的读。看的是虎书的C语言版,不过这就是按照ML语言版改写过来的,对象都是申请了之后不考虑释放的,里面实现的语言的语法也是参考者ML来的。我从那里面学到了不少东西,而且第一次注意到写程序还可以使用immutable的数据结构。也喜欢上了ML的语法。

再后来因为自己写游戏的原因,学习了lua语言,反反复复的用,把大部分特性都搞的差不多明白了,后来干脆把源码也全部看了一遍。lua这条线的话,后来发现了LuaJit这样一个玩意,遂对Jit产生了兴趣,在网上找了一些paper和code看了一下,之后又读了intel和amd x86-64芯片的手册,可是最后还是没有自己去写一个。

因为经常和lua拿来放在一起讨论的Google所做的JavaScript引擎v8,所以其相应的代码也拖下来读了一些,结果学了不少C/C++中的宏的使用技巧。

另外在学校的图书馆里找到了一本转本讲垃圾收集的书,里面对各种方法的各种讨论让我大开眼界,每一种现在用的收集策略都讨论了各种优化方法。我才意识到,原来这东西有这么多人研究啊。后来在LuaJit的Wiki上也发现一篇讲gc的内容,看起来还在等人赞助他加进去。

之后因为看两大名作SICP和CSAPP的缘故,接触到了Scheme,当然这不是最早接触的Lisp,最开始是高中的时候开始学着用Emacs,那是就摸索着写了一点Emacs Lisp。所以用Scheme的时候没有什么语法不适应的障碍,反而看SICP学了不少函数式编程的知识,当时触动特别的大,因为是第一次直接的接触到函数式编程相关的内容。

后面因为黑客与画家的原因看过一点Common Lisp,实在是不喜欢就弃了。所以Lisp这条路线基本一直是喜欢scheme的。scheme这条线下来,先是发现了有continuation和cps这样的东西,但是靠网上依稀的资料不是很明白,直到后面看了EOPL和PLAI,自己写解释器,慢慢就搞明白了。看到Y-combinator,然后自己推导过后,也学会了。后面也专门看过用Scheme的实际项目:Lilypond,可惜量太大,实在没耐心分析到最后。宏是最后在Cousera上选了一门Programming Language的课,听讲义学的。我个人绝对是听觉型的学习者,特别喜欢听老师讲,但老师太难找了,还是不得不努力的看了不少书。

Scheme这边发展后后面,对于怎么实现函数式语言的优化编译器又产生了性质,还找了一些书和paper,讲怎么写函数式语言的编译器,或者诸如对于动态语言,怎么通过尽量的静态分析,可以消除大部分运行时的类型检查。

还有一条线是考虑学一点实用的语言,于是看了Python和Ruby,Python没怎么看书,就随便看看tutor,看看别人的程序,然后慢慢居然也用熟了,Ruby正儿八经看了影印版的The Ruby Programming Language,最后还是没记住多少,学语言果然还是靠多写。再想想看个速度快点的,于是学了Go,看了tutor,最后还是没怎么用。一般还是C++/Python使用最多。

再有一条线就是几度尝试Haskell,尝试着看了一些资料,Tutor或者书。觉得实在是一门麻烦的语言,平时用来解决一般的问题都要采用这样的思路没必要,故没能更近一步。

然后再回到C++吧,后来网上看过不少C++11的资料,然后看到了公开课cppgm,可惜知道的比较晚,人家已经开始了,看到其使用的材料的是C++的标准。想到自己从没看过C++的标准,于是网上搞了一份,不过一直没什么机会想起来把他看下去。

最后是最近在Coursera上搞了一门PL的课,认真学了一点ML的语法,复习了scheme/Racket,学会了在scheme中怎么写宏,然后又复习了一点ruby的语法,发现忘了不少。期间还有纠结在要不要去学scala,要不要自己再写一个新语言的编译器,啊这些恐怕要留待明年继续纠结了。

写完了之后总觉得还漏了些什么,诸如LLVM之类的,反正估计永远都难以写完整了,先这样好了。