LISP的过去和现在

呵呵,题目大了点。其实我只想说点小小的瞬间感受。

休假的感觉真好,可以在家里悠闲地读书。今天一口气读了大半 Paul Graham 的书 Hackers & Painters。读Paul的文章总是一种享受,几个小时不知不觉就过了。放下书的时候,仿佛一场让人迷醉的音乐剧戛然而止,而自己还沉侵当中,过了好一会儿才慢慢回到现实。我不一定同意书里的观点,但Paul的确是写文章的一流高手,总是激情洋溢,同时周详有力地论证他的观点。Paul的网站上登了书里 大部分文章,有兴趣地可以去看看。书的第13章, Revenge of the Nerds,提到了LISP诞生的历史,原来那也是一段精彩传奇:最早LISP是John McCarthy搞出的一套计算模型(当然,λ-calculus还是Alonso Church搞出来的),用来替代繁复的图灵机。用TM做过推导的同学就知道用TM还是相当不容易的哈。只不过McCarthy的学生Steve Russel突然发现把这个理论里的eval算子翻译成机器语言(当时他们能用的就是IBM 704爷爷机了),LISP就有一个解释器。当时连McCarthy都觉得这个想法不可思议,对Steve说,老大,你把把理论和实践混淆了哈。不过Steve还是用机器语言写出了eval。于是世界上第一个LISP解释器诞生了。直到现在,越流行的语言吸收的LISP元素越多,比如python,比如ruby。LISP直到现在仍然被众多牛人推崇。当年LISP有9大创新,50年后,深刻影响了编程语言的进程。可见一个完善的理论被适当地应用,可以变得多么强大,焕发多么夺目的生机:
1. 条件语句。当初的语言是没有if else的,goto统治世界。
2. 函数类型。函数成了语言里的类型,可以被变量指代,可以被当成参数传来传去(的一类公民的必要条件,参考SICP第一章)。这一条可以极大简化编程,让我们写出非常漂亮的程序。所以现在的流行语言纷纷加入了这个特性(可惜Java没有)。
3. 递归。这个不用说了吧。
4. 动态类型。smalltalk, python, ruby。。。连C#也有一个类似的var了。
5. 垃圾收集。不要以为GC是Smalltalk的发明哈,更不是Java的。
6. 基于表达式的编程。任何表达式都可以成为另一个表达式的一部分。不像很多语言,把表达和陈述分开。
7. 符号类型。这个在python和ruby里被采用,广受欢迎。
8. 代码即解析树。这个让LISP能方便地定义新的句法,操作程序本身,编写元程序,生成真正意义上的宏。
9. 语言无时不在。代码运行/解析可以在任何时候发生。这点和8.配合可以让语言的扩展和交流变得非常容易。

你可能感兴趣的:(开发,阅读流水帐,计算机科学,八卦,杂感)