【编程语言】Java夯实基础(一):Java的起源与发展

编程知识 更新时间:2023-04-16 00:56:18

Java的起源与发展

  • 前言
  • 一、发展早期
  • 二、版本历史
  • 三、版本迭代
  • 总结


前言

1990年代初,任职于Sun微系统的詹姆斯·高斯林等人开发了Java语言的雏形Oak,当时的目标是开发一款应用在家用电器等小型系统上的编程语言。由于这些智能化家电的市场需求没有预期的高,Sun公司便放弃了这项计划。随着1990年代互联网的发展,Sun公司看见Oak在互联网上应用的前景,于是决定改造Oak,之后在1995年5月以Java为名称正式发布这款编程语言。Java伴随着互联网的迅猛发展而发展,逐渐成为重要的网络编程语言。


一、发展早期

这款语言最初只是Sun公司在1990年12月开始研究的一个内部项目。Sun公司的一个叫做帕特里克·诺顿的工程师被公司自己开发的C++和C语言编译器搞得焦头烂额,因为其中的API极其难用。帕特里克决定改用NeXT,同时他也得到了进入公司的“Stealth计划”项目的机会。

“Stealth计划”后来改名为“Green计划”,詹姆斯·高斯林和麦克·舍林丹(Mike Sheridan)也加入了帕特里克的工作小组。他们和其他几个工程师一起在加利福尼亚州门罗帕克市沙丘路的一个小工作室里面研究开发新技术,瞄准下一代智能家电的程序设计,Sun公司预料未来科技将在家用电器领域大显身手。团队最初考虑使用C++语言,但是很多成员包括Sun公司的首席科学家比尔·乔伊,发现C++和可用的API在某些方面存在很大问题。

工作小组使用的是嵌入式系统,可以用的资源极其有限。很多成员发现C++太复杂以至很多开发者经常错误使用。他们发现C++缺少垃圾回收系统,还有可移植的安全性、分布程序设计、和多线程功能。最后,他们想要一种易于移植到各种设备上的平台。

根据可用的资金,乔伊决定开发一种集C语言和Mesa语言于一成的新语言,在一份报告上,乔伊把它叫做“未来”,他提议Sun公司的工程师应该在C++的基础上,开发一种面向对象的环境。最初,高斯林试图修改和扩展C++的功能,他自己称这种新语言为C++ ++ --[来源请求],但是后来他放弃了。他将要创造出一种全新的语言,被他命名为“Oak”(橡树),以他的办公室外的橡树命名。

就像很多开发新技术的秘密工程一样,工作小组没日没夜地工作到了1993年的夏天,他们能够演示新平台的一部分了,包括Green操作系统,Oak的程序设计语言,类库及其硬件。最初的尝试是面向一种类PDA设备,被命名为Star7,这种设备有鲜艳的图形界面和被称为“Duke”的智能代理来帮助用户。1992年12月3日,这台设备进行了展示。

同年11月,Green计划被转化成了“FirstPerson有限公司”,它是一个Sun公司的全资子公司,团队也被重新安排到了帕洛阿尔托。FirstPerson团队对建造一种高度交互的设备感兴趣,当时代华纳发布了一个关于电视机顶盒的征求提议书时,FirstPerson改变了他们的目标,作为对征求意见书的响应,提出了一个机顶盒平台的提议。但是有线电视业界觉得FirstPerson的平台给予用户过多的控制权,因此FirstPerson的投标败给了SGI。与3DO公司的另外一笔关于机顶盒的交易也没有成功,由于他们的平台不能在电视工业产生任何效益,公司被并回Sun公司。

后来由于商标搜索显示Oak已被一家显卡制造商注册。于是Oak被改名为Java。

二、版本历史

版本发布日期最终免费公开更新时间最后延伸支持日期
JDK Beta1995??
JDK 1.01996 年 1 月??
JDK 1.11997 年 2 月??
J2SE 1.21998 年 12 月??
J2SE 1.32000 年 5 月??
J2SE 1.42002 年 2 月2008 年 10 月2013 年 2 月
J2SE 5.02004 年 9 月2009 年 11 月2015 年 4 月
Java SE 62006 年 12 月2013 年 4 月2018 年 12 月
Java SE 72011 年 7 月2015 年 4 月2022 年 7 月
Java SE 8 (LTS)2014 年 3 月Oracle 于 2019 年 1 月停止更新(商用) Oracle 于 2030 年 12 月停止更新(非商用) AdoptOpenJDK 于 2026 年 5 月或之后停止更新 Amazon Corretto 于 2026 年 5 月或之后停止更新2030 年 12 月
Java SE 92017 年 9 月OpenJDK 于 2018 年 3 月停止更新不适用
Java SE 102018 年 3 月OpenJDK 于 2018 年 9 月停止更新不适用
Java SE 11 (LTS)2018 年 9 月AdoptOpenJDK 于 2024 年 10 月或之后停止更新 Amazon Corretto 于 2027 年 9 月或之后停止更新2026 年 9 月
Java SE 122019 年 3 月OpenJDK 于 2019 年 9 月停止更新不适用
Java SE 132019 年 9 月OpenJDK 于 2020 年 3 月停止更新不适用
Java SE 142020 年 3 月OpenJDK 于 2020 年 9 月停止更新不适用
Java SE 152020 年 9 月OpenJDK 于 2021 年 3 月停止更新不适用
Java SE 162021 年 3 月OpenJDK 于 2021 年 9 月停止更新不适用
Java SE 17 (LTS)2021 年 9 月待定待定

三、版本迭代

JDK Alpha 和 Beta:第一个1995年发布的alpha和beta Java公开版本,API和ABI非常不稳定。 支持Java Web浏览器被取名为WebRunner。
JDK 1.0:第一个版本于1996年1月23日发布,叫做为Oak。而真正第一个稳定的版本JDK 1.0.2,被称作Java 1。
JDK 1.11997年2月19日发布。新增了如下内容:

  • AWT事件模型大规模重新编制
  • 加入了内部类别
  • JavaBeans
  • JDBC
  • RMI
  • 能够支持自理的反射能力,在运行时不可能有修改。
  • 针对 Microsoft Windows 平台上运作的版本,附带由Symantec为JavaSoft生产的JIT编译器
  • 支持国际化和Unicode,该功能源自Taligent

J2SE 1.21998年12月8日发布,代号为Playground(竞技场)。 该版本到J2SE 5.0为止的后续版本被更名为Java 2,而版本名称“J2SE”(Java 2平台,标准版)取代JDK以区别J2EE(Java 2平台,企业版) 和J2ME(Java 2 Platform,Micro Edition)基础平台。这是Java的一个非常重要的版本,它将Java平台的大小增加至原先的三倍,在59个程序包中达到了1520个类。主要增加包括:

  • strictfp 关键字
  • 主类别中集成了Swing图像化API
  • 首次为Sun提供的JVM配备JIT编译器
  • Java plug-in(即 Java Applet)
  • Java IDL,一个与CORBA互通的接口描述语言实现
  • Java集合框架

J2SE 1.32000年5月8日,工程代号为Kestrel(美洲红隼)的JDK 1.3发布,这个版本中最著名的改变包括:

  • 包含了HotSpot JVM(HotSpot JVM第一次被发布是在1999年4月,名为J2SE 1.2 JVM)
  • 为了支持与CORBA的选择兼容性而修改了RMI
  • Java命名和目录接口(Java Naming and Directory Interface,缩写JNDI)包含在主程序库中(先前为扩展组件的形式)
  • Java Platform Debugger Architecture (JPDA)
  • JavaSound
  • 用于实现动态代理的类

J2SE 1.42002年2月13日,JDK 1.4发布,工程代号为Merlin(灰背隼)。JDK 1.4同样发布了很多新的技术特性,如正则表达式、异常链、NIO、日志类、XML解析器和XSLT转换器等。Java 1.4开放支源和安全性更新于2008年10月终止。Oracle客户的付费的安全性更新也在2013年2月结束。
J2SE 5.0:代号为Tiger(老虎)。这个在2004年9月30日发布的版本原本以1.5编号,也就是仍然使用内部版本编号。这个数字被改变是为了“更好地反映成熟度、稳定性、可扩展性和 J2SE 的安全水准”。这个版本是在JSR 176底下被开发。Tiger增加了若干个重要的新语言功能:

  • 泛型(Generics): 为集合提供编译期间 (静态) 类型安全,且不须为大多数类型转换 (类型转换) (规范在 JSR 14)
  • 元数据(Metadata): 也称作注解。让语言结构(像是类别和方法)能够用额外的资料标记,可以由元数据意识工具处理(规范在 JSR 175)
  • 自动封装与解封装: 在基本的资料类型(如 int)和基本的的外覆类别 (如 Integer) 之间能够自动转换 (规范在 JSR 201)
  • 枚举(Enumerations): 以 enum 关键字创造出一种类型安全,有排序值的清单(如Day.MONDAY、 Day.TUESDAY 等);以前这只能透过非类型安全的恒定整数或自行撰写的类别来达成 (类型安全的枚举模式) (规范在JSR 201)
  • 可变参数函数(Varargs):方法的最后一个参数现在可以用一个类型名称加上三个点宣告(如:void drawtext(String… lines));在调用代码中,类型中参数里任何的数字可以被使用,而它们再放在一个数组来传递给方法,或是其它的调用代码可以传递那个类型的数组
  • 强化 for each 循环:for 循环的语法被用特别的语法扩展了,适用于数组或 Iterable,用于迭代每个成员,如基本的 Collection 类别 (规范在 JSR 201(页面存档备份,存于互联网档案馆))
    改进多线程 Java 程序的运行语义;新的 Java 存储器模型改善了复杂性、 有效性和以前的规格性能
  • 静态导入

Java SE 6:代号为Mustang(野马)。版本发布于2006年12月11日,Sun把原本的名称“J2SE”改为“Java SE”,然后再从版本号中去掉“.0”,而开发者内部编号仍然是1.6.0。这个版本是根据JSR 270(页面存档备份,存于互联网档案馆)开发的。本版本包含的主要更改:

  • 支持旧的Win9x版本下降;非正式地,Java 6 Update 7是Java的最后一个显示为在这些版本的Windows上工作的版本。 这被认为是因为在Update 10版本中的主要更改。
  • 脚本语言支持(Scripting Language Support)(JSR 223):用于与脚本语言紧密集成的通用API,以及内置的Mozilla JavaScript Rhino集成。
  • 核心平台和Swing性能显著的改进。
  • 透过JAX-WS改善的网络服务支持(JSR 224).
  • 支持JDBC 4.0 (JSR 221).
  • Java编译器API (JSR 199):允许Java程序以写程序的方式选择和调用Java编译器的API。
  • 将JAXB升级到版本2.0:包括StAX解析器的集成。
  • 支持pluggable annotations (JSR 269).
  • 改善许多GUI,像是SwingWorker在API中的集成,表格排序和筛选,以及真正的Swing双缓冲(消除模糊区域效果)。
  • 包含JVM改善:同步和编译器性能优化,新算法和对现有垃圾收集算法的升级以及应用程序引导性能。

Java SE 7:代号为Dolphin(海豚),是一个重大的更新,在 2011年7月7日亮相,并在2011年7月28日开放给开发者使用。发展时期被分类成十三个重要阶段,最后一个阶段在2011年6月6日完成。在 Java 7 中新增的功能包括:

  • JVM本身对动态语言的支持:新的invokedynamic字节码指令(JSR-292(页面存档备份,存于互联网档案馆)),与多语言虚拟机(Multi Language Virtual Machine)原型
  • 64位指针压缩(Java 6 中可以使用 XX:+UseCompressedOops 开启)
  • 一些语言方面的小改变(在Coin项目下的一个小群体)
  • JSR 166下的并发实用工具
  • 新的文件 I/O 程序库 (JSR 203 定义) 增加多重文件的支持、文件原始资料和符号链接。新的包为:java.nio.file、java.nio.file.attribute和java.nio.file.spi
  • 使用 Timsort 来为集合与数组排序,取代归并排序
  • 对椭圆曲线加密算法增加标准库级别的支持
  • 一个给Java 2D的XRender传递途径,改进了现代GPUs特有的功能的处理
  • 用于图形功能的新平台API(最初在版本6u10中的实现为不支持的API)
  • 增强了对新网络通信协议(包括SCTP和Sockets Direct Protocol)的标准库级别的支持
  • 更新对XML和Unicode的支持,以符合最新标准
  • Java部署规则集

Java SE 8:Java 8 于2014年3月18日发布,包含了一些原本被项目在 Java 7却延迟的功能。这些功能改进在 JDK Enhancement Proposals (JEPs) 的指导下得到了集成:

  • JSR 335,JEP 126:Lambda项目中提供的语言级匿名函数支持(官方称为 lambda 表达式,非官方亦称闭包);添加默认方法(虚拟扩展组件方法),以允许在不破坏兼容性的情况下向现有接口中新增方法。Java社区中曾经有过针对是否要加入 lambda 表达式支持的辩论。稍后Sun公司宣布 lambda 表达式将会包含在Java中,并请社区协助改善该特性。支持lambda表达式使得针对流中元素的函数式操作成为可能,由此可以实现由 MapReduce 启发的函数式集合操作。默认方法允许API作者添加新的方法到现有接口上,而不会破坏旧的代码中。默认方法还使得多重继承的行为 (不是状态)成为可能,但默认方法的设计意图并非在此。
  • JSR 223,JEP 174:Nashorn项目,一个 JavaScript 运行时,它允许开发人员在应用程序中嵌入 JavaScript 代码
  • JSR 308,JEP 104:在 Java 类型上的注解
  • 无符号整数算术
  • JSR 337,JEP 120:重复注解
  • JSR 310,JEP 150:日期和时间 API,基于Joda-Time日期时间处理库的实现。
  • JEP 178:静态链接 JNI 程序库
  • JEP 153:执行 JavaFX 应用程序(直接执行 JavaFX 的应用程序的 JAR 包)
  • JEP 122:移除了虚拟机内存管理中的永久世代
    Java 8 不再支持 Windows XP,但JDK 8 第 25 版更新仍然可以在 Windows XP安装和运行。先前JDK 8的更新版本可以在XP中运行,但必须通过强制解压安装程序来进行安装。

Java SE 9:在2011年的JavaOne中,Oracle讨论了一些他们希望在2016年于Java 9中发布的功能。Java 9 应当对千兆级堆拥有更好的支持,同时能够更好地集成本机代码,且拥有新的垃圾收集器G1和能够自我调节的JVM。2016年初,Java 9 的发布被重新定为2017年3月;2017年3月时,发布日期又被拖延至2017年7月;后来又因Java执行委员会对Jigsaw项目实现的分歧而最终定为2017年9月21日,在此期间Oracle回应了部分疑问,并对一些重要的技术问题进行了修正。在2017年6月的最后几天,JCP对拟议的模块系统方案达成了共识。

  • JSR 376:在Jigsaw项目中将JDK模块化
  • JEP 222:jshell:Java Shell(一个 Java 交互式顶层构件)
  • JEP 295:AOT编译(通过 Graal VM 实现)
  • JEP 268:XML Catalogs
  • JEP 266:更多的并发更新。[243]包含响应式流的Java实现,及其部分替代品java.util.concurrent.Flow。
  • JEP 193:变量句柄:定义一个标准方法来调用java.util.concurrent.atomic和sun.misc.Unsafe操作的等价物。
  • JEP 282:jlink:Java链接器。该工具可以为模块生成一个包含了其所有依赖项的自定义运行时映像,同时允许生成一个包括运行它的JVM的可执行文件。
  • JavaDB被移出JDK
  • JEP 263:高DPI图像:自动缩放与尺寸自适应。

Java SE 10:OpenJDK 10于2018年3月20日发布。此次更新包含以下12个新特性:

  • JEP 286:局部变量类型推断
  • JEP 317:实验性的基于Java的JIT编译器。这是 Linux x64 下 Graal 动态编译器的集成。
  • JEP 310:应用程序类级别数据共享
  • JEP 322:基于时间的版本命名
  • JEP 307:适用于G1的多线程完全垃圾回收
  • JEP 304:垃圾回收器接口
  • JEP 314:更多的Unicode语言标签扩展
  • JEP 319:内置根证书
  • JEP 312:线程本地握手
  • JEP 316:在可选的内存设备上申请堆内存空间
  • JEP 313:删除本地代码头文件生成器javah
  • JEP 296:将所有JDK分支集成到同一个版本库中

Java SE 11:JDK 11于2018年9月25日发布。Java 11 包含如下更新:

  • JEP 181:针对嵌套成员的访问控制
  • JEP 309:动态类文件常量
  • JEP 315:利用 Aarch64 的特有架构改进其上的性能
  • JEP 318:Epsilon:无操作垃圾收集器
  • JEP 320:移除 Java EE 和 CORBA 模块
  • JEP 321:HTTP Client
  • JEP 323:lambda参数的局部变量语法
  • JEP 324:支持 Curve25519 和 Curve 448 密钥
  • JEP 327:Unicode 10
  • JEP 328:添加Java飞行记录器(JFR),其用于创建性能分析记录
  • JEP 329:ChaCha20 和 Poly1305 加密算法
  • JEP 330:运行单文件源码程序
  • JEP 331:低开销堆分析
  • JEP 332:支持 TLS 1.3
  • JEP 333:添加ZGC(一个可扩展的低延迟垃圾收集器)
  • JEP 335:弃用 Nashorn JavaScript 引擎
  • JEP 336:弃用 Pack200 相关的工具及 API

Java SE 12:JDK 12于2019年3月19日发布。该版本包含较多新特性,例如:

  • JEP 189:Shenandoah:一个实验性的低延迟垃圾收集器
  • JEP 230:细粒度性能评审包
  • JEP 325:Switch 表达式(预览阶段)
  • JEP 334:JVM Constants API
  • JEP 340:仅保留一个 AArch64 平台的移植
  • JEP 341:默认类数据共享归档
  • JEP 344:针对G1,提供可中止的混合垃圾收集
  • JEP 346:针对G1,及时释放已申请但未使用的内存

Java SE 13:JDK 13于2019年9月17日发布。该版本包含以下新特性以及很多的强化和很多的漏洞修补。

  • JEP-350: 动态 CDS 归档
  • JEP-351: ZGC: 取消提交未使用存储器
  • JEP-353: 重新实现旧版 Socket API
  • JEP-354: Switch 表达式(预览阶段)
  • JEP-355: 文本框(预览阶段)

Java SE 14:JDK 14发布于2020年3月17日。Java 14 包含了下方列出的新功能,以及“数百个小改进和数千个漏洞修复”。

  • JEP-305:使用 instanceof 的模式匹配(预览)
  • JEP-343:打包工具(孵化中)
  • JEP-345:在 G1 中,对不均匀的内存访问(NUMA)情况下的内存申请优化
  • JEP-349:JFR Event Streaming
  • JEP-352:使字节缓冲区能够映射到非易失性存储器上
  • JEP-358:有帮助的 NullPointerExceptions
  • JEP-359:记录类(预览)
  • JEP-361:Switch 表达式(标准)
  • JEP-362:弃用 Solaris 和 SPARC 平台上的移植版本
  • JEP-363:移除 Concurrent Mark Sweep (CMS) 垃圾收集器
  • JEP-364:适用于 macOS 的 ZGC
  • JEP-365:适用于 Windows 的 ZGC
  • JEP-366:弃用 ParallelScavenge + SerialOld 的垃圾收集器组合
  • JEP-367:移除 Pack200 相关的工具及 API
  • JEP-368:文本块(第二预览版本)
  • JEP-370:外部内存访问 API(孵化中)

Java SE 15:JDK 15发布于2020年9月15号,包含了下列新特性:

  • JEP-339:Edwards-Curve 数据签名算法(EdDSA)
  • JEP-360:封闭类(预览特性)
  • JEP-371:隐藏类
  • JEP-372:移除了 Nashorn JavaScript 脚本引擎、APIs,以及 jjs 工具
  • JEP-373:重新实现了老的 DatagramSocket API 接口
  • JEP-374:禁用和废除偏向锁
  • JEP-375:模式匹配(第二次预览)
  • JEP-377:ZGC:一个可伸缩、低延迟的垃圾回收器
  • JEP-378:文本块,是一个多行字符串,它可以避免使用大多数转义符号,自动以可预测的方式格式化字符串,并让开发人员在需要时可以控制格式。
  • JEP-379:Shenandoah:一个低停顿时间的垃圾回收器
  • JEP-381:移除了 Solaris 和 SPARC 端口
  • JEP-383:外部内存访问 API(二次孵化)
  • JEP-384:记录类(第二次预览)
  • JEP-385:废除 RMI 激活,以便在将来进行删除

Java SE 16:JDK 16发布于2021年3月17号,包含了下列新特性:

  • JEP-338:Vector API(孵化中)
  • JEP-347:启用了新的C++特性
  • JEP-357:从 Mercurial 迁移到 Git
  • JEP-369:迁移到GitHub
  • JEP-376:ZGC垃圾收集器
  • JEP-380:Unix域套接字通道
  • JEP-386:在x64和AArch64体系结构上,将JDK移植到Alpine Linux以及其它使用musl C库的Linxu发行版上。
  • JEP-387:Elastic Metaspace
  • JEP-388:将 JDK 移植到 Windows / AArch64平台。
  • JEP-389:外部链接器API(孵化中)
  • JEP-390:Warnings for Value-Based Classes
  • JEP-392:打包工具
  • JEP-393:外部内存访问 API (第三次孵化)
  • JEP-394:instanceof的模式匹配
  • JEP-395:记录类
  • JEP-396:默认情况下严格封装JDK
  • JEP-397:密封类,被final修饰的类,密封类不能被继承,防止了恶意的派生。

总结

了解了Java的发展历史,想必你一定会对这个当下非常热门的语言产生了浓厚的兴趣。相信我,Java并不难学,而且学好Java不仅能为我们装备一款强有力的武器,而且还能找到一份薪资不低的工作,何乐而不为呢?接下来,让我们一起走进Java的探索之旅!

上一节:Java夯实基础系列文章目录
下一节:开发环境配置

更多推荐

【编程语言】Java夯实基础(一):Java的起源与发展

本文发布于:2023-04-13 01:35:00,感谢您对本站的认可!
本文链接:https://www.elefans.com/category/jswz/9ac1f644c625c22e2adf6359a5f9f394.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
本文标签:夯实   起源   编程语言   基础   Java

发布评论

评论列表 (有 0 条评论)
草根站长

>www.elefans.com

编程频道|电子爱好者 - 技术资讯及电子产品介绍!

  • 71423文章数
  • 14阅读数
  • 0评论数