有关语言设计的一些联想
引发我这些思考的,是最近一篇InfoQ的文章:《语言约束和责任感,我们应该信赖谁?》,还有就是前两天我浅尝即止的scala语言。还有一些长久以来的思考片段。
1、以前我说过一句话:“语言是强框架,而框架是弱语言”。当时我提出这个思路的时候,其实还存在这一个误区,也就是认为很多框架级的设计,是可以引入语言层面的。这也就是我在设计DJ这个语言的时候,将许多TDD、DBC、AOP的思想引入语言层面的原因。当时我还举了java的exception的例子,证明将原本的开发中的常见问题,变成一种强制的语法限制,是一种明显的进步。
2、但是,现在的我,不再这么极端的赞同语言约束了,原因是我变成了越来越坚定的ruby程序员。在开发的过程中,我有时候不得不使用java的类库,但是,我完全不喜欢用java来调用它们,而是宁可使用jruby来做开发,很重要的一个原因,就是因为ruby不会强制要求我catch exception。
3、引申一下,当年我说的话,还是对的,但是要进一步深化:词法的限制、语法的限制、类库的限制、框架的限制、编码约定、编程习惯。是多个不同层次的约束。一层比一层更加弱化。而解决各种不同的问题,需要在不同的层次,来设计约束。如果强行提高约束的“强度”,就会设计出很傲慢的语言或者框架来。
4、打个比方,代码缩进是一个很好的编程习惯,但是像python那样,将缩进要求变成语法强制规定,就是过了。
5、再打个比方,处理exception是一个良好的编程习惯,但是并非所有的exception都需要处理,java规定, 不处理异常,就不能通过编译,就是过了。
6、再说说语法设施的问题,像lisp那样的语言,属于极简主义,几乎全部的语法设施,就是左右圆括号和逗号。而像我们现在习惯的方括号、花括号、冒号、=>、->、::等等则一概没有。这样就会造成lisp的程序阅读非常吃力,满屏的圆括号,让人迅速的就晕掉了。另一方面,我最近在看的scala,则定义了太多的语法设施。在看起来的时候,也很容易眼晕。在这方面,我觉得ruby做到了很好的折中。
7、今天看到云风的一篇blog《捣糨糊》,谈的是一个过度设计的问题,C++的程序员,很容易将那些先进的东西,用到简单的事情上,当然,java程序员也是一样。而在我看来,有很多种需求的情况,有些情况非常适合用过程式思维来解决,有些非常适合以OO的方式来思考,有些非常适合以函数式的方式来思考,还有些问题,只要精通正则表达式,就是几行代码的事情。而一个好的语言,就是妥善的,不别扭的支持各种不同的编程思维模式。当然,ruby在这方面,我觉得的确做得很棒。
8、前两天gigix发了一篇blog《对象健身操:拒绝else》,还有在InfoQ的几篇文章,似乎还要向if、for宣战。我的看法是:反对if行动: http://tr.im/syd1 反对for行动: http://tr.im/syd7 拒绝else: http://tr.im/sydk //面向对象之“三反五反”?关键字都是基础设置,如何用在程序员自己!好的语言,要支持各种编程思维模式,而好的程序员,则要会善用各种不同的编程思维模式来解决不同领域的问题,面对任何问题,都只会挥舞一把榔头,毕竟是欠缺火候的。
9、每一种语言,都有其特殊与特长,好的程序员,耍刀像刀,耍剑像剑。当然,不是说所有的语言都是一样好的,我毕竟还是更喜欢ruby一些。可以拿来像刀一样耍,也可以像剑一样耍,这个感觉很棒。