Java经常被拿来和Scala做比较,这两种语言的设计目的有什么不同?在未来,这两种语言是否可能发展方向完全一致?
Java和Scala是有着很大不同的语言。之前我们谈到过Java的设计哲学,现在我们可以来说一说Scala的设计思想,以及它们之间有什么不同。Scala最初是一门来自学术界的语言,最开始Martin Odersky创造的语言叫做Pizza,那时候Java还是版本4,这个时候Pizza开始逐渐加入了一些类似于Java范型的功能,Java 5中也加入了一些Pizza的功能作为范型。
Martin是一个很聪明的人,Scala也有很多很棒的设计。但是同时,这个语言也有自己的问题。有时候它被称为“厨房水槽”语言,可见人们对这门语言又爱又恨。这个比喻的意思是:水槽里面装了各种各样数量过多的东西。这确实是Scala的一个问题,它的功能太多了。有一条语言设计的准则,同时也是Java设计过程中的一个重要原则——保守。具体说来,就是每当你添加一个新特性的时候(《Java程序员修炼之道》14页谈到了了一个具体的例子),可能你也造成了新的问题。如果你的语言有200种特性,而这个时候你想再加入一个,我需要检验它和所有其他特性的交互情况。对于Scala来说,它总是频繁地加入新的特性。要想知道这些特性之间的交互情况是很困难的。就算Scala有一个很灵活,能够拥抱改变的社区,语言特性的变动也是件不容易的事。所以你会发现虽然Scala拥有很多优秀的工作性能,但是你需要决定哪些特性是你想要的,而哪些特性是你不能碰的。当你在团队中编程的时候,这不是个问题。真正的问题在于,现代社会的软件栈从来都不是仅仅依赖于代码,问题来自于函数库。有一些Scala特性的动作不仅影响目标对象,还会影响其他一些东西。Scala的特性越多,这些问题就更容易互相重叠。
另外,他们一直都纠结于二进制兼容的问题。Java、Sun以及Oracle一直都认为这是对Java来说最重要的设计理念,所以我可以用Java 1.0写程序,编译一下,放到Java 8的虚拟机中,仍然可以运行,而且运行速度会比以前快很多倍。而Scala从未做出这方面的承诺,哪怕就是上一个版本也会出现问题。在函数库空间中,这个问题就更严重了,我知道很多项目都放弃了Scala,就是因为每次只要升级函数库,整个系统就会崩溃。
所以说,这两种语言的设计思想很不相同。人们总是喜欢新鲜事物,第一个尝鲜的人也会第一个享受到很多好处,但是在更多的情况下,人们更愿意做第二个尝试的人。你可以观察第一个人犯下的错误,然后从中学习。而Java就是这样一个从别人的错误中学习的语言。我刚才提到过程序员的金字塔,我认为Scala并不适用于底层,它的作用更多在于为最顶层的程序员们激发思考。而Java是一种适用于整个金字塔的语言,而且它对底层和中层的程序员尤其适用。我相信在未来的很多年内都会有一个强大且健康的Scala社区,我也希望能和他们一起交换思想。但是我并不认为Scala会从一种小众语言成长成一种大众语言。现在地球上可能有上百个Scala程序员,但是这个数量顶多也就是Java程序员的百分之一,而这个比例很可能不会继续增长了。
22/2<12