前日,Groovy创始人撰博文称Scala将取代Java。他说,如果他在2003年看过《Programming Scala》的话,那可能就不会有Groovy了。这篇文章引发的讨论十分精彩,从中可以了解到很多方面的不同观点。

【51CTO精选译文】前日,Groovy创始人James Strachan在博客上撰文称Scala将成为Java的代替者。其时51CTO的译者对全文做出了翻译,并节选出其间一些精彩的回复放入了文中。事实上,几乎一切的谈论都十分精彩,以至于咱们决议对这些回复进行愈加严密的盯梢。

Scala替代Java?或许吗?热议仍继续不断(scala与java)  Scala Fan 函数式编程 第1张

51CTO修改引荐:Scala编程言语专题

原文进口:Groovy创始人:Java面对完结 Scala将取而代之(BlogSpot上的原文地址在此)。下面的谈论中,咱们对博主James的回复做了蓝色标示。

◆Alan said...

在用Scala开发程序的进程,最招引我的一点便是简略的构建进程。它能十分智能地帮我处理Scala项目的依靠联系处理,编译,以及常见的Ant/Maven使命,而且不需求编写XML文件。

◆Justin Lee said...

我很想知道你对Fandev.org上的东西是怎样的观念。它好像供给了许多你期望在Scala里呈现的功用(我不太懂Scala,所以我也无法精确地进行比照)。我用Java开发现已有很长的时刻了,一向期望能找到其它更好用的言语,现在我觉得fan这种言语便是我要找的。不过从你对Scala的点评来看,明显Scala也或许是。所以,我想知道你是否了解过Fan。我并有没有要为Fan打广告或者说要压服你改动观念的意思。毫不隐秘地说,我仅仅看看你的主意,由于你是一个言语天才,而我远远不是。

◆James Strachan said...

我也以为Fan是一门很棒的言语,尽管我有点忧虑它会变得既不像.Net又不像Java。它的静态和动态类型完结办法和Groovy里几乎如出一辙。我自己仍是更偏好静态类型完结一点,而且Scala里的泛型/运算符的重载都十分好用。

最终,比较于fan/groovy里僵硬地参加对闭包的支撑,Scala供给的对函数式编程和不变状况(immutable state)的支撑看起来更适用一点。

◆Jeff Foster said...

我个人觉得底子就没有必要创造一种言语来代替JVM里的Java。像现在这样在一个虚拟机之上运转多种言语我觉得十分好(51CTO编者注:事实上,在哪种言语将操控多核年代 再看函数式言语特性一文中也有这样的观念,那便是多种言语并存的远景),不同的人各取所需。

您是否尝试过Clojure?它就需求许多的击键输入(由于它是动态类型的),可是宏和并行才干(由于它支撑软件事务性内存(STM)的供给使得这门言语也十分招引人。

◆R. Mark Volkmann said...

我看到作者作了不少这样的辩解:

“Scala给人的开始形象或许是符号用得太多了点,可是你并不需求运用一切的符号”。

我对这类说法十分不满,由于尽管你或许用不到一切的符号,可是你得阅览并了解他人的代码,那个人说不定就用到一切的符号了。

◆The Kaos Jester said...

我想以几个问题回应你:

0 )已然咱们会一向停留在Java 6,为什么咱们还要这么急迫地想挣脱Java呢?你先是嫌Java的语法规范太厚了,但接着又怪它没有什么新功用。为什么咱们抛弃Java?(51CTO编者注:Java EE 6的草案早在2007年头便现已提交,可是JavaOne 09都现已完毕了,仍是千呼万唤出不来。概况可参阅51CTO之前的译文Java EE 6遥遥无期 预览版两极分化)

1 )你怎样看待数组?我知道链表用起来是“很好”,可是数组这一数据结构并不仅仅是描绘了数据的存储,它还供给了一个可在O(1)时刻杂乱度内拜访的内存散布。假如选用链表,就底子无法确保这样的高效。这生意合算吗?

2 )Java里的泛型和C++里的模板差不多便是一个东西,只不过泛型在编译时没有类型揣度。Scala也差不多,只不过有类型揣度,可是程序员现在还底子没有办法操控它。比方,每次我要完结一个KD树时,我就经过扩展TreePoint来在变量T上完结泛型。其间TreePoint是一个供给了getVal(int axis)函数的接口。这样就让我得以构建一个泛型的空间树,而且它必定能在任何完结了TreePoint的类下作业。假如我想用Scala构建这样的数据结构的话怎样才干办得到呢?是不是我得TreePoint变成一个目标,并经过其它目标来扩展它?Scala甚至连承继都不支撑吧?还有接口呢?(有关Scala泛型的优势,51CTO曾致信Scala创始人Martin Odersky,他曾比较具体的解说过。概况可点击这儿)

3 )您称誉Scala说它更高雅。我觉得有必要展现一下。

这是用Java编写的打印偶数的程序。

  1. even(intmax){
  2. for(inti=0;i<max;i++){
  3. if(i%2==0)System.out.print(i+"");
  4. }
  5. }

这是用Scala写的:

  1. defeven(to:Int):List[Int]=
  2. for(i<-List.range(0,to)ifi%2==0)yieldi
  3. Console.println(even(0,20))

这样的写法对我来讲是件苦楚的工作。别的,Scala写的示例程序让人觉得代码结构不太明晰。这样非规范的for循环怎么能有助于代码的杂乱性和简练性?它对编写代码有什么优点?

4 )由于它是一个脚本言语,行尾不运用' ; ' ,而是运用' \n'作为完毕符,这再一次给咱们带来费事。我也知道Ruby,Python这些言语都很帅,由于它们都不需求你写行完毕符,可是莫非你不觉得这样很简略让人利诱吗?事实上,我以为这会让Scala程序员十分苦恼,由于连下面这样的写法都是合法的:

  1. valt=a(i);a(i)=a(j);a(j)=t

5 )你首要就拿Java语法手册有600多页说事,后边又说Scala有多少扩展库能够完结相似功用。可是,Java语法手册这么长的原因原本便是由于官方为确保各个Java版别的一致性而集成了许多库。试问Scala又是怎么确保这些后来加进来的库的一致性呢?

6 )你说Java的根本类型很是让人不爽。我不知道你为什么会有这种感觉,Scala又采取了什么办法来处理这一问题呢?

7 )我想你必定知道JavaScript不能用来开发桌面应用程序,对不对?相同的道理,也不会有哪种言语能够代替Java,Python,Ruby等。

8 )Java里有一点和字符串相关的多态性值得一提:Java里的一切目标都供给了一个toString办法,而且一切你自己编写的目标都能够自界说toString办法(只要在类里边界说这个办法并在办法前加上"@Override")。所以,你能够让Java彻底依照你的所想去打印任何目标。试问在Scala里怎样才干完结这一功用呢?

以上仅仅我个人的一些鄙意。Scala看起来仍是挺强壮的(不过我仍然会首选Java和Scheme),可是好像你所诉苦的Java中的这些问题也相同存在于Scala中,并没有得到什么改进。咱们仍然在运用虚拟机,它带有虚拟机内存,字节码在运转时才编译,它还带有可变类型。这篇文章并不是要招来口水战,可是我读了你的这篇文章之后的确产生了一系列的疑问。

◆James Strachan said...

0 )javac的过期时刻现已步步迫临。莫非咱们不应投靠另一种更好的言语吗?你能够挑选持续死守。这一点都不古怪,直到现在还有人在用COBOL呢。

1 )数组不是Collection,它们没有完结 Iterbale < T>。(Scala里的FWIW链表和数组支撑迭代和自然数索引操作,例如myArray(5) )

2 )我不确定我能够100%做到这点,可是我想或许值得去读读Scala里怎么支撑这种笼统类型。

3 )我不太认同你所说的。这一段Scala代码界说了一段随时都能够方便地完毕的代码,而在Java里必须得进行迭代。你不光是拿苹果和桔子在进行比较。你还把Scala 的for句子的许多强壮功用给忽视掉了。

http://www.Scala-lang.org/node/111

这可防止许多丑恶的嵌套循环。

4 )Scala和Javac相同严厉,当然,我也相同喜爱像JavaScript、Ruby、Groovy那样的宽松语法。

5 )Scala是一门简略却又十分强壮的言语。高雅规划的窍门便是怎么尽或许地进行化简却仍然坚持原有的功用。

6 )比方说,在Java中有那么多的与根本类型、主动封装以及数组相关的费事。

7 )JavaScript和Java/Ruby之间底子就没有什么可比性。你还能够用Rhino在JVM里完结大部分使命呢。

8 )Scala里,一切都是目标。

总归,我十分喜爱JVM以及它的渠道和许多扩展库。我仅仅在为javac作长远打算,而且我觉得Scala是一个巨大的前进。

◆James Strachan said...

@The Kaos Jester

我想趁便再强调下期望你能看看我在文章里说到的两本Scala编程书。不要心胸嫌隙。

Scala很好地处理了Java里的大部分问题(我看了这些Scala编程书之后才想起来Java有这么多不尽善尽美的当地),而且它能让咱们大开眼界,看到怎么美丽地把面向目标编程和函数式编程一致起来。

因而,Scala不仅仅是比Java更好,它彻底便是面向目标言语和函数式言语的结合体,而且还有比Java更简练高雅的语法,它所编译成的字节码运转功率也和Java平起平坐(有时分要相对快一点,有时分要慢一点)。

◆Cedric said...

对不住James,但我真的不以为Java社区现已对Scala 这样杂乱的东西做好了预备。由于它的确是杂乱的,不论你是不是这样以为。此外,我以为像你自己这样的语法规划者有时分太广博了,所作的判别也和咱们普通人不太相同(你不是把“单体”(monad)独自列出来吗?想想这个问题吧。)

许多时分,我都觉得Scala之于Java就像C++之于C。有着丰厚的功用,而且也辩称“你不用把握一切这些功用”,但到了实践开发中,往往加大了工程的杂乱程度。你能够去看看我在Scala每日邮件列表里发的代码片段,我想说的是:它比Java的泛型杂乱10倍。

和你相同,我也常常对Java的颤抖感到动火,不过假如我想在Java里到达类型揣度和静态类型的话,我就能够折中地写成"List< String> l = Lists.newArrayList()",这样就能根本上完结类型揣度。

我敢打赌,在五年内,Java将仍然是最主要的JVM言语,但仍是会有一帮人在发起Scala是一个更好的代替。

朴实从规划视点看,Fan更简略招引Java社区的开发人员参加,由于它不像Scala那样需求跨过那么杂乱的门槛。可是 1).NET兼容性问题让我忧虑这言语会不会被削弱。 2)我置疑Andy和Frank没有在他们的IDE上做满足的尽力。

◆Tom Flaherty said...

可贵的好文章!在我最近所作的演示中我就暗示过一个相似的观念,便是说Scala未来或许会代替Java。我的主要依据是强类型是完结一个安稳根底体系的要害,而其它弱类型动态言语也只要在这个安稳的根底体系上才干完结。而依据现在所知,Scala几乎无所不能。我真得感谢你的深入分析和你引荐的材料。

【相关阅览】

  1. Groovy创始人:Java面对完结 Scala将取而代之
  2. Scala怎么改动了我的编程风格:从指令式到函数式
  3. Scala的类型体系 比Java更灵敏
  4. Java程序员,你为什么要重视Scala
  5. Scala编程言语
转载请说明出处
知优网 » Scala替代Java?或许吗?热议仍继续不断(scala与java)

发表评论

您需要后才能发表评论