注册 登录  
 加关注
查看详情
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

为着理想勇敢前进

 
 
 

日志

 
 

简单还是复杂?  

2012-04-25 20:16:54|  分类: 默认分类 |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |

作者:Martin Odersky

译者:杨博

原文:Simple or Complicated ? 

最近我们在激烈讨论,有人说Scala对正常程序员来说很复杂,有人说Scala其实是一门编码很简单的语言。有两个帖子在讨论(http://michid.wordpress.com/http://warpedjavaguy.wordpress.com/2010/08/02/the-scala-is-too-complex-conspiracy-1/)。后面的回帖也值得一看。 

看了这些帖子和回帖后,我觉得很多人没讲到一块,完全是鸡同鸭讲嘛。所以我想举例说明这个问题不像表面上看的这么简单。 

 

简单还是复杂? - 杨博 - 为着理想勇敢前进                 简单还是复杂? - 杨博 - 为着理想勇敢前进

哪边更简单?

造哪个更简单?显然是前者。 

用起来更简单的呢?取决于……哼哼哼。如果你没用过键盘,也没用过电话,你可能觉得学莫尔斯电码还容易点。但我们其他人肯定觉得智能手机更简单啊。 

和别的语言比,Scala更像智能手机而非莫尔斯电报机。Scala编译器和核心标准库本身是极其复杂的软件,但用户体验却自由又友好。我有证据证明Scala真心易用。瞧瞧基于Scala的Kojo(http://netbeans.dzone.com/learn-scala-with-kojo),是教小屁孩初学编程用的。再说印度有上百名高中女生从Scala开始学编程(http://www.himjyotischool.org/)。这就是证据啊,即使不是名校博士生或者超级牛人之类的普通人也能上手嘛。

你可以说这样比不公平。智能手机和莫尔斯电报机都是硬梆梆的硬件,编程语言却很开放,更像可以拼起来的玩具套装而非消费品。 

好,那我们就看看可以拼起来的玩具套装。  

简单还是复杂? - 杨博 - 为着理想勇敢前进           简单还是复杂? - 杨博 - 为着理想勇敢前进

哪边更简单? 

左边的摩比世界的形状种类要比右边的乐高多,所以你可能觉得乐高简单些。 

另一方面,对搭积木这件事来说,摩比世界提供的是固定的方案,而乐高则提供了近乎无限的选择。某些人有选择恐惧症(患病的不一定是他们本人,也可以是他们的同事)。对他们来说,摩比世界比乐高简单。 

Scala更像乐高而非摩比世界。从客观指标看,Scala的概念并不多,还算简单。比如咱们可以比比各种语言的关键字数量(http://carlosqt.blogspot.com/2010/07/how-many-keywords-do-you-type-in-your.html)。我自己从头比了比上下文无关语法的数量,Scala相当紧凑,和Haskell或OCaml相当,比Java5稍少,比C#和C++少得多。 

(Scala作为一种语言,的确比图灵机或Lambda演算复杂,但后两者就相当于程序语言中的莫尔斯电码。Scala也比Python、Scheme或者Clojure复杂,但Scala有完备的静态类型系统,不可避免的增大了语言的开销)。 

从另一角度看,因为Scala的许多概念都很通用很正交,所以能以各种方式组合起来。所以毫无疑问Scala为完成几乎所有任务都提供了多种方式供选。这就要求通过实践找出比其他方式更好的最佳方案。因而也要求你必须接受,有时达到好的设计会存在不止一条途径。 

你对这些比较可能仍然怀有不满,因为不管怎么说,几乎所有的编程语言都图灵完备,所以在这个层面上,每种语言都能实现其他所有语言的功能。而摩比世界可并不完备,至少摩比世界造不出寿司大餐。 

那么我们用乐高和乐高比,要得不? 

简单还是复杂? - 杨博 - 为着理想勇敢前进            简单还是复杂? - 杨博 - 为着理想勇敢前进

哪边更简单?


左边的乐高得宝系列显然比右边的乐高科技系列简单,没错吧? 
没错,但如果给你个任务让你造一个比较特别的东西,你用哪个系列?可能用得宝系列你也能造出来,但一定比用科技系列别扭。更有可能你需要用到积木得宝系列中根本没有(比如绳状或胶状积木)。 

现在你该猜中了 :-) Scala更像科技系列而非得宝系列。相比别的语言,Scala能引导我们更简洁的解决问题。Scala还可以进行依赖注入(http://jonasboner.com/2008/10/06/real-world-scala-dependency-injection-di.html),而别的语言则需要引入外部配置文件才能做到。 
显然,这意味着Scala每行代码干的活更多,所以你会提出Scala比那些代码冗长的语言更难理解。但有实验证明(http://infoscience.epfl.ch/record/138586)事实并非如此,最终程序员会更适应紧凑的代码而非冗长的代码。 

我希望我能让你相信,“简单还是复杂”的辩论本身就不简单。复杂度是个多维的矢量。在一场讨论中,水友们笔下的“复杂度”往往是指复杂度不同维度上的分量。


  评论这张
 
阅读(2073)| 评论(0)
推荐 转载

历史上的今天

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2018