引发我这些思考的,是最近一篇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一些。可以拿来像刀一样耍,也可以像剑一样耍,这个感觉很棒。
2011/1/7 庄表伟 <zhuang...@gmail.com>:
--
Best Regards
LI Daobing
锟斤拷然锟斤拷实锟皆硷拷锟斤拷锟斤拷没锟叫帮拷锟斤拷锟斤拷锟斤拷锟斤拷锟绞碉拷锟斤拷泻芏啵拷锟教拷锟斤拷缘摹锟斤拷锟教拷浴锟斤拷锟斤拷锟斤拷锟角诧拷锟斤拷锟节硷拷锟斤拷锟皆的o拷锟斤拷锟斤拷锟斤拷锟斤拷锟剿伙拷迎锟斤拷锟斤拷锟皆o拷锟截硷拷锟斤拷要锟矫碉拷爽锟斤拷锟斤拷锟斤拷要锟斤拷锟襟…★拷
Jeffrey Zhao
Blog: http://blog.zhaojie.me/
Twitter: http://twitter.com/jeffz_cn
-----原始锟绞硷拷-----
From: LI Daobing
Sent: Friday, January 07, 2011 3:28 PM
To: is...@googlegroups.com
Subject: Re: 锟斤拷锟斤拷锟斤拷锟筋骏锟斤拷锟斤拷Clojure锟斤拷锟斤拷锟斤拷一锟斤拷锟皆硷拷锟斤拷前写锟斤拷blog锟斤拷锟叫癸拷锟斤拷锟斤拷锟斤拷频锟揭恍╋拷锟斤拷搿�
锟斤拷实 Java 锟斤拷锟斤拷锟揭诧拷诖锟�checked exception 锟斤拷 unchecked exception 转锟斤拷, 锟斤拷锟斤拷
Spring
锟酵革拷锟剿很讹拷, 锟截憋拷锟斤拷锟斤拷锟斤拷莘锟斤拷锟斤拷锟揭伙拷恪�
2011/1/7 庄锟斤拷伟 <zhuang...@gmail.com>:
> http://www.zhuangbiaowei.com/blog/?p=173
>
> 锟斤拷锟斤拷锟斤拷些思锟斤拷锟侥o拷锟斤拷锟斤拷锟揭黄狪nfoQ锟斤拷锟斤拷锟铰o拷锟斤拷锟斤拷锟斤拷约锟斤拷锟斤拷锟斤拷胃校锟斤拷锟斤拷锟接︼拷锟斤拷锟斤拷锟剿拷锟斤拷锟斤拷锟斤拷锟斤拷芯锟斤拷锟角帮拷锟斤拷锟斤拷锟角筹拷锟斤拷锟街癸拷锟絪cala锟斤拷锟皆★拷锟斤拷锟斤拷一些锟斤拷锟斤拷锟斤拷锟斤拷锟斤拷思锟斤拷片锟轿★拷
>
> 1锟斤拷锟斤拷前锟斤拷说锟斤拷一锟戒话锟斤拷"锟斤拷锟斤拷锟斤拷强锟斤拷埽锟斤拷锟斤拷锟斤拷锟斤拷锟斤拷锟斤拷锟�锟斤拷锟斤拷时锟斤拷锟斤拷锟斤拷锟斤拷思路锟斤拷时锟斤拷锟斤拷实锟斤拷锟斤拷锟斤拷锟斤拷一锟斤拷锟斤拷锟斤拷也锟斤拷锟斤拷锟斤拷为锟杰讹拷锟杰硷拷锟斤拷锟斤拷疲锟斤拷强锟斤拷锟斤拷锟斤拷锟斤拷锟斤拷圆锟斤拷锟侥★拷锟斤拷也锟斤拷锟斤拷锟斤拷锟斤拷锟斤拷锟紻J锟斤拷锟斤拷锟斤拷缘锟绞憋拷颍锟斤拷锟斤拷TDD锟斤拷DBC锟斤拷AOP锟斤拷思锟斤拷锟斤拷锟斤拷锟斤拷锟皆诧拷锟斤拷锟皆拷颉5锟绞憋拷一锟斤拷锟斤拷锟絡ava锟斤拷exception锟斤拷锟斤拷锟接o拷证锟斤拷锟斤拷原锟斤拷锟侥匡拷锟斤拷锟叫的筹拷锟斤拷锟斤拷锟解,锟斤拷锟揭伙拷锟角匡拷频锟斤拷锓拷锟斤拷疲锟斤拷锟揭伙拷锟斤拷锟斤拷缘慕锟�>
> 2锟斤拷锟斤拷锟角o拷锟斤拷锟节碉拷锟揭o拷锟斤拷锟斤拷锟斤拷么锟斤拷锟剿碉拷锟斤拷同锟斤拷锟斤拷约锟斤拷锟剿o拷原锟斤拷锟斤拷锟揭憋拷锟斤拷锟皆斤拷锟皆斤拷岫拷锟絩uby锟斤拷锟斤拷员锟斤拷锟节匡拷锟斤拷锟侥癸拷锟斤拷校锟斤拷锟斤拷锟绞憋拷虿坏貌锟绞癸拷锟絡ava锟斤拷锟斤拷猓拷锟斤拷牵锟斤拷锟斤拷锟饺拷锟较诧拷锟斤拷锟絡ava锟斤拷锟斤拷锟斤拷锟斤拷锟角o拷锟斤拷锟斤拷锟斤拷锟斤拷使锟斤拷jruby锟斤拷锟斤拷锟斤拷锟斤拷锟斤拷锟斤拷锟斤拷要锟斤拷一锟斤拷原锟津,撅拷锟斤拷锟斤拷为ruby锟斤拷锟斤拷强锟斤拷要锟斤拷锟斤拷catch
> exception锟斤拷
>
> 3锟斤拷锟斤拷锟斤拷一锟铰o拷锟斤拷锟斤拷锟斤拷说锟侥伙拷锟斤拷锟斤拷锟角对的o拷锟斤拷锟斤拷要锟斤拷一锟斤拷锟筋化锟斤拷锟绞凤拷锟斤拷锟斤拷锟狡★拷锟斤法锟斤拷锟斤拷锟狡★拷锟斤拷锟斤拷锟斤拷锟狡★拷锟斤拷艿锟斤拷锟斤拷啤锟斤拷锟斤拷锟皆硷拷锟斤拷锟斤拷锟斤拷习锟竭★拷锟角讹拷锟斤拷锟酵拷锟轿碉拷约锟斤拷一锟斤拷锟揭伙拷锟斤拷锟斤拷锟斤拷锟斤拷锟斤拷锟斤拷锟斤拷锟斤拷植锟酵拷锟斤拷锟斤拷猓拷锟揭拷诓锟酵拷牟锟轿o拷锟斤拷锟斤拷锟皆硷拷锟斤拷锟斤拷强锟斤拷锟斤拷锟皆硷拷锟斤拷"强锟斤拷"锟斤拷锟酵伙拷锟斤拷瞥锟斤拷馨锟斤拷锟斤拷锟斤拷锟皆伙拷锟竭匡拷锟斤拷锟斤拷锟�>
> 4锟斤拷锟斤拷锟斤拷确锟斤拷锟斤拷锟斤拷锟斤拷锟斤拷锟斤拷锟揭伙拷锟斤拷芎玫谋锟斤拷习锟竭o拷锟斤拷锟斤拷锟斤拷python锟斤拷锟斤拷锟斤拷锟斤拷要锟斤拷锟斤拷锟斤法强锟狡规定锟斤拷锟斤拷锟角癸拷锟剿★拷
>
> 5锟斤拷锟劫达拷锟斤拷确锟斤拷锟斤拷锟斤拷锟絜xception锟斤拷一锟斤拷锟斤拷锟矫的憋拷锟较帮拷撸锟斤拷锟斤拷遣锟斤拷锟斤拷锟斤拷械锟絜xception锟斤拷锟斤拷要锟斤拷锟�java锟芥定锟斤拷
> 锟斤拷锟斤拷锟斤拷锟届常锟斤拷锟酵诧拷锟斤拷通锟斤拷锟斤拷耄拷锟斤拷枪锟斤拷恕锟�>
> 6锟斤拷锟斤拷说说锟斤法锟斤拷施锟斤拷锟斤拷锟解,锟斤拷lisp锟斤拷锟斤拷锟斤拷锟斤拷裕锟斤拷锟斤拷诩锟斤拷锟斤拷锟斤拷澹拷锟斤拷锟饺拷锟斤拷锟斤拷锓拷锟绞╋拷锟斤拷锟斤拷锟斤拷锟斤拷锟皆诧拷锟斤拷藕投锟斤拷拧锟斤拷锟斤拷锟斤拷锟斤拷锟斤拷锟斤拷锟较帮拷叩姆锟斤拷锟斤拷拧锟斤拷锟斤拷锟斤拷拧锟矫帮拷拧锟�>锟斤拷->锟斤拷::锟饺碉拷锟斤拷一锟斤拷没锟叫★拷锟斤拷锟斤拷突锟斤拷锟斤拷lisp锟侥筹拷锟斤拷锟侥讹拷锟角筹拷锟斤拷锟斤拷锟斤拷锟斤拷锟斤拷锟斤拷圆锟斤拷锟脚o拷锟斤拷锟斤拷迅锟劫的撅拷锟轿碉拷锟剿★拷锟斤拷一锟斤拷锟芥,锟斤拷锟斤拷锟斤拷诳锟斤拷锟絪cala锟斤拷锟斤拷锟斤拷锟斤拷太锟斤拷锟斤拷锓拷锟绞╋拷锟斤拷诳锟斤拷锟斤拷锟斤拷锟绞憋拷锟揭诧拷锟斤拷锟斤拷锟斤拷锟斤拷巍锟斤拷锟斤拷夥斤拷妫拷揖锟斤拷锟絩uby锟斤拷锟斤拷锟剿很好碉拷锟斤拷锟叫★拷
>
> 7锟斤拷锟斤拷锟届看锟斤拷锟狡凤拷锟揭黄猙log锟斤拷锟斤拷锟捷猴拷谈锟斤拷锟斤拷一锟斤拷锟斤拷锟斤拷锟狡碉拷锟斤拷锟解,C++锟侥筹拷锟斤拷员锟斤拷锟斤拷锟斤拷锟阶斤拷锟斤拷些锟饺斤拷亩锟斤拷锟斤拷锟斤拷玫锟斤拷虻サ锟斤拷锟斤拷锟斤拷希锟斤拷锟饺伙拷锟絡ava锟斤拷锟斤拷员也锟斤拷一锟斤拷锟斤拷锟斤拷铱锟斤拷锟斤拷锟斤拷泻芏锟斤拷锟斤拷锟斤拷锟斤拷锟斤拷锟斤拷锟斤拷锟叫╋拷锟斤拷锟角筹拷锟绞猴拷锟矫癸拷锟绞剿嘉拷锟斤拷锟斤拷锟斤拷锟斤拷些锟角筹拷锟绞猴拷锟斤拷OO锟侥凤拷式锟斤拷思锟斤拷锟斤拷锟斤拷些锟角筹拷锟绞猴拷锟皆猴拷锟斤拷式锟侥凤拷式锟斤拷思锟斤拷锟斤拷锟斤拷锟斤拷些锟斤拷锟解,只要锟斤拷通锟斤拷锟斤拷锟斤拷式锟斤拷锟斤拷锟角硷拷锟叫达拷锟斤拷锟斤拷锟斤拷椤o拷锟揭伙拷锟斤拷玫锟斤拷锟斤拷裕锟斤拷锟斤拷锟斤拷锟斤拷频模锟斤拷锟斤拷锟脚わ拷锟街э拷指锟斤拷植锟酵拷谋锟斤拷思维模式锟斤拷锟斤拷然锟斤拷ruby锟斤拷锟解方锟芥,锟揭撅拷锟矫碉拷确锟斤拷锟矫很帮拷锟斤拷
>
> 8锟斤拷前锟斤拷锟斤拷gigix锟斤拷锟斤拷一篇blog锟斤拷锟斤拷锟斤拷锟斤拷伲锟斤拷芫锟絜lse锟斤拷锟斤拷锟斤拷锟斤拷锟斤拷InfoQ锟侥硷拷篇锟斤拷锟铰o拷锟狡猴拷锟斤拷要锟斤拷if锟斤拷for锟斤拷战锟斤拷锟揭的匡拷锟斤拷锟角o拷锟斤拷锟斤拷if锟叫讹拷锟斤拷http://tr.im/syd1 锟斤拷锟斤拷for锟叫讹拷锟斤拷 http://tr.im/syd7 锟杰撅拷else锟斤拷
> http://tr.im/sydk //锟斤拷锟斤拷锟斤拷锟街�锟斤拷锟藉反"锟斤拷锟截硷拷锟街讹拷锟角伙拷锟斤拷锟矫o拷锟斤拷锟斤拷锟斤拷诔锟斤拷锟皆憋拷约锟斤拷锟斤拷玫锟斤拷锟斤拷裕锟揭э拷指锟斤拷直锟斤拷思维模式锟斤拷锟斤拷玫某锟斤拷锟皆憋拷锟斤拷锟揭拷锟斤拷锟斤拷酶锟斤拷植锟酵拷谋锟斤拷思维模式锟斤拷锟斤拷锟斤拷锟酵拷锟斤拷锟斤拷锟斤拷锟解,锟斤拷锟斤拷魏锟斤拷锟斤拷猓拷锟街伙拷锟斤拷锟斤拷一锟斤拷锟斤拷头锟斤拷锟较撅拷锟斤拷欠缺锟斤拷锟侥★拷
>
> 9锟斤拷每一锟斤拷锟斤拷锟皆o拷锟斤拷锟斤拷锟斤拷锟斤拷锟斤拷锟斤拷锟截筹拷锟斤拷锟矫的筹拷锟斤拷员锟斤拷耍锟斤拷锟今刀o拷耍锟斤拷锟今剑★拷锟斤拷然锟斤拷锟斤拷锟斤拷说锟斤拷锟叫碉拷锟斤拷锟皆讹拷锟斤拷一锟斤拷玫模锟斤拷冶暇锟斤拷锟斤拷歉锟较诧拷锟絩uby一些锟斤拷锟斤拷锟斤拷锟斤拷锟斤拷锟斤拷一锟斤拷耍锟斤拷也锟斤拷锟斤拷锟斤拷一锟斤拷耍锟斤拷锟斤拷锟斤拷芯锟斤拷馨锟斤拷锟�
?理论上说,程序会抛出的异常是API签名的一部分,是必须在类库升级过程中有所保证的,否则就会造成兼容性问题。Java语言的确想到了这点,这是个进步,但的确没想到大家都痛恨这个功能,普通人基本都用RuntimeException或throws Exception,最后Java自 己的API都基本使用RuntimeException。这方面Java还是值得安慰一下。现在大部分语言不要求checked exception,于是乎……异常只能定义在文档里了,其实这对兼容性是个损 害。
当然其实对兼容性没有帮助的特性其实还有很多,动态语言的“动态性”本身就是不利于兼容性的,看起来受人欢迎的语言,关键还是要用的爽,其他要靠后……
Jeffrey Zhao
Blog: http://blog.zhaojie.me/
Twitter: http://twitter.com/jeffz_cn
-----原始邮件----- From: LI Daobing
Sent: Friday, January 07, 2011 3:28 PM
To: is...@googlegroups.com
Subject: Re: 因昨天李骏介绍Clojure,重贴一遍自己以前写的blog《有关语言设计的一些联想》
?理论上说,程序会抛出的异常是API签名的一部分,是必须在类库升级过程中有所保证的,否则就会造成兼容性问题。Java语言的确想到了这点,这是个进步,但的确没想到大家都痛恨这个功能,普通人基本都用RuntimeException或throws Exception,最后Java自 己的API都基本使用RuntimeException。这方面Java还是值得安慰一下。现在大部分语言不要求checked exception,于是乎……异常只能定义在文档里了,其实这对兼容性是个损 害。
当然其实对兼容性没有帮助的特性其实还有很多,动态语言的“动态性”本身就是不利于兼容性的,看起来受人欢迎的语言,关键还是要用的爽,其他要靠后……
Jeffrey Zhao
Blog: http://blog.zhaojie.me/
Twitter: http://twitter.com/jeffz_cn
-----原始邮件----- From: LI Daobing
Sent: Friday, January 07, 2011 3:28 PM
To: is...@googlegroups.com
Subject: Re: 因昨天李骏介绍Clojure,重贴一遍自己以前写的blog《有关语言设计的一些联想》
2011/1/7 Neo <neo...@gmail.com>:
--
Tinyfool的Blog http://tiny4.org/blog/
Tiny4Cocoa http://tiny4.org/cocoa/
myTwitter: http://twitter.com/tinyfool
2011/1/7 Neo <neo...@gmail.com>: