编程思想碰撞 Scala不是改良的Java
Scala 2.8的发布又一次带来Scala和Java区别与联系的热烈讨论。Scala编程语言拥有所有Java的语言特征,而且还支持所有的新兴的有趣的概念,例如闭包,higher-kinded类型,内联XML。如果你要创建一个JVM上的新项目,你是否会考虑使用Scala?
Scala编程环境非常的有意思,在2.8版本中,编译器会为带有unboxed的基本数据类型的函数编译出多个版本——这样泛型函数就免去了性能昂贵的unboxing和boxing操作了。
Scala允许操作符重载,通过它隐含的机制,你甚至能在实例化后的对象里动态的添加新的方法。
这些功能使你编码时感到更方便。你基本上不需要再显式的把数组和其它的序列类型区分开,不需要把未封装的double类型和其它数字类型区分开。JVM上的数组、基本数据类型和其它相关类型的“平常化“在某种程度上减少了使用这些类型的复杂度。
虽然与Scala的第一次亲密接触会让你感觉到Java如影随形,但这些理念从根本上与Java之所以成为Java的原因相抵触。Scala把自己定位为旨在以一种简洁、优雅的方式表现常见编程模式的多范式编程语言。Java从文化上反对这些理念:Java慎重的简单。 Java设计团队研究了“现代”C和C++语言的各个方面后才决定了在现代面向对象编程语言环境中哪些功能特征应该被取消,同时又要保留C++相类似的语法。
特别的,一个已知的原则,任何事情都必须非常的直接明了: C和C++里一个主要的麻烦是,你需要在大量的语境中去理解他人的代码:在理解一段程序之前,你必须阅读所有相关的头文件,所有相关的#defines, 所有相关的typedefs。本质上,使用#defines和typedefs编程会导致每个程序员都像是在发明一种新编程语言,只有开发的人自己能理 解,这种情况不符合好的编程过程的设计目标。
这种对好的编程过程的理念正是Scala极力反对的。在核心中集成领域特定语言(domain specific languages)的能力被Scala当作一种积极因素被提倡。
按我的观点,判断好的编程过程的依据应该考虑是否能产生好的结果这个因素。HotJava实验失败后,我们应该承认,所有的三种主要的web浏 览器(Mozilla Gecko, Webkit, 和 Internet Explorer)都是用C++写成的,这是人们根据结果来选择编程语言的行为,而不是根据了一种习惯经验。
Java被认为是从小语言慢慢长壮大的,是一种从Lisp和Smalltalk之类的语言获取了积累经验的果实。 Scala自豪于拥有强大的higher-kinded类型,Java自豪于去除了多重继承。它们更本不是相互的竞争者:它们的文化取向差异巨大。