函数式语言介绍
通常要学习新的编程语言,我一般遵循一下原则进行筛选:
????????? 1. 能带来思想的革新,如果一门语言与自己已经掌握的语言有太大重叠甚至是一个体系的,没有学习的价值。目前编程语言我认为大体就是三类:命令式(别跟我说面向对象,它只不过是命令式的包装),函数式,逻辑式。
???????? 命令式的语言相信很多人都学了一把了,C,C++,Java,C#,我就较系统的学了这一把,其他浅尝辄止的语言就不提了。函数式以前摸过Scheme后就再也没派上用场,逻辑式似乎只有一种Prolog,我记得还专门买过清华的一本烂书《人工智能(AI)编程语言(面向对象语言)》,全部翻译的是Visual Prolog官网的资料,词不达意还残缺不全,顺序混乱,而且那个Visual Prolog个人版每次编译都跳出烦人的对话框,界面丑陋,令人失望。目前函数式编程理论成熟,逻辑式编程理论似乎有缺陷,而且工业上那一吨的专家系统都是Common Lisp写的(注意,我可没有提Scheme),而且Common Lisp在人工智能领域外也大有作为,有很多成功的商业案例,Prolog就似乎只能在人工智能这一角混了。
????????? 再加上《程序员》杂志上说的函数式在并发方面的好处,以及函数式语言一般抽象能力很强,正好用来写写人工智能的东东,于是我决定重新学习一门函数式语言了。
????????? 2. 语言要有一个大的社区,最好已经经过了ANSI 或ISO标准化。这样优势很明显,社区大,就人多,人多就力量大。有标准,劲都往一处使,就会有一吨的库出来供你用。这一原则对于较新的语言不适用,更别提标准了,通过了标准的都不是新技术新思想了。不过可以从tiobe的排名上大致看出某个语言的社区规模,免得学了某个语言后才发现找不到编译器。
???????????? 最早的函数式语言当然是Lisp,现在有两个分支:Common lisp 和Scheme。Common lisp 是一个庞大的语言,支持多种编程范式,Scheme是Common lisp的子集,二者都是ANSI标准。Scheme 由于语言核心很小,多用在教育领域,Common Lisp多用来写专家系统,也可以构造大型软件。
???????? 最纯的函数式语言是Haskell,完全没有副作用,有一个Hakell98标准,但还不是ANSI或ISO标准,算是一个社区标准吧。
???????? ML也是一种跟Lisp差不多老的语言,现在有Standard ML,Caml和微软的F#三个常见变种。
???????? Lisp 和Scheme 在tiobe的排名还不错,又老又壮,ML 和Haskell比 Lisp家族都要年轻,用的人明显少了很多,社区也比较小。erlang和ocaml排名都很后。
????????? 3. 是否有好的开发环境。虽然新语言一般都不具备这一点,但如果有一个好的IDE,会觉得正式很多,学起来也有底气。
????????? Common Lisp 有个LispWorks 个人版(40多M)还可以称得上是IDE,但有很多限制,还有个Cusp的eclipse 插件。Scheme最好的估计是PLT Scheme(12M多)了,连语法高亮都没有,还有个SchemeWay的Eclipse插件,也有个Netbeans插件,都很简陋。Haskell有个免费的VisualHeskell的Visual studio(60多M)的插件,很不错,至于简陋的编辑器一大把,也有个eclipseFP的eclipse插件。
????????? 4. 是否有相关资料和出版的书籍。新语言一般没有很多书,但至少得有一两本吧,否则就显得太势单力薄了。
?????????? 在amazon上搜索了一下,Haskell 有一本2007年新出的《Programming in Haskell》,Common Lisp只有2005年的书, Scheme只有2003年的书,OCaml有一本2006年11月出的《Practical OCaml》,最后是F#有2007年新出版的两本书《Foundations of F#》和《Expert F#》,erlang今年也有新书。
????????????????????????????
???????经过在tiobe和amzon的形势分析,有这几个候选:Common Lisp ,Haskell,OCaml,erlang。
???????Common Lisp,Ocaml,erlang都是多范式的,都支持命令式,面向对象和函数方式。如果函数式语言支持这三种编程范式,我还不如用已经熟悉的Ruby呢,社区比上面三个至少大一个数量级。只有Haskell是纯FP语言,号称是最优雅的FP语言。对了,在ICFP上Haskell还是2004,2005,2006连续三年的冠军。
???????? Haskell 能强迫你用函数式编程,用其他语言你不知不决就会用命令式的习惯来编程。Haskell在第一条和第三条占优势,在第二条大大输给Common Lisp(lisp毕竟是最早的函数式语言,历史悠久,又经过标准化,不过我现在就是要学新思想嘛,可以不介意),第四条跟Common Lisp平手。Oaml ,erlang在第一条和第三条跟Common Lisp平手,第四条略有优势,因为都有新书,第二条就大大劣势了,基本上败的很惨。第一条是最重要的,因为毕竟是新技术,后三条只是用于参考。理所当然我选择了Haskell。
?????? 《程序语言设计--实践之路》里 有一句多函数式编程的总结和展望:“看来在未来的年代里,我们很可能看到函数式语言使用的显著增长,特别是纯函数式语言”。
???????纯函数式语言现在看来只有Haskell,看来是不得不学它了。