二十年前的 5 月 23 日,Java 在 Solaris 操作系统上发布了首个 alpha 版本,它带来了一门全新的语言和一个虚拟机,这款虚拟机承诺代码能够“一次编写、到处运行”。虽然直到 1996 年才发布了 Java 的 1.0 版本,但 95 年 5 月 23 日的这次发布还是为编程语言世界带来了一次巨大的变革,并且很快坐上了 TIOBE 编程语言排行榜的头把交椅,从此之后,它与 C 和 C++ 始终牢牢占据着榜单的顶部。
Java 最早于 1991 年是以 C++ 变体的形式出现的,但很快就转变为一门全新的语言 Oak,成为 Green 项目的一部分。这一项目的目标是抽象出一种虚拟机,可以在机顶盒上的嵌入式硬件中运行。虽然当时机顶盒并没有成为 Sun Microsystems 公司的主要战略方向,但 Java 不久后却回归到了嵌入式硬件的领域。早在 1992 年,它就曾作为一种操作系统应用在 PDA 设备上,显示出它的前景和希望。但直到它被移植为面向计算机的一门通用编程语言之后,它才开始真正名扬天下。1994 年,Oak 更名为 Java,这是为了满足商业标识的需求,在 Java 生态系统中随之出现了一系列与咖啡相关的双关语作为技术名称,而在类文件格式中出现的 0xCAFEBABE 这个魔法值也开始为人所知。
在 1995 年时,Java 最初在 Solaris 系统上实现了 alpha 发布,一个月后又发布在 Windows 系统上。这在当时本应是无人过问的小事,但一个关键的事件改变了它的命运。在 1995 年 5 月举办的 Sun World 大会上发布了 HotJava 浏览器(其中引入了对 Applet 的支持),随后 Marc Andreessen 宣布 Netscape 将集成 Java,并在当年 9 月发布的 Netscape Navigator 2.0 中提供内嵌的下载支持,它允许使用早期 alpha 版本的 JDK 创建可以在早期的互联网网站中运行的跨平台的 applet,并对其进行测试,而当时还没有其它工具能够实现这一点。在当时,LiveScript 语言在短短几天之内就设计出来了,它的用途是实现交互式网页(当时被称为动态 HTML 或 DHTML),为了赶上 Java 的潮流,它被重命名为 JavaScript,这一名称也被沿用至今。
1996 年 1 月,Java 1.0 版本正式发布了。虽然最初的版本中存在一些 bug,但好在 Java 1.0.2 很快推出了,并成为 Java 历史上一个重要的里程碑。Java 1.1 版本在不久之后的 1997 年 2 月问世了,其中引入了通过 JDBC 连接数据库的功能。随着互联网覆盖群体的不断扩大,以及通过 applet 使用 Java 的便利性,迎来了将 java 作为企业级编程语言的时代。并且,Java 1.1 版本引入了即时编译器这一重要特性,使得代码有了更快的执行速度。不过在相当一段时间之后,开发者才不再将 Java 当作一门“解释型语言”。
Java 1.2 版本于 1998 年 12 月发布,它首次对这门语言进行了一系列重大更新,包括内部类的引入。它也使 Java 版本号首次产生了中断,出现了 Java 2 这种说法,并且随后又成为 J2EE(随之又产生了 J2SE)。Java 1.2 也同时引入了 Swing 作为它的一个关键组件。其实在 Java 1.1 中就可以使用这个组件了,在 com.sun.swing 下面它作为了一个可选的下载项,但在 Java 1.2 中为它创建了一个新的 javax 包命名空间(用于区分它与“核心”Java 库)。Swing 是由 Netscape 与 Sun 共同推出的,它最初被称为 Java 基础类库(Java Foundation Class,JFC)。Java 1.2 同时也派生了 J2ME,这是一种跨平台的编程环境,可用于低功耗的设备、以及当时只具备有限功能的 LCD 屏幕和实体按键的(非智能)手机上。Java 在移动电话上的应用是成功的,但对于这个编程环境的后续更新疲软无力,并且也缺乏与手机特性(例如联系人、红外端口等等)的集成,因此 J2ME 应用更倾向于用于简单的游戏上,而缺乏更广泛的实用性。(多年之后,Java 再次出现在移动电话上,但并不是使用 JVM,而是一个专属于 Android 的变种。)
随着 JVM 支持的改善,Java 也在继续进化。随后出现了支持 Java 1.3 的 Hotspot(于 2000 年 5 月发布)以及支持 Java 1.4 的 JavaWebStart(于 2002 年 2 月发布)。但直到 Java 1.5(于 2004 年 9 月发布)才出现了编程语言方面的重大变革,即泛型的引入。它允许例如 List 和 Map 这样的容器类型指定它们所包含对象的类型,但为了对之前版本保持向后兼容,在编译期不得不选择消除类型信息,因此在运行时无法看到类型信息。之后出现的语言,例如 C#就从这一失误中吸取了经验,它们可以做到在运行时同样保持类型信息。
Java 1.6(在 2006 年 12 月发布,如今被称为 Java 6)并没有为语言带来重大的新特性,反倒是开始陷入困境的一个转折点。在 Java 1.6 版本发布之后,由于 Sun Microsystem 公司陷入了长期的经济问题,最终在 2010 年被 Oracle 收购,因此大大推迟了新版本的发布。这段时间所有的外部工作几乎完全停滞不前,期间只是零星地推出了几个安全补丁。
Java 7(于 2011 年 7 月发布)的推出证明 Oracle 遵守了它的承诺,为 Java 带来了新生。这一版本第三次为 Java 语言带来了重大的新语言特性。其中有一些简单的语法特性,例如允许在数字中使用下划线以及空菱形操作符(<>)减少了编写 Java 程序时的一些不便之处。同时一些其它改动,例如允许在 switch 语句中使用字符串,以及 try-with-resources 语法的引入虽然只是小改动,但对于减少代码的冗长度非常实用。Java 7 也在字符码创建之后首次引入了新的字节码操作符 invokedynamic,虽然在 Java 语言中大部分情况下都不会用到它。
Java 8(在 2014 年 3 月发布)同样带来了重大的新特性,包括对 lambda 的支持,对日期与时间 API 的功能也增强了很多,对垃圾回收的性能也进行了改进,并且移除了 permgen 区。
在即将到来的 Java 版本 9 中(预计于 2016 年 9 月发布),将带来更多针对运行时的重大变更,包括性能与大小的改进。由于 Java依然在TIOBE 榜单上处于领先地位,很显然,它在今后许多年还将继续绽放光芒。
对于Java 初期的专注方向——嵌入式硬件来说,虽然当时的机顶盒与PDA 并没有发展起来,但JVM 与Java 语言却存在于每个移动电话的SIM 卡中,其中运行着的 JavaCard 程序遍布在全球超过90 亿台的设备上。Java 还运行在每一台蓝光播放器中,使它的网络进一步延伸了。
Oracle 创建了一个记录 Java 历史重大事件年表的网站,以及一个 Java 20 周年纪念的页面,以庆祝这一伟大时刻。
查看英文原文: Java Turns 20
感谢夏雪对本文的审校。
给InfoQ 中文站投稿或者参与内容翻译工作,请邮件至 editors@cn.infoq.com 。也欢迎大家通过新浪微博( @InfoQ , @丁晓昀),微信(微信号: InfoQChina )关注我们,并与我们的编辑和其他读者朋友交流(欢迎加入 InfoQ 读者交流群)。
评论