本节书摘来异步社区《Java学习指南》一书中的第1章,第1.3节,作者:【美】Patrick Niemeyer , Daniel Leuck,更多章节内容可以访问云栖社区“异步社区”公众号查看。
1.3 Java与其他语言的比较
Java虽是一种新语言,但是在其特性选择中,还汲取了其他语言多年以来的编程经验。花点时间来在较高的层面比较Java和其他语言是值得的,不管你是具有其他编程经验,还是需要搞清楚状况的新手,这都是有好处的。在本书中,我们不要求你具备任何特定编程语言的知识,并且当我们通过比较而提及其他语言的时候,我们希望这些说明是简单而直白的。如今一种通用语言至少要支持以下3点:可移植性、速度和安全性。图1-2显示了Java与其他几种流行语言的比较情况。
“Java非常类似于C或C++”,对此你可能早有耳闻,但除表层以外,事实却并非如此。你第一次看到Java代码时,将会看到其基本语法确实与C或C++ 很相近。但是它们的相似性也仅限于此。Java绝对不是C的一个换代产品,也不是C++的下一版本。如果对语言特性加以比较,可以看出Java与Smalltalk和Lisp等语言有着更多的共同之处。实际上,Java的实现与本地C相比真可谓有着天壤之别。
如果你熟悉当前的语言的发展情况,你将会注意到,C#这种流行的语言没有在比较之中。C#在很大程度上是Microsoft对Java的应战,应该承认C#有很多优点超越了Java。这两种平台具有一些共同的设计目标和方法(例如,使用虚拟机、字节码和沙箱等),而在其速度和安全特性方面也没有太大的差别。理论上讲,C#和Java一样可移植,但迄今为止支持它的平台要比Java少很多。和Java一样,C#在很大程度上也借鉴了C的语法,但是,实际上它更接近于动态语言。大多数Java开发者发现很容易学习C#,反之亦然。从其中一种语言迁移到另一种语言的大部分时间,都花在了学习标准库上。
不过,对于这些语言之间的表面级的相似性还是有必要加以说明。Java大量借用了C和C++ 的语法,因此你会看到许多熟悉的语言构造,其中包括反复出现的大括号和分号。Java还采纳了C的观点,即一个好的语言应当是简洁的;换句话说,它应当足够小而且相当规范,从而使程序员可以立即掌握该语言的所有功能。正如C利用库来加以扩展,也可以将Java类包添加到其核心语言组件中。
C已广获成功,这是因为它提供了一个特性相当丰富的编程环境,不仅性能很高,而且还有一定的可移植性。Java也尝试在功能、速度和可移植性三者之间取得平衡,但是它所采用的方式却截然不同。C是以功能换取可移植性;而Java则是靠牺牲速度来得到可移植性。另外,Java还解决了安全性问题,对此C则束手无策(尽管在现代系统中,很多安全问题都在操作系统和硬件中解决了)。
在早期阶段,即JIT和自适应编译尚未提出以前,Java相对于编译型语言要慢得多,并且批评者经常挂在嘴边的说法是,Java的速度永远也赶不上静态编译语言。但是正如前一节所述,目前对于同样的任务,Java与C或C++ 的性能完全可以比拟,并且那些批评也渐渐销声匿迹。ID软件的开源视频游戏引擎Quake2已经移植到Java平台上。如果Java对于第一人称战斗视频游戏来说已经够快了,那么,对于商业应用来说,它肯定也够快了。
诸如Perl、Python和Ruby这样的脚本语言越来越流行。尽管脚本语言对于安全的网络化应用并非完全不适合,但是大多数脚本语言都不是为严格的大型编程而设计的。脚本语言的诱人之处在于它们的动态性;对于快速开发,脚本语言则是功能非常强大的工具。
有一些脚本语言(如Perl)还提供了很强大的工具来完成文本处理任务,对此更通用的语言往往无法胜任。脚本语言也具有很好的可移植性,即使是在源代码的层级。
不过,不要将Java与JavaScript混为一谈!JavaScript是由Netscape等公司合作开发的一种基于对象的脚本语言。对于动态、交互式的Web的应用来说,它充当浏览器的本地语言。JavaScript的名字源自于它与Java的结合以及类似性,但仅此而已。尽管在浏览器之外也有了JavaScript编写的应用程序,但它还没有真正成为一种通用性的脚本语言。有关JavaScript的更多信息可以参阅David Flanagan所著的《JavaScript: The Definitive Guide》(由O'Reilly出版)。
不过脚本语言也存在一个问题,即它们对程序结构和数据类型有些过于随意。大多数脚本语言都不是面向对象的(Perl的最新版本和Python例外)。其类型系统也太过简化,而且无法提供复杂的变量和函数的作用域控制。这些特点使之无法适用于构建大型、模块化的应用。脚本语言的另一个问题在于速度,这些高级语言具有完全的解释性,这就使得其速度相当慢。
个别脚本语言的支持者可能对这些一概而论持不同意见,当然有些情况下他们是对的。脚本语言近年来也在改进,尤其是JavaScript,在其性能方面投入了大量的研究。但是,最根本的考虑是不可否认的:脚本语言是作为系统编程语言的一种松散的、缺乏结构的替代而产生的,由于众多的原因,对于较大的或复杂的项目来说,一般不是理想的选择,至少目前还不是。
Java提供了脚本语言的一个基本优点,即高度动态化,另外还增加了低级语言的一些额外优势。Java有一个强大的正则表达式API(Regular Expression API),从而使Java在处理文本方面可以与Perl媲美,此外,对集合的流编码、可变参数列表、方法的静态导入以及其他的语法糖等语言特性,也使得Java更为精炼。
一方面利用面向对象组件的递增开发,另一方面再结合Java的简单性,这样就可以快速地开发应用,并且能够很容易地加以调整。许多用户发现,只要严格地基于语言特性,较之于使用C或C++ 来说,用Java开发要快很多1。Java还为诸如构建GUI和完成网络通信等公共任务提供了一个大型核心类库。另外基于这些特性,Java还具有可伸缩性和软件工程特性,而这些特性本是更为静态的语言的优点。Java还提供了一个安全的结构,在此之上可以构建更高级的框架(甚至其他语言)。
如前所述,Java在设计上与Smalltalk和Lisp等语言存在相似性。不过,这些语言目前大多用作研究工具,而不是用来开发大型系统。其中一个原因是,它们从未开发针对操作系统服务的一种标准可移植绑定,如C标准类库或Java核心类等。Smalltalk编译为一种已解释字节码格式,而且可以动态地编译为本地码,这一点与Java相同。但是Java在设计上有所改进,即使用了一个字节码校验器以确保已编译Java代码的正确性。此校验器使Java的性能优于Smalltalk,因为Java代码需要更少的运行时检查。Java的字节码校验器还有助于解决安全性问题,对此Smalltalk则未有建树。
在本章余下的部分,我们将对Java语言做一个全面的概述。在此将说明哪些是Java的新内容,哪些则是借用的原有内容,并解释为什么存在这些差别。