我记得刚接触计算机的时候,我就受到了两个非常巨大的错误观念的影响,这个观念最初是来自于老师的传授还是学长的教诲已经记不清了,但是直到我工作几年以后,才慢慢有了实际的体会:
- 学习和使用什么编程语言不重要,重要的是算法和设计;
- 程序员学习的精髓是面向对象的设计模式,掌握以后,一通百通。
简直就是是胡扯啊。也许在某个极其狭隘的上下文中还能这样说,但是泛泛而谈,这样的态度无疑是误人子弟的。
就说第一条,编程语言不但重要,而且太重要了。换句话说,学习一门新的编程语言,可能学习的是背后的范型和思考问题的方式。如果这个部分能带来新的东西,那就是值得花时间投入的。
可能很多人和我的背景一样,熟悉 Java 和 JavaScript,一门是经典的静态语言,一门是经典的动态语言。有人说相较而言,搞 C++背景的人算法和数据结构基础更加扎实;而起初搞 Java 背景的人可能设计方面懂的多一点,但是水货更多;而说起 JavaScript,就似乎更 “低廉” 了,虽说学好太难,但入门门槛超低。于是针对像我这样背景的工程师,我打算用类比 Java 和 JavaScript 的方式写一些新的编程语言的学习笔记,因为在我看来,用 “类比” 的方式是学习印象深刻,而且容易更容易理解的有效方式。以前也用类似的方式写过一些新技术的学习笔记,比如 《GWT 初体验》。但是通常要学习一门新的编程语言,尤其是从未熟悉的一个新的编程范型,学习曲线要比这个高得多。在我的脑海里有这样一个清单,记载了最想接触和熟悉的编程语言,这个清单最首要就包括:
- Groovy。学习 Groovy 就是奔着 “动态语言” 去的,而动态语言,就是奔着 “元编程” 去的。“动态”,是指在程序运行过程中可以改变数据类型的结构。也就是说,是围绕着 “元编程” 产生的特性。元编程,指的是在运行时改变 “类” 的定义,例如访问、增加或修改等等。一言以蔽之,就是 “用程序来写程序”。Groovy 是和 Java 最亲近的动态语言。07 年底接触过一段时间 Groovy 程序,还混过当时 Groovy 中国社区的斑竹,只可惜本人如此喜爱挂念的东西,现在依然不算多活跃,在最新的 TIOBE 排行上面,列在 36 位,有趣的是,35 位的是 Scala,真可谓难兄难弟。这里有个小段子,Groovy 的作者 James Strachan 说,如果当年他看到了 Scala,就不会有 Groovy 什么事儿了。即便是这种自掘坟墓式的追捧,如今看来 Scala 的下场也没见得好到哪去。JavaScript 也一样是动态语言,为什么还要接触 Groovy?其中一个重要原因是其中的元编程特性太丰富。
- Haskell。纯粹的函数式语言。可以这样理解 “纯粹” 一说:有一些语言 “可以” 进行函数式编程,但是有的则是 “不得不” 进行函数式编程。编程语言发展的两大趋势就是动态语言和函数式语言。因此有了 Groovy 代表动态语言,接着我一直想学习一门函数式语言。函数式编程就像数学中的函数一样,唯一给定了输入参数,就可以唯一确定输出结果,没有上下文的影响,没有执行次数的影响,或者说是天然幂等的。网上太多文章批 Haskell 太过学院派,连教科书里面要教授函数式编程都用 Scheme(因为它更易学,还没有那么复杂的类型系统),但是开阔视野无疑是非常好的(“代码原来可以这样写!”),尤其喜爱其中的模式匹配的特性。
当然还有其它的,有代表性的语言想深入研究,比如逻辑式的 Prolog,还有可以写诗的 Perl……但是也害怕吃得太多就会撑着。
Haskell 之于函数,就像 Perl 之于字符串,就像 Prolog 之于谜题,就像 Groovy 之于 DSL。
我会记录和讨论一些语言特性,但是不会去讨论大多数语法糖这样可能重要但是琐碎的部分。如果只是纯粹的学习笔记那多无聊啊,还不如把它写成吐槽帖。我争取从 Java 和 JavaScript 到 Haskell 和 Groovy,对这四门语言,一个特性一个特性地横向比较,比如站在类型系统的角度,弱类型、强类型,静态的、动态的,类型之间的关系、类型创建等等;再比如元编程方面,Java 的反射和代理系统,JavaScript 的 prototype,Groovy 强大的元编程体系,还有 Haskell 的编译期元编程实现等等。
文章未经特殊标明皆为本人原创,未经许可不得用于任何商业用途,转载请保持完整性并注明来源链接 《四火的唠叨》
一直就想了解一下 schema。有没有这方面的材料推荐一下。从入门到深入到语言平台架构的。
http://www.yinwang.org/blog-cn/2015/04/03/paradigms/
http://www.yinwang.org/blog-cn/2013/03/31/purely-functional/
http://www.yinwang.org/blog-cn/2013/04/01/lazy-evaluation/
http://www.yinwang.org/blog-cn/2013/04/02/currying/
http://www.yinwang.org/blog-cn/2014/02/04/pl-tool/
函数式编程的思想,学 scheme 就够了