Java语言的发展历程

 

 

前言

  自1946年2月14日世界上首款计算机ENAC问世,第一代计算机语言“机器语言”便诞生了,它使用的是最原始的穿孔卡片,这种卡片上使用的语言只有专家才能理解,与人类语言差别极大。这种语言本质上是计算机能识别的唯一语言,人类很难理解。为了能让人们更容易理解并编写,于是便有了第二代的“汇编语言”,相比机器语言,汇编语言大大前进了一步,尽管它还是太复杂,人们在使用时很容易出错误,但毕竟许多数码已经开始用字母来代替。简单的“0、1”数码谁也不会理解,但字母是人们能够阅读并拼写的。虽然第二代计算机语言仍然是“面向机器”的语言,但它已注定成为机器语言向更高级语言进化的桥梁。当计算机语言发展到第三代时,就进入了“面向人类”的语言阶段。你可以阅读、并直接用人类的语言来输入。对我们汉语来说,目前还不能用中文汉字来输入指令,这主要是因为中文的输入还没有一个非常好的手段。第三代语言被人们称之为“高级语言”。高级语言是一种接近于人们使用习惯的程序设计语言。它允许用英文写计算程序,程序中所使用的运算符号和运算公式,都和我们日常用的数学公式差不多。高级语言容易学习,通用性强,书写出的程序比较短,便于推广和交流,是很理想的一种程序设计语言。我们学习的就是第三代语言“高级语言“中的Java语言。

 

 

 

 

 

1.Java的诞生

   20世纪90年代,硬件领域出现了单片机式计算机系统,这种价格低廉的系统一出现就立即引起了自动控制领域人员的注意,因为使用它可以大幅度提升消费类电子产品(例如:电视机顶盒、面包烤箱、移动电话等)的智能化进度。Sun公司为了抢占先机,在1991年成立了一个名为“Green”(类似于绿色软件的意思)的项目小组,James Gosling、Patrick Naughton、Michael Sheridan和其他几个同事们一起组成的工作小组在加利福尼亚州门洛帕克市沙丘路的一个小工作室里面开始研究开发新技术,专攻计算机语言在消费类电子产品上嵌入式应用。

  由于C++所具有的优势,该项目组的研究人员首先考虑采用C++来编写程序。但对于硬件资源极其匮乏的单片式系统来说,C++所编写的程序过于庞大和复杂。另外由于消费类电子产品所采用的嵌入式处理器芯片的种类繁杂,如何让编写的程序跨平台运行也是个难题。为了解决困难,他们首先着眼于计算机语言的开发,假设了一种结构简单、符合嵌入式应用需要的硬件平台体系结构并为其制定了相应的规范,其中就定义了这种硬件平台的二进制机器码指令系统(即后来成为“字节码”的指令系统),以待语言开发成功后,能有半导体芯片生产商开发和生产这种硬件平台。对于新语言的设计,Sun公司研发人员并没有开发一种全新的语言,而是根据嵌入式软件的要求,对C++进行了改造,去除了C++上的一些不太实用及影响安全的成分,并结合嵌入式系统的实时性要求,开发出了一个名为“Oak”的面向对象语言。

  由于在开发Oak语言时,尚且不存在运行字节码的硬件平台,所以为了在开发时可以对这种语言进行实验研究,他们就在己有的硬件和软件平台基础上,按照自己所指定的规范,用软件建设了一个运行平台,整个系统除了比C++更加简单之外,没有太大区别。1992年的夏天,当Oak语言开发成功后,研究者们向硬件生产商进行演示了Green操作系统、Oak程序设计语言、类库和其硬件,以说服他们对Oak语言生产硬件芯片,但是,硬件生产商并未对此产生极大的热情。因为他们认为,在所有人对Oak语言还是一无所知的情况下就贸然生产硬件产品的风险实在是太大了,所以Oak语言也就因此缺乏硬件的支持而无法进入市场,从而被搁置了下来。

  1994年6、7月间,在经历了一场历时三天的讨论后,团队决定再一次改变努力的目标,这次他们决定将该技术应用于万维网上。他们认为随着Mosaic浏览器的到来,因特网正在向同样的高度互动的远景演变,而这一远景正是他们在有线电视网中看到的。作为原型,Patrick Naughton编写了一个小型万维网浏览器WebRunner。

  1995年,互联网的蓬勃发展给了Oak机会。业界为了使死板、单调的静态页面能够“灵活”起来,急需一种软件技术来开发一种程序,这种程序可以通过网络传播并且能够跨平台运行。于是,世界各大IT企业为此纷纷投入了巨大的人力、物力与财力。这个时候,Sun公司想起了那个被搁置很久的Oak,并且重新审视了那个用软件编写的实验平台,由于它是按照嵌入式系统硬件平台体系结构所进行编写的,所以非常小,特色适用于网络上传输,而Oak也是一种精简的语言,程序非常小,适合在网络上传输。Sun公司首先推出了可以嵌入网页并且可以随同网页在网络上传输Applet(一种将小程序嵌入到网页中进行执行的技术),并将Oak更名为“Java”。从此一个即好听又好记、具有强大的生命力的编程语言Java便诞生了。

  (在申请商标的时候也有这样一件趣事,Sun公司在申请Oak商标时发现Oak已经被别家公司使用了,所以James Gosling决定通过市场部门,请来了一个命名顾问,召开命名征集会。在命名征集会上,大家提出了很多名字。最后按大家的评选次序,将十几个名字排列成表,上报给商标律师。排在第一位的是Silk(丝绸)。尽管大家都喜欢这个名字,但遭到James Gosling的坚决反对而作罢。排在第二和第三的都没有通过律师这一关。James Gosling最喜欢的就是排在第三位的Lyric(抒情诗)。只有排在第四位的名字得到了所有人的认可和律师的通过,这个名字就是“Java”。那么是谁在命名征集会上提议叫“Java”的呢?Jame Gosling在接受采访时回忆道:“市场部组织了命名会,命名顾问主持了会议,我们喊叫着列出了一大堆名字。我记得第一个提议Java这个名字的是Mark Opperman”。Mark Opperman是在一家名叫“爪蛙咖啡”的咖啡店与同事品尝咖啡时得到灵感的。Java是印度尼西亚爪哇岛的英文名称,因盛产咖啡而闻名。国外的许多咖啡店用Java来命名或宣传,以彰显其咖啡的品质。Java语言中的许多库类名称,多与咖啡有关,如JavaBeans(咖啡豆)、NetBeans(网络豆)以及ObjectBeans (对象豆)等等。)

 

 

 

2.Java的历史

  1995年5月23日,Sun在Sun World会议上正式发布Java语言和HotJava浏览器。IBM、Apple、DEC、Adobe、HP、Oracle、Netscape和Microsoft等各大公司都纷纷停止了自己的相关开发项目,竞相购买了Java使用许可证,并为自己的产品开发了相应的Java平台。

 

  1996年1月,Sun公司发布了Java的第一个开发工具包(JDK1.0),这是Java发展历程中的重要里程碑,标志着Java成为一种独立的开发工具。

 

  1996年4月,10个最主要的操作系统供应商申明将在其产品中嵌入Java技术。

 

  1996年9月,约8.3万个网页应用了Java技术来制作。

 

  1996年10月,Sun公司发布了Java平台第一个即时编译器(JIT)。

 

  1997年2月18日,JDK1.1面世,在随后的三周时间里,达到了22万次的下载量。

 

  1997年4月2日,JavaOne会议召开,参与者逾一万人,创当时全球同类会议规模之纪录。

 

  1997年9月,JavaDeveloperConnection社区成员超过十万。

 

  1998年2月,JDK1.1被下载超过2,000,000次。

 

  1998年12月8,Java的企业平台Java EE正式发布。

 

  1999年6月,Sun公司发布第二代Java的三大版本:标准版J2SE(Java2 Standard Edition):应用于桌面环境、企业版J2EE(Java2 Enterprise Edition):应用于基于Java的应用服务器、微型版J2ME(Java2 Micro Edition):应用于移动、无线及有限资源的环境。Java2的发布,标志着Java的应用开始普及,是Java发展历程中的又一个里程碑。

 

  1999年4月27日,HotSpot虚拟机发布。HotSpot虚拟机发布时是作为JDK1.2的附加程序提供的,后来它成为了JDK1.3及之后所有版本的Sun JDK的默认虚拟机。

 

  2000年5月8日,JDK1.3发布。

 

  2000年5月29日,JDK1.4发布。获得Apple公司Mac OS的工业标准的支持。

 

  2001年6月5日,NOKIA宣布,到2003年将出售1亿部支持Java的手机。

 

  2001年9月24日,Java EE 1.3发布。

 

  2002年2月26日,J2SE1.4发布,自此Java的计算能力有了大幅提升,与J2SE1.3相比,其多了近62%的类与接口。在这些新特性当中,还提供了广泛的XML支持、安全套接字(Socket)支持(通过SSL与TLS协议)、全新的I/OAPI、正则表达式、日历与断言。

 

  2004年9月30日18:00PM,J2SE1.5发布,是Java语言发展史上的又一里程碑事件。为了表示这个版本的重要性,J2SE 1.5正式更名为Java SE 5.0(内部版本号:1.5.0),代号“Tiger”该版本是自1996年发布1.0版本以来最大的更新,其中包括泛型的支持、基本数据类型的自动装箱、改进的循环、枚举类型、格式化I/O及可变参数。

 

  2005年6月,在Java One大会上,Sun公司发布了Java SE 6。此时,Java的各个版本都已经更名,去掉了前些版本中的数字2,改为了Java。

 

  2006年11月13日,Sun公司宣布,将Java技术作为免费的软件对外发布。Sun公司正式发布Java平台标准版的第一批源代码,以及mini版本的可执行源代码。一直以来,Sun公司维持着大约2年发布一次JDK新版本的习惯。

 

  2007年3月,自起,全世界所有的开发人员均可对Java源代码进行修改。

 

  2009年4月20日,Oracle宣布将以每股9.5美元的价格收购Sun,该交易的总价值约为74亿美元。但Oracle通过收购Sun公司获得了两项软件资产:Java和Solaris。于是曾经代表一个时代的公司:Sun倒下了,不过Java的大旗依然“猎猎”作响。2007年11月,Google宣布推出一款基于Linux平台的开源手机操作系统:Android。Android的出现顺应了即将出现的移动互联网潮流,而且Android系统的用户体验非常好,因此迅速成为手机操作系统的中坚力量。Android平台使用了Dalvik虚拟机来运行.dex文件,Dalvik虚拟机的作用类似于JVM虚拟机,只是它并未遵守JVM规范而已。Android使用Java语言来开发应用程序,这也给了Java语言一个新的机会。在过去的岁月中,Java语言作为服务器端编程语言,已经取得了极大地成功;而Android平台的流行,则让Java语言获得了在客户端程序上大展拳脚的机会。

 

  2010年Java编程语言的创始人James Gosling从Oracle公司辞职。

 

  2011年7月28日,Oracle公司终于发布了Java 7,这次版本升级经过了将近5年时间。Java 7也是Oracle发布的第一个Java版本,引入了二进制整数、支持字符串的switch语句、菱形语法、多异常捕捉、自动关闭资源的try语句等新特性。

 

  2014年3月18日,Oracle公司发布了Java 8,这次版本升级为Java带来了全新的Lambda表达式。除此之外,Java 8还增加了大量新特性,这些新特性使得Java变得更加强大。

 

  2017年9月21日,Java 9发布。这其中较为显著的功能就是在JDK 7时期已经规划的Jigsaw模块化功能,为何屡次发布都未能如约而至,前期可能是技术埋坑,后面遭到了以IBM和RedHat联合的等JCP委员抵抗,否决模块化提案,这种做法无疑是革了模块化支持本身就比较好的IBM的命,面对如此抵抗,Oracle丝毫没有退让,宁愿摒弃JSR独立研发,也要推行Jigsaw的发展,如果成真,想必Java也会面临如Python2和Python3的巨大不同,好在最终达成一直协议,Java还是那个完整的Java。JDK 9还提供了JS Shell、JLink、JHSDB等增强。JDK 9之后,Java也以更加敏捷的交付方式如期而至,每年的3月和9月发布一个版本,美6个月发布一个版本,每三年一个LTS版本,目的是避免众多功能交付在一个捆绑JDK的风险,并且提出了孵化器模块(Incubator)和预览特性(Preview)两个概念。也是在这个版本中CMS开始被废弃。

 

  2018年3月21日,Java 10发布。主要对内部进行重构,统一源仓库,统一垃圾收集器接口,统一即时编译器接口(引入Graal几时编译器,这里也埋下一个伏笔),这些改进对于用户并不明显,但对后期的版本打下了良好的基础。

 

  2018年3月,同样发生了比较重要的一件事,Oracle正式宣布Java EE成为历史名称,曾经拥有着无数光辉的Java EE产品线(至今仍使用较为广泛的JDBC、JMS、Servlet等组件)被Oracle扫地出门,全部打包赠送给Eclipse基金会,并且不能使用Java商标,并且更名为Jakarta EE。

 

   2018年9月25日,Java 11发布。这也是一个LTS(long-term support)版本,包含17个JEP,同时被引入的还有ZGC这样革命性的垃圾收集器,好比G1的诞生,比G1又更具神秘感。同时Oracle也调整了JDK的授权许可证,把以前的商业许可证授权给OpenJDK,官方宣布同时发布两个JDK,一个是Oracle OpenJDK,一个是OracleJDK,共享大部分源码近乎一致,个人均可免费使用,OpenJDK有半年的更新支持,OracleJDK商用必须付费,且支持三年的更新。因此Java收费纯属谣言,商业用户如果想使用最新的版本支持就必须付费。

 

  2018年10月,自1996年以来每年一度的已经举办了22年的JavaOne大会,没有人预测到这也是最后一届,同年6月Java Mission Control的开发团队也被Oracle解散。

 

   2019年3月20日,JDK 12发布,RedHat接手了OpenJDK 8和OpenJDk 11的管理和维护权。在JDK 12中包含了8个JEP,主要有Switch表达式和JMH测试套件,最引人注目的就是Shenandoah垃圾收集器,作为首个在JDK 7以后非Oracle开发的垃圾收集器,其目标与ZGC一致,这种竞争关系,立马得到了Oracle的抵制,在OracleJDK中剔除代码,因此Oracle JDK和OpenJDK的隔离性又如历史在JDK9中开始重演,至于后续Java的发展,以及迎接的挑战也是任重而道远,这取决于Oracle的产品线的定制和JCP的决策了。

 

   2019年在9月17日,JDK 13发布,这个版本主要通过改善Java SE平台和JDK的性能,稳定性和安全性来提高开发人员的生产力。共包含了5个JEPs和一个Unicode 12.1的支持总共6大主要新特性。

   - Support for Unicode 12.1 java.lang.Character支持Unicode Character12.1库,相比12.0库新增554个字符。

   - JEP 351: ZGC Uncommit Unused Memory ZGC增强了对未使用堆内存返还操作系统的能力,ZGC对堆内存的控制能力也从4TB提升至16TB,这个版本对ZGC进行了性能的增强。

   - JEP 350: Dynamic CDS Archiving 动态归档能力,HostSpotVM对AppCDS的一个增强。

   - JEP 354: Switch Expressions (Preview)switch表达式的引入,在后面的JDK 17中又继续对其功能进行了增强。

   - JEP 355: Text Blocks (Preview)增加了Java语言对文本块的支持,但这只是作为一个预览性质的功能,通过""" """来放置多行代码。

   - JEP 353: Reimplement the Legacy Socket API 重新实现了java.net.Socket and java.net.ServerSocket 类提供的APIs。

 

   2020年3月17日,JDK 14发布,这个版本主要是对JDK历史版本的一些增强,也引入了一些新增的功能。

   - JEP 359: Records (Preview) 新增了java.lang.Record类,Record是一种轻量级的class,可以看做是数据结构体。Java作为面向对象的语言诞生以来,在大型项目中的优势就体现出来了,但是也有一点不好,过于繁琐,一个POJO JavaBean必须包含get、set等方法,Record主要就是解决这类问题的,类似于Lombok的功能。

   - JEP 365: ZGC on Windows

   - JEP 364: ZGC on macOS

   - JEP 345: NUMA-Aware Memory Allocation for G1 G1的NUMA感知内存分配。这样可以提高使用非均匀内存体系结构(NUMA)的大型计算机的性能。

   - JEP 349: JFR Event Streaming 通过启用工具以异步方式订阅Java Flight Recorder事件,这可以对JVM进行更实时的监视。

   - JEP 363: Remove the Concurrent Mark and Sweep (CMS) Garbage Collector,CMS作为一款主打老年代的并发垃圾收集器,虽然历任JDK中都没有被设置为默认的垃圾收集器,但是在解决STW问题时也是有着举足轻重的地位的,从JDK 7开始筹备到JDK 9作为默认的G1垃圾收集器,一度被认为CMS的升级版,在次CMS也开始走下历史舞台。

   - JEP 366: Deprecate the ParallelScavenge + SerialOld GC Combination 随着每一代JDk中对垃圾收集器的升级以及新的垃圾收集器的引入,ParallelScavenge + SerialOld(Oracle指出很少有人使用)组合的GC也被弃用了,并在不久的将来被移除,完成了自己的历史使命。

 

   2020年9月15日,JDK 15发布,按照规划路线,JDK 14也停止更新,JDK 15虽然不是LTS版本,但也引入了一些开创性的功能和对早期版本功能的一些优化。

   - JEP 371: Hidden Classes。

   - JEP 378: Text Blocks,在JDK 13已经发布的二次预览版本,对于文本块的支持非常友好。

   - JEP 377: ZGC A Scalable Low-Latency Garbage Collector (Production),这个支持应该算是比较重要的,相比于JDK 11作为实验性质而引入的ZGC,在这两年中ZGC现在已准备好用于生产,不再标记为实验特征,可以直接使用 -XX:+UseZGC开启ZGC,不再需要XX:+UnlockExperimentalVMOptions额外的配置。需要注意的是在OracleJDK中使用的是ZGC,而在OpenJDK中使用的是Shenandoah GC,使用命令-XX:+UseShenandoahGC开启。

 

   2021年3月16日,JDK 16发布,这部分依旧是一些功能的优化升级。

   - JEP 389: Foreign Linker API (Incubator)提供静态键入的纯-java访问本机代码的API。

   - JEP 393: Foreign-Memory Access API (Third Incubator)提供了操作外部内存能力的API。

   - JEP 380: Unix domain sockets java.nio.channels, SocketChannel和ServerSocketChannel新增了对UNIX套接字的支持。

   - JEP 338: Vector API (Incubator) 提供孵化器模块的初始迭代,JDK.INCUBATOR.Vector,以表达在运行时可靠地编译的向量计算到支持的CPU架构上的最佳矢量硬件指令,从而实现对等效标量计算的卓越性能。这一点在JDK 17上持续增强。

   - JEP 376: ZGC Concurrent Stack Processing,ZGC的并发标记,不同于CMS的标记,ZGC的标记只有三个阶段,且每一个阶段的操作,无论是标记还是清理都是并发操作,大大降低了STW的时间,几乎零延时。这也算是Java在垃圾回收中比较开创性的变革。

   - JEP 387: Elastic Metaspace,JDK16对元数据区切分为更小的内存块,并将不再使用的内存快速返还给操作系统,对于频繁加载和卸载类的应用来说这一优化可以产生大量的空闲内存,提升整个JVM的性能。

   - JEP 397: Sealed Classes (Second Preview),对JDK内部方法提供强制的封装,在JDK 17依然进行了升级优化。

   - JEP 395: Records,从JDK 14作为预览版被提供在,这里已经升级为正式版功能。

   - JEP 392: Packaging Tool,新的打包工具,在JDK 14中通过JEP343被提案,在JDK 15中被孵化,在JDK 16中被提升为正式支持使用,通过jpackage命令支持native可执行程序打包。

 

   2021年9月14日,JDK17发布,这也是在JDK 11之后的下一个LTS版本,JDK 17也是Java六个月发布节奏下的最新的长期支持(LTS)发布,主打安全、性能、稳定为特性,并且官方计划支持到2029年9月。在这个版本中包含了14个JEP更新。

   - JEP 356: Enhanced Pseudo-Random Number Generator 伪随机数增强器。

   - JEP 391: macOS AArch64 Port 新平台的支持。

   - JEP 406: Pattern Matching for switch (Preview) switch表达式,这可能是一个让switch翻身的功能。

   - JEP 410: Remove the Experimental AOT and JIT Compiler 移除了实验性质的AOT和JIT编译器。

   - JEP 411: Deprecate the Security Manager for Removal 弃用安全管理器。

   - JEP 412: Foreign Function and Memory API (Incubator) 外函数和内存相关的API,在JDK 14和JDK 15中引入的孵化API,使Java程序能够与Java运行时之外的代码和数据互操作,通过有效地调用外部函数(即,JVM之外的代码),并通过安全访问异物,这些API使Java程序能够调用本机库并进入本机数据而不提供Java本机接口(JNI)的脆性和复杂性。

   - JEP 414: Vector API (Second Incubator)允许表达在运行时可靠地编译的向量计算以支持的CPU架构上的优化矢量指令,从而实现优于等效标量计算的性能。

 

   2022年3月22日,JDK18发布。JDK18 不是一个长期支持版本,此次更新共带来 9 个新功能。

  - JEP 400:默认 UTF-8 字符编码。

   - JEP 408:简单的 Web服务器。

   - JEP 413:Javadoc 中支持代码片段。

   - JEP 416:使用方法句柄重新实现反射核心功能。

   - JEP 417:Vector API(三次孵化)。

   - JEP 418:互联网地址解析 SPI。

   - JEP 419:Foreign Function & Memory API (第二次孵化)。

   - JEP 420:switch 表达式(二次孵化)。

   - JEP 421:弃用删除相关。

 

   2022年9月20日,JDK19发布。JDK 19 将提供来自 OpenJDK Project Amber 的语言改进(记录模式和 switch 匹配模式);支持与非 Java 代码互操作的本机库增强功能(外部函数和内存 API)并利用来自 OpenJDK Project Panama 的向量指令(向量 API);以及 Project Loom(虚拟线程和结构化并发)的首个预览版。这将大大减少在 Java 中编写和维护高吞吐量并发应用的工作量。

   - JEP 405: 记录模式(预览版) — 支持用户嵌套记录模式和类型模式,以创建强大、声明性且可组合的数据导航和处理形式,从而扩展模式匹配,实现更复杂的数据查询。

   - JEP 427: Switch 模式匹配(第三预览版) — 根据某些模式来测试表达式,以进行 switch 表达式和语句的模式匹配,让用户可以安全、简洁地表达面向数据的复杂查询。

   - JEP 424: 外部函数和内存 API(预览版) — Java 程序可以更容易地与 Java 运行时之外的代码和数据进行互操作。通过有效调用外部函数(即 JVM 之外的代码),以及安全地访问外部内存(即不受 Java Virtual Machine [JVM] 管理的内存),API 可以通过纯 Java 开发模型调用本地库和处理原生数据,从而提高易用性、性能、灵活性和安全性。

   - JEP 426: 矢量 API(四次孵化阶段) — 允许以一种在运行时,可靠地编译为支持的 CPU 架构上的向量指令方式表达向量计算,从而实现优于等效标量计算的性能。

   - JEP 422: Linux/RISC-V 端口 — 通过将此端口集成到 JDK 主线存储库中中,以便于进行 Linux/RISC-V 实施。

   - JEP 425: 虚拟线程(预览版) — 通过向 Java 平台引入轻量级虚拟线程,显著减少编写、维护和观察高吞吐量并发应用的工作量。开发人员可以通过虚拟线程轻松使用现有的 JDK 工具和技术对并发应用进行故障排除、调试和分析。

   - JEP 428: 结构化并发(孵化器) — 通过简化多线程编程和将运行于不同线程中的多个任务视为一个工作单元,简化错误处理和取消工作并提高可靠性和可观测性。

 

   2023年3月21日,JDK20发布。JDK20带来了7个新特性。

   - JEP 429:作用域值(第一次孵化)。

   - JEP 432:记录模式(第二次预览)。

   - JEP 433:switch 模式匹配(第四次预览)。

   - JEP 434: 外部函数和内存 API(第二次预览)。

   - JEP 436: 虚拟线程(第二次预览)。

   - JEP 437: 结构化并发(第二次孵化)。

   - JEP 432:向量 API(第五次孵化)。

 

 

 

 

 

posted @ 2019-09-28 17:37  End_Unripe  阅读(2584)  评论(0)    收藏  举报