JAVA发展史

294 阅读10分钟

JAVA 发展史(上)

Oak

1991年, 就在James Gosling从IBM跳槽到Sun公司没多久,就和几个同事一起负责了名为"Green 计划"的项目。这个项目的目标是设计一个“程序框架”, 能让这个框架运行在各种消费型电子产品上。当时这个”程序框架“的名字就叫Oak, 不过这个项目在当时太超前了, 进展的很不理想。

James Gosling毕业之后就去IBM工作了,因为不受重视就跳槽到Sun公司。2009年,Oracle被甲骨文收购以后,他就从甲骨文离职了。2011年加入了Google, 没干几个月就离职了。离职后去Scala公司当技术顾问。他是被公认的"Java之父"。

Write Once, Run Anywhere

直至1995年,随着互联网潮流的兴起,Oak迅速找到了适合自身发展的市场定位。也是同一年Oak改名为Java,并且在SunWorld大会上发布了Java1.0版本。Java语言首次提出了“Write Once, Run Anywhere” 的口号。

Sun Classic VM

1996年1月, JDK 1.0发布。Java语言有了第一个正式版本的运行环境——一个纯解释执行的Java虚拟机(Sun Classic VM)。JDK 1.0的代表技术还包括:AWT、Applet。

同年的5月,Sun公司还举办了首届JavaOne大会。也是从这一年开始,JavaOne成为全世界数百万Java开发者每一年的技术盛会。 而这一年,也已经有数十个操作系统和计算机供应商在其产品中嵌入Java技术,同时大约有8.5万个网页应用了Java技术制作。

JDK 1.10 ~ 1.18

从1997年到1999年, JDK 1.1共发布了9个JDK版本。最有代表性的是JDK 1.1版本,这个版本中包含了很多最基础的、也是大家耳熟能详的”技术支撑点“,比较有代表性的如:Jar文件格式、JDBC、JavaBeans、RMI。Java语言在语法上也有所增强,如内部类和反射。

Playground

1998年, JDK出现了一个里程碑式的版本, 就是工程代号为Playground的JDK 1.2。Sun在这个版本把Java技术体系拆分出三个方向: 面向桌面应用开发的J2SE(Standard Edition), 面向企业级开发的J2EE(Enterprise Edition), 面向手机等移动终端开发的J2ME(Micro Edition)。

在这个版本中出现的代表性技术非常多, 如EJB、Java Plugin-in、Java IDL、Swing等,并且这个版本中JVM第一次内置的JIT(just in time)即时编译器。在语言和API层面,Java添加了strictfp关键字, Java类库添加了至今也普遍使用的Collections集合类。

HotSpot诞生

1999年,HotSpot诞生了!HotSpot利用了JIT及自适应优化技术(自动查找性能热点并进行动态优化,这也是HotSpot名字的由来)来提高性能。

HotSpot不是Sun公司自研的虚拟机。HotSpot起初是由一家小公司开发,由于表现优异,97年被Sun收购。后来HotSpot就成为了JDK 1.3及以后所有的JDK版本的默认Java虚拟机。

上文提到了Sun Classic JVM 是一个纯解释性的虚拟机,HotSpot是利用了JIT技术的的虚拟机,这里就扩展讲一下编译器和解释器的区别。

解释器和编译器

编译器: 将源代码直接编译成机器码, 即可执行代码。运行过程不需要依赖编译器。如c/c++。
解释器: 逐行解释源代码,并解释成机器码执行。在运行过程中需要依赖解释器。

由于解释器逐行解释代码太慢,很多高级语言对其做了优化,主要有三种运行方式:

  • 纯解释器: 直接解析源代码。如Shell语言
  • 静态编译+解释器: 运行前将源代码编译成一些有效率的字节码,在运行时由解释器解释并执行这些字节码。如python语言。
  • 静态编译+解释器+及时编译(JIT): 运行前将源代码编译成一些有效率的字节码, 在运行时由解释器解释并执行字节码。为了提高执行效率, 虚拟机会在运行过程中对热点代码进行优化,把它编译成本地代码(机器码),这样就不要频繁解释了。如JAVA。

区分, 编译器是运行前进行编译,也叫静态编译: JIT是在运行中进行编译, 也叫动态编译。

JIT

Kestrel

2000年,工程代号为Kestrel的JDK 1.3发布。JDK 1.3的改进主要体现在Java类库上(如数学运算和新的Timer API), JNDI服务从1.3开始被作为一项平台级服务, 使用CORBA IIOP来实现RMI通信协议,等等。

自JDK 1.3开始, Sun公司维持着稳定的开发节奏;大约每隔两年发布一个JDK主版本,以动物命名。

Merlin

2002年, JDK 1.4同样带来了很多新的技术特性, 如正则表达式、异常链、NIO、日志API、XML解析器等等。

Tiger

2004年, JDK5发布。Sun公司从这个版本开始就放弃了谦虚的"JDK 1.X"的命名方式,将产品版本号修改为"JDK x"。

JDK 5在Java语法易用性上做出了很大改进。如:自动装箱、泛型、动态注解、枚举、可变长参数、循环遍历。 在虚拟机和API层面上,这个版本改进了Java内存模型、提供了java.util.concurrent并发包。

Mustang

2006年,JDK 6发布,工程代号Mustang(野马)。在这个版本里,Sun终结了从JDK 1.2 开始的有八年历史的J2EE、J2SE、J2ME的产品线命名方式,启用Java EE6、Java SE6、Java ME 6的新命名代替。

JDK 6的改进包括:提供初步的动态语言支持、提供编译器注解处理器和微型HTTP服务器API等等。同时这个版本对JVM内部做了大量改进,包括:锁与同步、垃圾收集、类加载等方面。

同一年, Sun宣布计划把Java开源,并建立了OpenJDK组织对这些源码进行独立管理。

JDK 6发布以后,由于代码复杂性、Java开源、世界经济危机及Oracle对Sun的收购案等原因,JDK的更新没能继续维持两年一个主版本的研发速度。

JAVA 发展史(下)

传奇的Sun时期落幕

按照JDK 7最初的功能规划, 一共会设置十个里程碑。 2009年2月, JDK 7完成了第一个里程碑版本, 而最后一个版本原定于9月结束。

令人惋惜的是, 在JDK开发期间, Sun在技术竞争和商业竞争中陷入泥潭,公司的股票市值跌至高峰期的3%, 已无力推动JDK 7的研发工作按原计划进行。

2009年4月, Oracle宣布以74亿美元收购市值曾超过2000亿美元的Sun公司。Java商标划归Oracle所有。(而Java语言本身并不属于哪个公司, 它由JCP组织管理,只是无论前期的Sun还是后期的Oracle在JCP的话语权都很大)。

Oracle收购Sun后,随即宣布实施"B计划"。B计划的主要措施是把不能按时完成的Lambda项目、Jigsaw项目和Coin项目推迟到Java8中,以保证Java 7的正式版能够在2011年准时发布。

最终, JDK 7中包含的改进有:

  • 提供新的G1收集器、可并行的类加载框架、加强对非Java语言的调用支持。
  • 从Java 7 Update4起, Java SE的核心功能正式开始为Mac OS X系统提供支持。
  • Java 7 Update6还对ARM指令集架构提供了支持。

2014年3月, JDK 8终于带着那些曾经在JDK 7中规划过,但最终未完成的功能发布了。主要包括:

  • 对Lambda表达式的支持, 让Java语言也有了流程的函数式表达能力。
  • 新的日期、时间API。
  • 彻底移除HotSpot永久代。

连续跳票的JDK 9

JDK 9原计划是2016年发布的,但是在2016年伊始,Oracle就宣布说JDK 9肯定要延期到2017年,后来又连续两次跳票,最终在2017年才艰难面世。

后两次跳票原因是,以IBM和ReaHat为首的十三家企业在JCP大会联手否决了Oracle提出的要将Jigraw作为java模块化的规范进入JDK 9发布的提案。

IBM在模块化方面本身就是各大发行厂商中做的做好的,它不仅让自家的JDK高度模块化,还带头成了OSGI联盟, 制定了Java框架层面模块化的事实标准,所以当然想把OSGI推到Java规范了去争个“名分”,而不是被Jigraw革了命。

不过, Oracle也丝毫没有退让,经过前后六轮投票,经历了桌上桌下的斗争与妥协,JDK 9总算带着Jigraw发布了,除了Jigrwa以外,JDK 9还增强了JS Shell、JLink、JHSDB等,整顿了Hotspot各自为战的日志系统,支持HTTP2客户端API等91个JEP。

更敏捷的开发节奏

JDK9 发布之后,Oracle随即就宣布要以持续交付的形式和更敏捷的开发节奏向前推进,以后DK 要在每年的3月和9月各发布一个大版本,又因此导致的需要维护的版本分支过多,Oracle也顺理成章的终结了“每个JDK版本维护三年”的传统,并规划出每六个版本中会被划出一个长期支持版(Long Term Support, LTS), 也就是只有LTS版才能获得三年的支持和更新,普通版本只有6个月的生命周期。JDK 8和JDK 11都是LTS版,再下一个LTS版是2021年发布的的JDK 17.

侵权案

Oracle收购Sun以后就用Sun的专利把Google给告了。这个官司的主要焦点是Java API的版权问题, 经过Oracle法务部的几轮深操作,直到2018年,Android的侵权案有了最终判决, 判决裁定Google赔偿Oracle合计88亿美元, 这场官司的赔偿等同于免费收购了Sun。

只谈利益不讲情怀的Oracle Java体系中那些认为无法盈利也没有太多战略前景的部分会逐渐“按计划报废”。

第一刀就是宣告Java EE成为历史名词, 包括其中持有的JDBC、JMS、Servlet等广泛使用的组件全都赠与Eclipse基金会。紧接着是 从1996年伴随Java一同诞生的JavaOne大会也被解散, 此外还有Java Mission Control开发团队一同被解散。

Java开始收费啦!?

2018年, JDK 11发布, 这是一个LTS版本的JDK, 包含17个JEP, 其中有ZGC这样革命性的垃圾回收器出现, 但都比不过它发布时爆发出的谣言轰动:"java开始收费啦!"。

不过Oracle确实调整了JDK的授权, 这里面就包含了几个动作:

  • 从JDK 11起, 把以前的商业特性全部开源给OpenJdk, 所以OpenJDK 11和OracleJDK 11的代码和功能本质相同。
  • Oracle宣布今后会同时发行OpenJDK和OracleJDK, 核心差异是前者免费,但只有半年的更新支持, 后者个人依然免费,商用就必须付费,可以有三年时间的更新支持。目的很明显,就是让上商业用户要么不断升级JDK版本, 要么购买商业版本。

“Oracle收购Sun是Java发展历史上的一道明显的分界线。在Sun掌舵的十几年里, Java获得巨大成功, 同时也渐渐展露出来语言演进的缓慢与社区决策的老朽;而在Oracle主导Java后, 引起竞争的同时也带来新的活力, Java发展的速度要显著高于Sun时代。Java的未来是继续向前、再攀高峰,还是由胜转衰、锋芒挫缩、我们拭目以待”。