Java™ 编程语言的历史
1995 年 5 月 23 日,John Gage,Sun Microsystems 科学办公室主任,以及Marc Andreesen,Netscape 的联合创始人兼执行副总裁,在 SunWorldTM 的观众面前宣布,Java 技术并非神话,它将被纳入Netscape Navigator。[1]
当时,Java 的总人数不到 30 人。[1] 这个团队将在接下来的十年中塑造未来,没有人知道未来会发生什么。从在火星上运行无人驾驶车辆到成为大多数消费电子产品的运行环境,例如有线电视机顶盒、VCR、烤面包机和PDA,[2] Java 已经走过了漫长的道路,从它的起源开始。让我们看看它是如何开始的。
在 Java 成为编程语言之前,C++ 是该行业的主导力量。Java 创建者的主要目标是创造一种语言,可以解决 C++ 提供的大部分功能,同时摆脱早期语言中的一些繁琐任务。
从 1972 年到 1991 年,计算机硬件经历了性能和价格革命。性能更好、速度更快的硬件以越来越低的价格提供,对大型复杂软件的需求呈指数级增长。为了满足这种需求,发明了新的开发技术。
C 语言由Dennis Ritchie 于 1972 年开发,用了十年时间成为 PC 和类似平台上程序员中最流行的语言(其他语言,如 COBOL 和 FORTRAN,主导大型机市场)。但是,随着时间的推移,程序员发现用 C 语言编程变得很乏味,因为它的结构语法很繁琐。[3] 虽然人们试图解决这个问题,但后来才引入了一种新的开发理念,叫做面向对象编程 (OOP)。通过 OOP,人们可以编写可以重复使用的代码,而无需一遍又一遍地重写代码。1979 年,Bjarne Stroustrup 开发了 C++,它是对 C 语言的扩展,其中包含 OOP 基本原理和功能。Sun 通过销售 Java 企业系统 等专业产品的许可证来从 Java 中获利。
1990 年 12 月,一个项目在幕后启动,旨在创建一种编程工具,可以取代 C 和 C++ 编程语言。工程师Patrick Naughton 对 Sun 的 C++ 和 C API (应用程序编程接口) 和工具的状态感到非常沮丧。当他考虑转向NeXT 时,他得到了一个参与新技术的机会,隐形项目开始了,除了他之外没有人知道。
当James Gosling 和 Mike Sheridan 加入 Patrick 时,这个隐形项目后来被命名为绿色项目。[1] 当绿色项目开始时,参与该项目的工程师开始更清楚地了解该项目的未来。它不再旨在创造一种比现有语言更强大的新语言,而是旨在针对计算机以外的设备。
该项目由 13 人组成,他们在加州门洛帕克 Sand Hill Road 上的一间小办公室开始工作。这个团队后来被称为绿色团队。他们参与的项目由 Sun Microsystems 委托,以预测和规划计算领域的“下一波浪潮”。对于该团队来说,这至少意味着一个重要趋势,即数字控制的消费设备和计算机的融合。[1]
团队开始考虑用一个更好的版本,一个更快的版本,一个更灵敏的版本来代替 C++。但是他们到目前为止还没有想到的是,他们所追求的语言必须是为资源有限的嵌入式系统开发的。一个嵌入式系统是一个规模很小的计算机系统,只要求其设计中包含很少的功能。对于这样的系统,C++或任何后继者似乎都太大了,因为当时所有语言都需要比预期更大的占位符。因此,团队必须以不同的方式思考,才能解决所有这些问题。
Sun Microsystems 的联合创始人 Bill Joy 在一篇名为Further 的论文中,为 Sun 的工程师设想了将 Mesa 和 C 的强大功能结合起来的语言。Gosling 开始收集想法,开始着手改进 C++,并将其命名为“C++ ++ --”,这是一个关于该语言名称进化结构的双关语。++ 和 -- 分别代表添加和删除内容。他很快就放弃了这个名字,并将其称为Oak[1],以他办公室外的树木命名。
姓名 | GT | FP | JP | 详细信息 |
---|---|---|---|---|
Lisa Friendly | Yes | Yes | FirstPerson 员工和 Java 产品组成员 | |
John Gage | Sun Microsystems 科学办公室(主任) | |||
James Gosling | Yes | Yes | Yes | Java 技术的首席工程师和主要架构师 |
Bill Joy | Sun Microsystems 的联合创始人兼副总裁;UNIX® 操作系统伯克利版本的首席设计师 | |||
Jonni Kanerva | Yes | Java 产品组员工,Java FAQ1 的作者 | ||
Tim Lindholm | Yes | Yes | FirstPerson 员工和 Java 产品组成员 | |
Scott McNealy | Sun Microsystems 的董事长、总裁兼首席执行官 | |||
Patrick Naughton | Yes | Yes | Green Team 成员,FirstPerson 联合创始人 | |
George Paolini | Sun Java 软件部门的企业营销(主任) | |||
Kim Polese | Yes | FirstPerson 产品营销 | ||
Lisa Poulson | Java 技术的公共关系总监(博雅公关) | |||
Wayne Rosing | Yes | FirstPerson 总裁 | ||
Eric Schmidt | 前 Sun Microsystems 首席技术官 | |||
Mike Sheridan | Yes | Green Team 成员 |
一个想法的消亡,另一个想法的诞生
[edit | edit source]到目前为止,Oak 项目取得了重大进展,但到了 1993 年,人们看到了机顶盒、交互式电视和 PDA 的消亡。这是一次彻底的失败,迫使发明者重新思考他们的想法。只有奇迹才能让这个项目取得成功。而这样的奇迹正在等待人们的期待。
美国国家超级计算应用中心(NCSA)在去年刚刚发布了其新的商业互联网网络浏览器。该团队现在将重点转移到了他们认为“下一波”计算将出现的地方——互联网。然后,团队深入研究了创建相同可嵌入技术的领域,以便在网络浏览器空间中使用它,将其称为applet——一个小应用程序。考虑到所有这些因素,该团队创建了一个列表,其中包含了针对 C++ 问题的特性。在他们看来,这个项目应该...
- ... 应该是简单的,并从中收集经过测试的基础知识和早期语言中的特性,
- ... 具有与语言捆绑在一起的基本和高级功能的标准 API 集,
- ... 摆脱需要直接操作硬件(在本例中为内存)的概念,以使语言安全,
- ... 独立于平台,并且可以为每个平台编写一次(产生了WORA 习语),
- ... 能够开箱即用地操作网络编程,
- ... 能够嵌入到网络浏览器中,以及...
- ... 能够让一个程序同时执行多个任务,并同时执行多个操作。
该团队现在需要一个合适的标识,他们决定将他们创建的新技术命名为Java,为互联网繁荣 ushering a new generation of products. 这个项目的一个副产品是一个名为 "Duke" 的卡通人物,由 Joe Parlang 创建,后来成为它的标识。
最终在 SunWorldTM 大会上,Andreesen 向大众展示了这项新技术。随着互联网兴趣和宣传的爆发,Java 迅速获得了广泛认可,人们对它成为浏览器和消费类应用程序的主要软件的期望越来越高。[2]
最初 Java 是 Sun Microsystems 的财产,但后来它被发布为开源软件;“Java”一词是 Sun Microsystems 的商标。Sun 于 2006 年 11 月发布了其 HotSpot 虚拟机和编译器的源代码,并于 2007 年 5 月发布了大多数类库的源代码。有些部分缺失,因为它们属于第三方,而不是 Sun Microsystems。发布的部分是在GNU 通用公共许可证条款下发布的,这是一种自由软件许可证。
版本
[edit | edit source]与 C 和 C++ 不同,Java 的发展相当近。在这里,我们将快速回顾一下 Java 随着时间的推移所经历的发展路径。
初始发布(1.0 版和 1.1 版)
[edit | edit source]Java 最初于 1996 年发布,面向Solaris、Windows、Mac OS Classic 和Linux。Java 最初作为 Java 开发工具包 1.0(JDK 1.0)发布。它包括 Java 运行时(虚拟机和类库),以及开发工具(例如,Java 编译器)。后来,Sun 还提供了一个仅运行时的软件包,称为 Java 运行时环境(JRE)。但是,第一个名字仍然存在,因此人们通常用其 JDK 版本来指代特定版本的 Java(例如,JDK 1.0)。
Java 2(1.2 版)
[edit | edit source]1.2 版于 1998 年发布,是对先前版本的快速修复,标志着 Java 的新起点。1.2 版及更高版本的 JDK 通常也被称为Java 2。例如,JDK 1.4 的官方名称是Java(TM) 2 Platform, Standard Edition 版本 1.4。
- 主要变化包括
- 重写事件处理(添加事件监听器)
- 更改线程同步
- 引入 JIT——即时编译器
Kestrel(Java 1.3)
[edit | edit source]于 2000 年 5 月 8 日发布。最显著的变化是
- 包含 HotSpot JVM(HotSpot JVM 最初于 1999 年 4 月为 J2SE 1.2 JVM 发布)
- RMI 被修改为支持与 CORBA 的可选兼容性
- JavaSound
- Java 命名和目录接口 (JNDI) 包含在核心库中(以前作为扩展提供)
- Java 平台调试器体系结构 (JPDA)
- 合成代理类
Merlin(Java 1.4)
[edit | edit source]Java 1.4 于 2002 年 2 月 6 日发布,通过扩展语言功能和可用 API,提高了程序员的生产力
- 断言
- 正则表达式
- XML 处理
- 加密和安全套接字层 (SSL)
- 非阻塞 I/O (NIO)
- 日志记录
Tiger(1.5.0 版;Java SE 5)
[edit | edit source]于 2004 年 9 月发布
- 主要变化包括
- 泛型——为集合提供编译时类型安全:并消除强制转换的繁琐操作。
- 自动装箱/拆箱——消除在基本类型(如 int)和包装类型(如 Integer)之间手动转换的繁琐操作。
- 增强型 for——使用集合缩短 for 循环。
- 静态导入——允许您导入类的所有静态部分。
- 注解/元数据 - 使工具能够从源代码中的注解生成代码和部署描述符。这将导致一种“声明式”编程风格,程序员说明应该做什么,而工具则发出执行该操作的代码。可以通过源代码解析或使用 Java 5 中添加的额外反射 API 来检查注解。
- JVM 改进 - 现在大多数运行时库被映射到内存中作为内存映像,而不是从一系列类文件加载。现在,大部分运行时库将在多个 JVM 实例之间共享。
于 2006 年 12 月 11 日发布。
Java SE 6 中的新功能
- Web 服务 - 对编写 XML Web 服务客户端应用程序的一流支持。
- 脚本 - 您现在可以混合使用 JavaScript 技术源代码,这对于原型设计很有用。当您拥有具有各种技能的团队时,这也很有用。更高级的开发人员可以插入他们自己的脚本引擎,并将他们喜欢的脚本语言与 Java 代码混合使用,以满足他们的需求。
- 数据库 - 在开发数据库应用程序时,不再需要查找和配置您自己的 JDBC 数据库。开发人员还将获得更新的 JDBC 4.0,这是一个经过充分使用的 API,其中包含许多重要的改进,例如对 XML 作为 SQL 数据类型的特殊支持,以及将二进制大型对象 (BLOB) 和字符大型对象 (CLOB) 更好地集成到 API 中。
- 更多桌面 API - GUI 开发人员获得了许多新技巧,例如广受欢迎的最新加入的 SwingWorker 实用程序,可以帮助您在 GUI 应用程序中进行线程操作、JTable 排序和过滤,以及一个用于快速启动屏幕的新工具,以安抚不耐烦的用户。
- 监控和管理 - 这里最重要的是,您不需要对启动进行任何特殊操作,就可以使用 Java SE 平台中的任何监控和管理工具进行按需连接。
- 编译器访问 - 实际上是针对为 Java 开发创建工具的人员以及需要按需生成大量类的框架(如 JavaServer Pages (JSP) 或个人主页构建工具包 (PHP) 引擎),编译器 API 为 javac 打开了程序访问权限,以便进行动态生成的 Java 代码的进程内编译。编译器 API 不直接面向日常开发人员,而是面向那些被尖叫的内心极客震耳欲聋的人,卷起袖子试一试。而我们其他人将很乐意从使用此 API 的工具和改进的 Java 框架中受益。
- 可插拔注解允许程序员编写注解处理器,以便它可以在 javac 编译之前语义上分析您的代码。例如,您可以编写一个注解处理器,用于验证您的程序是否遵守命名约定。
- 桌面部署 - 最终,Java SE 6 将 Java 插件技术和 Java WebStart 引擎统一起来,这很有道理。Java WebStart 应用程序的安装得到了急需的改造。
- 安全 - Java SE 6 通过提供各种新的方法来访问平台本机安全服务,简化了安全管理员的工作,例如 Microsoft Windows 上的本机公钥基础设施 (PKI) 和加密服务,用于安全身份验证和通信,Java 通用安全服务 (Java GSS) 和 Kerberos 服务,用于身份验证,以及访问 LDAP 服务器,用于验证用户身份。
- -lities:质量、兼容性、稳定性 - 错误修复…
于 2011 年 7 月 28 日发布。
Java 7 的功能添加包括
- 对动态语言的 JVM 支持,遵循目前在多语言虚拟机上进行的原型设计工作
- 压缩的 64 位指针在 Java 6 中使用 -XX:+UseCompressedOops 可用
- 小的语言更改(在名为 Coin 的项目下分组)
- switch 中的字符串
- try 语句中的自动资源管理
- 改进泛型实例创建的类型推断
- 简化的可变参数方法声明
- 二进制整数文字
- 允许在数字文字中使用下划线
- 捕获多个异常类型以及通过改进的类型检查重新抛出异常
- JSR 166 下的并发实用程序
- 新的文件 I/O 库,以增强平台独立性并添加对元数据和符号链接的支持。新包是 java.nio.file 和 java.nio.file.attribute
- 对椭圆曲线密码算法的库级支持
- 用于 Java 2D 的 XRender 管道,它可以改进对现代 GPU 特定功能的处理
- 用于最初计划在 Java 版本 6u10 中发布的图形功能的新平台 API
- 对新网络协议(包括 SCTP 和 Sockets Direct Protocol)的增强库级支持
- 对 XML 和 Unicode 的上游更新
Lambda(Java 的 lambda 函数实现)、Jigsaw(Java 的模块实现)以及 Coin 的一部分被从 Java 7 中删除。
Java 8 于 2014 年 3 月 18 日发布,其中包含一些原本计划用于 Java 7 但后来推迟的功能。
功能开发是按照 JDK 增强提案 (JEP) 来组织的。
- JSR 335、JEP 126:对 lambda 表达式(正式名称为 lambda 表达式;非正式名称为闭包)的语言级支持,在 Lambda 项目下,允许在接口中添加方法而不破坏现有的实现。在 Java 社区中一直存在关于是否添加对 lambda 表达式的支持的争论。支持 lambda 表达式还可以提高对元素流的功能式操作的性能,例如对集合进行 MapReduce 风格的转换。默认方法允许 API 的作者向接口添加新方法,而不会破坏使用它的旧代码。虽然这不是他们的主要目的,但默认方法也允许行为(但不是状态)的多重继承。
- JSR 223、JEP 174:Nashorn 项目,一个 JavaScript 运行时,允许开发人员在应用程序中嵌入 JavaScript 代码
- JSR 308、JEP 104:Java 类型上的注解
- 无符号整数算术
- JSR 337、JEP 120:重复注解
- JSR 310、JEP 150:日期和时间 API
- JEP 178:静态链接的 JNI 库
- JEP 153:启动 JavaFX 应用程序(直接启动 JavaFX 应用程序 JAR 文件)
- JEP 122:删除永久代