一、积极看待 C++ 与 Java 的遗产
要理解 C++ 语言为什么既复杂难用,又有优秀的设计。是因为 C++的一切设计首要目标是为了兼容 C 语言。C++ 衰退到只会在某些特殊场合用到。
Java 也有类似的问题:
- 向后兼容性的约束始终是 Java 向伟大迈进的阻碍。
- 比如 “为了性能,必须引入基本类型”。应该坚守 “一切事物都是对象” 的原则,并在性能有要求时提供巧妙的底层操作能力。基于该思路,热点(hotspot)技术做到了。
- 还有无法直接使用浮点处理器来计算 超越函数(Java 是在软件层计算的)。
- 泛型的设计真的很难用等等
Java 是一门派生语言,来自于对 C++ 的改造,最主要的改动就是加入了虚拟机和垃圾收集机制。
Java 面向对象思想和 C++ 一样都是来自于 SmallTalk 语言。
Java 把所有内容都封装为对象不仅是一种负担,而且还会将许多程序设计推向错误的方向。
但是不可否认的是,面向对象编程思想在一些情况下依然十分有用。
但是不意味着 Java 语言是失败的语言,Java 将主流程序员带入了垃圾收集、虚拟机和统一错误处理模型的世界,尽管并不完美,但它让我们更上一层楼,准备好接纳更高级的语言了。
由于 JVM (其规范使之并不限于只支持某一门语言)的缘故,Java 已经使自己可以被轻而易举地替换掉了。现在任何人都可以创建一门新的语言,并在短时间内使其像 Java 一样高效地运行。但是在以前,对于一门新的语言来说,大部分开发时间往往花在实现正确、高效的编译器上。
例如:即出现了像 Scala 这样高级静态语言和各种动态语言,也出现了各种新语言和嫁接语言,
如 Groovy、Clojure、JRuby 和 Jython。
Java也终将会老去,就像 C++ 那样衰退到只会在某些特殊场合用到。但是 Java 为自己的替代品创造了一条非常平坦的道路,即使 Java 本身已经到了无法再进化的地步。
未来语言有两个参考点可以借鉴:
- 要么创造一种可以不断重构的文化(如 Python 和 Ruby做到的那样)
- 让竞争者可以在自己的基础之上茁壮成长,Java 做到了这点。
编程是一门管理复杂性的艺术
如果你了解了一门语言的不足之处和局限性,当你遇到某个语言特性不可用时,就不会被卡住,以致无法继续。同时,因为你已经知晓其局限性,所以就可以更好地进行程序设计。
下面这段话也提到了,Java 向后兼容的问题。
Java 本来有潜力成为一种卓越的程序设计语言,但可能有些为时过晚。一旦一种语言得到广泛应用,与现代代码尴尬的兼容性问题就摆在了人们面前。由于兼容性的需求,新增的一些特性就没有原有的特性那么精巧。 ——《Java 核心技术 卷一》 第12版
Java 并不只是一门语言,Java 是一个完整的平台。
Java 深受欢迎的原因如下:
- Java 是一个完整的平台,有一个庞大的库,其中包含了大量可重用的代码。
- 提供了诸如安全性、跨操作系统的可移植性。
- 以及自动垃圾收集等服务的执行环境。
二、关于 Java 的常见误解
误解:1、Java 将成为适用于所有平台的通用编程语言
从理论上讲,这是完全有可能的。但在实际中,某些领域其它语言由更出色的表现,比如,Objective C 和后来的 Swift 在 IOS 设备上就有着无可取代的地位。浏览器中的处理几乎完全由 JavaScript 掌控。Windows 程序通常都用 C++ 或 C# 编写。Java 在服务器端编程和跨平台客户端应用领域则很有优势。
误解:2、Java 是解释性的,因此对于关键应用速度太慢了
早期的 Java 确实是解释性的,现在的 Java 虚拟机使用了即时编译,因此用 Java 编写的 “热点” 代码运行速度与 C++ 相差无几,有些情况下甚至更快。
误解:3、Java 是一种非常容易学习的程序设计语言
像 Java 这种功能强大的语言大多都不太容易学习。首先必须将编写玩具式程序的轻松与开发实际项目的艰难区分开来。Java 类库包含数千个类和接口,还有数万个函数。好在,不需要知道其中每一个类或函数,不过,要想用 Java 解决实际问题,还是需要了解不少内容的。