Groovy创始人:Java面临终结 Scala将取而代之
Groovy创始人James Strachan前日在其博客(地址在Blogspot,未架好梯子前请勿随便点击)上发表了一篇文章,题目为《Scala将取代Java /javac?》。以下是正文部分的翻译:
Java是一种令人惊叹的复杂语言(它的语法规范长达600页,我怀疑到底有没有人能真正理解它),它有自动装箱(Autoboxing),空指针异常(NPE)往往就是这时抛出的。其中的基本类型(primitive type),字符串/文字/缓冲器/集合类(collections)以及数组缺乏多态性,以至于处理任何数据结构都需要冗长的语法;而且,由于Bean属性和对闭包支持的缺失(甚至在JDK 7里也仍然还不支持),这会让你的代码里充满了 try/catch/finally 这些语句(除非你使用框架和新的自定义API)。除了这些还有好多数不清的麻烦问题。Java倒是有类型推断(type inference)功能但却不用,使得我们要多输/读如此大量的代码。
这个问题在没有Java7后变得更加紧迫 (在Snorcle之后它变得更加重要:我不知道javac是不是要被jdkc 取而代之了?)。所以我猜javac可能已经走到了尽头,它看起来根本就没有什么进展或简化了。
那么,从长久来看,谁能取代javac 呢?当然,像Ruby,Groovy,Python,还有JavaScript这些动态语言在过去几年里很受欢迎――很多人喜欢他们。
我认为将来可能替代javac的就是Scala 。它实在太让我印象深刻了。我甚至可以诚实地说,如果有人在2003年把Martin Odersky,Lex Spoon以及Bill Venners写的那本《Programming in Scala》拿给我看了的话,那我根本就不会再去发明Groovy了。
那么,为什么我会看好Scala呢?Scala是静态类型的,它可以被编译成与Java同样快速的字节码,所以它的速度与Java不分上下(有时快一点,有时慢一点)。你可以看看 Scala 在与 groovy 或jruby一起进行测试时表现有多好。注意:速度并不是我们追求的唯一目标――有时候我们可能宁肯让代码慢上十倍,也要写得简洁一点;但是如果要取代javac,速度当然还是很重要的。
Scala已有类型推理(type inference)功能,因此它和Ruby/Groovy一样简洁,但是它完全是静态类型的。这是很有好处的,它使得理解代码、阅读代码以及编写文档都简单多了。在任何片段(token)/方法/符号上点击,你都可以跳转到相应的代码或文档中去浏览。不需要打那些怪异的补丁,也不用操心谁什么时候新增了一个方法――这对于那些需要一个团队一起长期开发的大项目是很有好处的。Scala似乎已经实现了动态语言(dynamic language)的那种简洁,而实际上它是完全静态类型的。所以,我根本不需要去记哪些魔术方法可用――或是在shell里运行脚本来查看这些对象――IDE/编译器在你编辑代码时就已经知道这些了。
Scala也有适当的混入(mixin)(特性(trait)) ,所以你不必去摆弄面向对象编程的缺陷来获得模块化的代码。如果你确实需要一些鸭子类型(duck typing),Scala甚至能为你提供构造类型(structural type)。
最让我印象深刻的一点就是它的核心语法极其精练简洁(它的语法手册只有大概Java的四分之一),但是其方式却更加强大和灵活,而且非常容易通过库来扩展,添加新的语义和功能。可以看看这个例子:Scala Actors。因此它非常适合用于创建嵌入式DSL或外部DSL 。有了它以后就真没必要再用Java,XPath ,XSLT,XQuery,JSP,JSTL,EL和SQL这些东西了――你可以在各种各样的场合使用DSL。
Scala确实需要花点时间去习惯――我承认第一次我看Scala时并不觉得顺眼――用了Java之后你就会习惯用一堆冗长的代码来做一点点事,刚开始时我们也都不会一看到几个符号就觉得有多惊讶。(我花了好长一段时间才习惯Scala里用_作“通配符”,因为在Scala里是用作标识符/方法)。
如果你一直在写Java,那么最开始确实会觉得Scala很不一样(如在声明方法/变量/参数时在类型或标识符上加上阶,虽然那样做的原因是为了能更方便地略去一多余的类型信息)。
例如,在Java中的写法:
List< String> list = new ArrayList< String>()
在Scala中的写法:
val list = new List[String]
或者,如果你要指定确切的类型的话:
val list : List[String] = new List[String]
但是如果你坚持用上一段时间,Scala优美的一在很快就显现出来。它对Java里的许多地方进行了简化,让你可以用非常简洁的代码就描述出意图,而不用花上大段代码去实现细节――同时还为你提供了一条迁移到函数式编程的不错途径,这对于编写并发和分布式程序是非常有利的。
我强烈建议你学习一下Scala:以开放的心态看看(当你的思维转过来后)你是否能发现它的美丽之处。
一些Scala资料的链接和在线演示文档
51CTO编辑推荐:Scala编程语言专题
◆我强烈推荐由 Martin Odersky,Lex Spoon 和 Bill Venners编写的《Programming in Scala》 一书。它非常好地介绍了Scala的特点以及设计时的选择。这本书相当厚,但是你可以先跳着读,必要时再深入细节。
◆《O'Reilly Scala book》这本书我只跳着读了一点,但是看起来也非常不错。
◆如果你想在短时间内就知道个大概语法,那么可以看看《Tour of Scala》。不过看了之后你也还得花上一些时间来真正理解为什么它跟Java会有这样那样的不同。
◆Martin Odersky 的JavaOne 2008上关于Scala的演说
◆Jonas Bonér在 Real-World Scala上作的报告
◆Gert's的 对他如何创建 Apache Camel DSL for Scala 的介绍
◆用于JDBC类型安全查询的一个Scala版LINQ,顺便再了解下DBC。
◆一份非常不错的报告,介绍了把 Scala 和 OSGi 与DSL结合使用
◆如何使用 Scala和XML( 语言里已经自带了处理XML,XPath , XSLT, XQuery的简洁语法)
◆这个例子显示了如何 创建的bean风格的属性 (或C #风格的getter函数)
◆创建一个 用Lift实现的聊天演示程序 或查看 Lift网站上的更详细介绍
如果你还有一些空余时间的话,这些视频资料也非常不错
◆Bill Venners所发表的The Feel of Scala
◆Lex Spoon所作的Scala: 把未来的语言带到JVM里来
好用的Scala框架和库
◆liftweb :Scala的rails
◆语言规范和ScalaTest for BDD 以及其它一些入门测试(literate testing)能让你体会到类型安全的DSL对于编写IDE友好 的简洁代码有多大帮助。
◆scalaz 是一个很有用的例程库。
另外,顺便说一下,对于那些像我一样一喜欢JAXRS的,现在可以通过jersey-lift模块使用lift模板和Jersey了。
作为这的实例,你可以看看RestMQ,这是一个我最近也参与了的开源项目,它旨在为面向消息的中间件提供REST风格的API和Web控制台,它也是基于JAXRS(Jersey),Scala,Lift构建的。
至于开发工具方面,有Ant/Maven插件,它带有一个交互式Scala控制台(REPL)和一个用于IDEA的IDE插件,还有Eclipse,NetBeans,以及TextMate,Emacs这些通用编辑器,都可以供你选择。在IDE插件的丰富程度上与Java还是有差距的,但是这些工具所提供的代码导航和自动补全功能还是很有用的。
我试用过NetBeans,Eclipse和IDEA这几个IDE上的插件,它们都各有优劣。看起来,Scala的追随者也因为这些工具分裂成了几派。如果要代码导航和自动补全,那我发现IDEA非常不错。当你打开一个Maven pom.xml,它好像就能非常好地自动解析代码,找出Scala源,那样你就能很方便地在任意的类型/方法以及它们对应的文档/源代码中跳转浏览。(通常你必须在运行/调试任务里手动添加Scala)。不过IDEA在错误代码高亮上并不是最好的。在作上一些弥补后,它们都能变得与对应的Java工具一样好用。试试这几个工具吧,找出你最习惯的那个。
Scala Nit
任何一种语言都有你喜欢的一面,也有你不是那么热衷的一面。Scala给你的最初印象可能确实是符号太多了点,但是你并不需要使用所有的这些符号――如果你喜欢的话,你可以继续沿用很多Java里的东西。但我想到了那个时候最好还是用符号来实现“特殊任务”以避免标识符冲突。
我对嵌套的引入声明不太感冒,使用_root_.java.util..List来把一个”全局“引入和相对引入区别开来。我还更愿意使用子引入。例如,如果你引入了com.acme.cheese.model.Foo,然后,为了引入model.impl.FooImpl,我就更喜欢用一个明确的相对前缀,就像:import _.impl.FooImpl。这对简化任务有一些好处,对于保持和Scala的简洁性就更有帮助了。
然而,和Java里大把的毛病相比,再考虑到Scala的优美,简洁和强大,Scala的这一些负面因素和根本不算什么了。
结语:
既然 MrJava(Adam Bien),MrJRuby(Charles Nutter) 和 MrGroovy(作者本人) 都认为Scala将会是javac的的替代者,那肯定是有些原因的。那你还在等什么呢?赶快去买《Programming in Scala》 或 《O'Reilly Scala book》一探究竟吧!
这篇博文发布后,立刻有很多Scala,Groovy和Java开发者进行了回复。Scala的创始人Martin Odersky也对这篇文章发表了自己的赞赏之词。以下是Martin的留言:
James,感谢你的认可!这对我来说意义重大。我相信,如果我们一起努力向Java开发者们展示现在在JVM上更加美好的语言选择,我们大家都会因此而得到好处。感谢你在这方面带了个好头。
根据我对Groovy的了解(很可惜的,我的了解没有你了解Scala那样多),它看起来并非是意图填补同一块领域的。Groovy的吸引力在于它是一个语法接近Java的动态脚本语言。Scala的吸引力在于它是一个强类型的,静态的,结合函数式和面向对象的语言。
此外还有很多精彩的评论,51CTO译者对这些评论进行了一些筛选,挑出部分翻译如下:
Scala的体验
去年,我在做一些调查项目时把Scala引进到了我的小Java车间里。
如今Scala成为了我们最主要的编程语言。
通过使用Scala,我们现在可以构建类型系统(type system),跟踪总结以前所做项目的经验教训,并用它来替代我们过去以模型为导向(model-driven)的开发方式。然后,我们利用函数分发(pass around functions)的特性来改进组件的参数化。
总之,对于建立可重用的组件,Scala提供了一套比Java更好的机制。
C#和Java?
我觉得你可以去看看C#。它解决了你在Java中遇到的许多问题。如果你不喜欢微软的话,就可以试试.NET的开源替代版本Mono。
有关Scala和F#
其实,在.NET平台里与Scala对应的语言并不是C#,而是F#。不管什么时候,我都更倾向于使用Scala,而不是F#,原因如下:
1 )在F#文化里,面向对象看起来并不重要。在所有讲F#的书里,都必定有一章介绍类,然后,剩余部分就是专门讲解函数式。相比之下,Odersky在发明Scala时,并没有照搬Java的这一套机制,而是通过对象类型、特性(trait)、增强的可见性规则(visibility rule)等概念扩展并超过了Java的这一套机制。Scala使得像我这样有根深蒂固面向对象思想的开发人员觉得很舒适,它提供的函数式语法特性让我可以用来把代码变得非常简洁。
2 )F#比Scala看起来更接近人类语言,初看起来这似乎是好事。不幸的是,由于开发者很少需要写类型说明(type annotation),大部分代码里也都没写,这就使得代码变得更加难于理解。在Scala里,至少要声明参数类型,而且最好也声明一个方法的返回类型,除了那些一目了然的情况。
3 )F#一直力求尽量往OCAML的语法靠拢,所以它在语法也真是没有什么创新之处。而Scala则是博取众长,吸纳了各种语言的优点。此外,它还让人感觉有些机制并不是必须的,而是为了让开发者更好地表达意图而加入的。通过加入隐式转换(implicit conversion),析取器(extractor)这些功能,Martin从我这里得到了很大的帮助。
4 )在我看来,Java程序员学会Scala比从C#到F#的过渡要容易得多。大体上来说,原因是Java程序员不需要花很大的代价入门,Scala可以直接被当作一门少了些模板(boilerplate)的Java使用。当程序员渐渐熟练后,他就可以开始发掘函数式编程的威力了。在其它任何的面向对象/函数式编程语言里我都找不出可以这样过渡学习的。
Groovy盖棺定论了?
我们有一个面向最终用户的数据处理软件,然后我们选择的是Groovy (而没用Jython和JRuby )来作为实现各种功能扩展(从对变量编写公式到编写脚本)的途径。你们在开发Groovy所写的代码很多都是粘合代码(glue code)(对核心语言起补充作用)。我们充分利用Groovy所支持的这些特性与MS Office产品和Web服务进行整合。我真的希望,如果你们的开发团队更中意Scala的话,也请尽量让我们到时候在Scala里也能用上这些有用的库。
James Strachan对上文的回复
我不认为任何一种主要的JVM语言会消失,肯定会一直有一大帮人继续维护Groovy, Jruby, Cojure, Jython, Rhino等。
JVM中最大的一点好处就是这些语言很容易共存,重用另一种语言的代码也非常容易。因此,只要相信大众的选择,就不用担心会选错开发语言。
而且我也并不认为Scala会是Ruby/Groovy/Fan这些动态语言的替代者;大多数情况下性能还是很重要的。对于一个快速、静态类型的编译器来说,过去Java显然是第一选择――但是现在,Scala才是首选――这是因为Java已经显出老态了。(它可能永远也不会支持闭包,永远也不会考虑支持类型推断等新特性)。
自从发现了类型推断的威力之后,我实际上越来越觉得动态类型(就是很简洁的代码实现功能)的动机变得越来越难以琢磨了。比如说,你可以用Scala写一些脚本,它就会像Ruby/Groovy一样进入”读取-执行-打印 循环“(Read-Evaluate-Print Loop, REPL)。
但是我发这篇文章的目的并不是要挑起Scala拥护者和Ruby/Grovy/Clojure/JavaScript这些动态语言支持者之间的战争――我只是想让被Java一叶障目的开发者们意识到,这个世上已经有了比Java更好的静态类型语言:这门语言有他们所想要的全部功能(还附带有Java最需要增强的功能)。所有这一切,都能在这门语言里用简洁、优美的代码表示出来(尽管这门语言和Java确定有些不太一样,并且需要你经历一个学习曲线)。
附录:有关Scala编程语言的其他言论
◆Java的不足可以比作大量的毛疣,那么同样在Scala中,这些地方正是表现了Scala的美、简化和强大。――James Strachan
◆在一个社区(java.net booth)举办的和James Gosling对话会议上,一个与会者问了一个非常有意思的问题:“除了Java,现在你会把哪种语言运行于JVM之上?”。答案是惊人地快速简洁:Scala。――Java之父James Gosling