论坛首页 Java企业应用论坛

为什么选择Scala

浏览 28075 次
该帖已经被评为隐藏帖
作者 正文
   发表时间:2009-08-07  
引用
对于不愿学习新东西的人来说,所有新特性都是“生僻”的,任何转向都是不容易的。

这句话的前提是错误的,因为scala的很多特性根本就不是新东西。C#、Scala都有数组、模板,但是C#采用的语法和大部分已有的编程语言是相同的,所以我觉得C#比scala简单,scala的数组、模板有什么本质提高的地方吗?

引用
举个例子来说,拿C# 3.0和C# 1.0比较,也可以套用同样的说辞。

这个例子举的不准,新版本C#有模板、类型推理等C# 1.0没有的特性,相对于C# 1.0来说是有意义的创新。但是,C#1.0相对于Java来说,把synchornized改为lock、super改为base的行为就是属于典型的“为了不同而不同”。
0 请登录后投票
   发表时间:2009-08-07   最后修改:2009-08-07
引用
但他有些地方过头了,比如元组tuple(就是可以放不同类型的元素的list),下标居然从1开始,而且是_1,_2这样,他们的解释是:"因为对于拥有静态类型元组的其他语言,如Haskell和ML,从1开始是传统的设定。"我狂吐血!tnnd你总的和list的访问方式一致吧,起始下标一个是0,一个是1,还让不让人活了,就我而言,以后如果编程时遇到这两种列表中特定位置取值,肯定要多想一想下标的问题,这就超出了语法的问题了,是真正让人感觉无法接受的.

人家几十年前 Lisp 里面就用 fst 和 snd 了,源远流长,给你改成 0 才不妥呢。
tuple 是定长的,访问方式和数组、链表不一样,tuple 如果做成下标取值方式,所有函数的调用性能都会慢一大截 ……
你不满意可以把它转成 Seq 再用下标取值。

你不爽是因为被 java 毒害太久了。


老兄没明白我的重点,我真的不介意他是从0开始还是从1开始,事实上对于所有的语言,我觉得从1开始更自然,更能减轻程序员的负担,毕竟更符合日常思维。我的不满,是他把tuple和list两个非常类似的东西搞得不一致,这加重了程序员的思维负担。你和别的语言差的再多也无所谓,但不要语言中搞这种不一致的思维方式。
我对于语法的异同,基本不太在意,程序语言这点不同不算什么,法语、西班牙语的动词变位那么变态不是还有很多人乐此不疲的去学,但语言的设计必须要尽可能地减少程序员负担,减少可能出现的问题,如果哪位熬夜加班的程序员脑子短路把tuple当作从0开始,我觉得scala语言或者说设计者本身是有责任的。我对于scala是相当看好的,只是希望它能更符合大众程序员的需要。

从另一个角度讲,如果scala是完全的自成一派,我想大家也就不会有这么多怨言了,但它既然继承了java这么多的东西,并希望它能取代java,就应该对广大java程序员负责,减轻转换负担,尤其是这完全没有技术上的难度。
0 请登录后投票
   发表时间:2009-08-07   最后修改:2009-08-07
我觉得我们可以以更积极的眼光去看 Scala:

1、语法问题。如果你舍得花时间学 Python、Ruby,那你也可以舍得花时间学 Scala,而且时间肯定比这两个要少,因为有现成的你已经非常熟悉的类库可用;

2、Scala 和 Groovy,一个是静态的,一个是动态的,二者都是 Java 很好的补充。

3、我觉得类型推断是亮点。
0 请登录后投票
   发表时间:2009-08-07  
引用
人家几十年前 Lisp 里面就用 fst 和 snd 了,源远流长,给你改成 0 才不妥呢。

源远流长又咋样,能说明一个下标从1开始一个下标从0开始是合理的吗, MIT源远流长的6.001不是被Python取代了吗?再说C语言的历史不比lisp短多少。
0 请登录后投票
   发表时间:2009-08-07   最后修改:2009-08-07
yiding_he 写道
我觉得我们可以以更积极的眼光去看 Scala:

1、语法问题。如果你舍得花时间学 Python、Ruby,那你也可以舍得花时间学 Scala,而且时间肯定比这两个要少,因为有现成的你已经非常熟悉的类库可用;

2、Scala 和 Groovy,一个是静态的,一个是动态的,二者都是 Java 很好的补充。

3、我觉得类型推断是亮点。


我也是非常喜欢类型推断,scala到底能不能流行不好说,但我想它起码能让很多人思索,到底动态类型真有那么好吗?安德尔斯的一句话对我影响很大:“你告诉编译器的越多,编译器能为你做的就越多”,我一直近于固执的认为,静态语言是做基础架构的必然选择,看看c#和scala,其实静态语言的效率可以提升到相当高的水平。

还有个问题就是框架的应用,现在大多数程序员都是骑在别人的轮子上,自己写的代码数量已经比以前少的多了,用动态语言的优势已经没有以前那么大了,而且静态语言的框架性能可以(我不是说一定,是说可以)做的比动态的好不少。

现在都推崇ruby、python,很大程度上不是java语言本身的问题,而是业界把java这个体系搞得很高端很复杂,随着java渐渐轻量化以及c#、scala这些语言越来越流行,静态语言的优点慢慢会被重新发现的。
0 请登录后投票
   发表时间:2009-08-07  
飘过,看过,留言过。
0 请登录后投票
   发表时间:2009-08-07  
哎,感叹下……
文档文章看了不少,研究编码做得不多

很多情况下都人云亦云了——

闭关一段时间,牢固下基础。尝试学习研究下这些新技术。
0 请登录后投票
   发表时间:2009-08-07  
cscript 写道
引用
人家几十年前 Lisp 里面就用 fst 和 snd 了,源远流长,给你改成 0 才不妥呢。

源远流长又咋样,能说明一个下标从1开始一个下标从0开始是合理的吗, MIT源远流长的6.001不是被Python取代了吗?再说C语言的历史不比lisp短多少。


不要太激动了。:)   很难说从0开始和从1开始哪个更合理, 我想设计成这样主要也是考虑程序员的习惯。在大多数主流语言中list都是从0开始。 而支持tupe的语言基本tupe都是从1开始。  这个是符合习惯的。

至于MIT的例子并不合适。  MIT用python代替scheme 不纯在是否符合习惯的问题。 python优于scheme的地方主要是python被使用的更多 不管是在别的课程中还是在现实世界中都是这样。

0 请登录后投票
   发表时间:2009-08-07  
cscript 写道
引用
对于不愿学习新东西的人来说,所有新特性都是“生僻”的,任何转向都是不容易的。

这句话的前提是错误的,因为scala的很多特性根本就不是新东西。C#、Scala都有数组、模板,但是C#采用的语法和大部分已有的编程语言是相同的,所以我觉得C#比scala简单,scala的数组、模板有什么本质提高的地方吗?

引用
举个例子来说,拿C# 3.0和C# 1.0比较,也可以套用同样的说辞。

这个例子举的不准,新版本C#有模板、类型推理等C# 1.0没有的特性,相对于C# 1.0来说是有意义的创新。但是,C#1.0相对于Java来说,把synchornized改为lock、super改为base的行为就是属于典型的“为了不同而不同”。


你还是没搞清楚要点。

新东西?哪个语言是完全的新东西?C#那些东西还不是跟别人学的嘛。
我针对的是那些固守java的人。你拿C#来搅合,根本就是牛头不对马嘴。

“C#采用的语法和大部分已有的编程语言是相同的”,拜托,什么是“大部分已有的编程语言”?难道C#比scala更接近java?还是更接近ruby、python、groovy、lisp、haskell、javascript?你要是说C# 3.0比scala更接近C# 1.0,那就算了。。。

最后,其实我挺喜欢C#把synchornized改为lock,因为前者又臭又长我老是要拼错。对于我,这就是一个改进。
0 请登录后投票
   发表时间:2009-08-07   最后修改:2009-08-07
cscript 写道
引用
人家几十年前 Lisp 里面就用 fst 和 snd 了,源远流长,给你改成 0 才不妥呢。

源远流长又咋样,能说明一个下标从1开始一个下标从0开始是合理的吗, MIT源远流长的6.001不是被Python取代了吗?再说C语言的历史不比lisp短多少。


tuple 取元素不是下标 …… tuple 还作为函数的参数而存在,如:
def f (param1: Int, param2: Int) = ...

这时如果取第 1 个参数 …… 硬要说成取第 0 个参数?

而数组、list 下标从 0 开始有多根深蒂固就不提了,如果从 1 开始世界要大乱了 ……

不过你这么有想法,可以创建一个 scala 的 branch,把它们全部统一:
将 Tuple1 到 Tuple22,改成 Tuple0 到 Tuple21,把 Product1 到 Product22 全部改成 Product0 到 Product21,提取元素的方法通通从 _0 开始 ……

如果赞同的人一大堆,很快就能 merge 进去了,祝您成功!

==============

ps1: 其实 ._1 ._2 用得很少 …… 用模式匹配,从 0 或者 1 开始算都没关系。
val t = (2, 3)
val (a, b) = t      // a=2, b=3
val l = List(1,2)
val List(c, d) = l  // c=1, d=2


ps2:有些不同的东西是受商业因素影响的:要宣传自己多牛,就得多造些名词,以免一下就被人发现这个东西几十年前就在 lisp 和 smalltalk 中出现过了。

ps3:类型推断不是静态语言的专利。Netbeans 的 ruby 插件已经可以利用类型推断来找 bug 了。
0 请登录后投票
论坛首页 Java企业应用版

跳转论坛:
Global site tag (gtag.js) - Google Analytics