Java这门语言有很多不可忽视的优点,比如一次编写到处运行,又比如它有一个相对安全的内存管理和访问机制,避免了C++中经常出现的内存泄露和指针越界问题等等,java带来的这些好处,让我们这些java程序员与生俱来就站在了“巨人的肩膀”上,之前一直无痛无痒地讲java的技术点,从来没对这门语言的历史进行科普,毕竟我们不能只知“其然”,不知其“所以然”,我们应该思考一下java技术体系中这些技术特性是如何实现的,认识特性运作的本质,在写每一句程序的时候都能思考一下“程序这样写好不好”。
今天主要是科普一下Java的历史,重新认识认识和咱们并肩作战的兄嘚是如何从娘胎诞生的。
Java的体系
如果说java的体系,其实java的涵盖范围十分广泛,并不是咱们侠义上理解的java程序设计这一分支,Clojure,JRuby,Groovy这些需要运行在java虚拟机上的语言和程序框架都数据java体系的一部分,从官方给出的文档来看,Java的技术体系主要包括 : java程序设计语言(我们平时写的java代码),java虚拟机(任何平台上的),Class文件格式,javaAPI类库,以及商业或者开源提供的第三方类库。
我们学习java的第一课,就是如何配置java的环境,也就是安装部署JDK,其实这里的JDK具体有哪些东西,博主初学的时候也是很含糊,说不明白,事实上,Java程序语言、Java虚拟机、JavaApi类库三者加起来才是JDK,JDK是支持你本地运行java的最小环境。说到JDK的安装部署,经常配JDK环境的朋友肯定在其目录下发现有个JRE的目录,其实JRE也是这个体系中的一部分,JRE是由JavaAPi类库的SE部分和Java虚拟机组成,也就是说我们可以理解为JRE是JDK的一部分。
学习Java的时候我们会经常遇到什么JavaSE,J2EE……初学的时候可能因为不细心或者材料的不健全,对这部分很困惑,其实这里的SE,EE等都是对Java按技术服务的领域来划分的,白话就是,Java主要用来做什么,根据Java能用来做什么,又可以分为 :
Java Card:支持一些简单的java小程序,主要工作在小内存设备中(智能卡,机顶盒),可以理解为嵌入硬件的一种程序,这也是大胡子创造Java的开始。
Java ME:支持Java运行在移动终端,简单来说目前的手机操作系统,安卓就是该体系支撑。
Java SE: 这里就是面向终端的桌面应用了,我们常用的桌面软件(例如Winows下的应用),如果采用Java来写,就需要Java的SE体系,这个体系又叫J2SE。
Java EE:支持使用更为复杂的多层次架构,多用作企业级应用的开发,Web开发,简单来说,部署在服务器上的服务级别的应用,这个体系又叫J2EE。这个 体系是目前Java应用最为广泛的。
Java的发展史
这里主要围绕JDK版本的时间线开始,截至于JDK1.7版本,后续的1.8+后面的时,大家作为Java程序员应该不需要过多口水了。
1991年4月,大胡子詹姆斯(James Gosling)开启了一个绿色计划,这项计划的目的是开发一种能在电子产品上(机顶盒、冰箱、收音机等)运行的程序架构,这个计划的成果就是一个叫Oak的语言,可是大胡子的这个Oak在当时并不怎么火爆,市场并没给出多大的反馈,于是就这么不温不火地放着,也可能是命,注定让大胡子的这个东西要站在浪头,于是,沉寂了几个月的Oak,随着1995年互联网浪潮的兴起,找到了适合自己的成王之路。
1995年5月23日,Oak语言改名为Java,并在Sun公司的世界大会上发布了1.0版本,即Java 1.0,也是这个时候,Java提出了 “一次编写,到处运行”的口号,也标识着Java开始从新手村走出。
1996年对算是Java的起飞年,1月23日,JDK1.0的发布,标志着Java语言有了第一个正式版本的运行环境,JDK1.0中提供了一个纯解释执行的Java虚拟机实现(其中的代表技术有:Java虚拟机,Applet,AWT等),同年4月,10个主要的操作系统供应商声明将在自己的产品 中嵌入Java技术(截至同年9月,已经有8万多网页是采用Java来制作的),5月底,Sun公司在旧金山举办了第一届JavaOne大会,从此JavaOne就成了全世界百万Java开发者每年一度的技术盛宴。
1997年,Sun公司发布了JDK1.1,这一版本提供了对Java技术的一些最基础的支撑,同时Java的语法也有了一定的发展,如内部类和反射都是这一版本中出现的,到1999年4月,JDK1.1一共发部了1.1.0——1.1.8九个版本,每个版本都有自己独特的名字,例如:JDK1.1.4-Sparkler叫做宝石,JDK1.1.5-Pumpkin 南瓜,JDK1.1.7布鲁图等(这里插一句个话,感觉越是这种很NB的东西起的名字越随意,很俏皮,里面或是有研发者们自己的小心思,或是有很多和研发者切割不断的联系,毕竟就是人家的脑力劳动的结晶,命名权就该归为研发人员本身,而不是被官大一级的起名XXX系统)。
1998年12月,JDK迎来了里程碑式的一个版本,即JDK1.2,也就是这一版本开始,Java划分了三大体系,即上面列出的ME,SE,EE。也许正是因为开始了划分,希望各个体系百花齐放,于是JDK1.2的工程代号PlayGround,译为竞技场。也就是这一版本中,Java除了虚拟机上内置了JIT编译器之外,还追加了我们现在常用的Collections集合类.
1999年4月27日,HotSport虚拟机发布,这是由一家叫做 “Longview Technologies”的小公司开发,因为这一虚拟机的性能很优异,这家小公司就被Sun收购(小公司也是可以好好搞技术的!!!搞好了大不了被收购嘛),HotSport是最为JDK1.2的附加程序提供的,但是在后来的1.3以及后续的JDK中,都被Sun公司指定为默认虚拟机。
2000年5月,代号为Kestrel(美洲红隼)的JDK1.3发部,这一版本主要对JDK1.2的类库进行扩充,提供了大量的新的Java 2D API,自从1.3发部以后,Sun维持了一个习惯,大约每隔两年发部一个JDK的主版本,而且命名均以动物命名,期间发布的各个修正版本则以昆虫名作为工程代号。
2002年,JDK1.4发部,工程代号为Merlin(灰背隼),这个版本是Java真正走向成熟的一个版本,SAS,IBM,Symbian等著名公司都参与甚至实现自家独立的JDK1.4,哪怕今天,仍然很多主流应用(Spring,Struts等)能直接运行在JDK1.4之上,或者继续发布能运行在JDK1.4版本上的版本,JDK1.4中追加了很多新的技术特性,例如正则表达式,日志类,XML解析器、异常链等等。
2004年9月30日,JDK1.5发部,JDK从1.5开始,官方在文档中已经不再使用JDK1.5的命名,只有程序员在内部使用的开发版本号(例如在cmd中 java -version输出)中才会看见1.5,1.6这样的版本号,而公开版本号则变成了JDK5、JDK6、JDK8这种命名方式(这里应该会解开很多朋友在装JDK时的一个困惑,为什么有人说JDK几,有人说JDK1.1.X)。话回正题,JDK1.5在java语法上有了很大的改进,例如自动装箱、泛型、动态注解、枚举、可变长参数、遍历循环(foreach循环)等语法都是在JDK1.5中被加入,同时这个版本改进Java的内存模型,提供了并发包(java.util.concurrent)等。
2006年12月,JDK1.6发布,代号Mustang(野马),这个版本中,Sun结束了子JDK1.2开始的J2EE、J2SE、J2ME的命名方式,启用 Java SE6,Java EE6、java ME6的命名方式,语法上也做了改进,主要为:提供了动态语言机制(通过内置Mozilla JavaScript Rhino引擎),提供了编译API和微型HTTP服务器API等,对Java虚拟机内部也进行了改进,包括锁与同步,垃圾回收机制、类加载等等
在2006年11月13日的Java One大会上,Sun公司宣布Java最终会开源,并在随后的一年时间内,陆续将JDK不同版本的代码发部到网络上,于是,就有了OpenJDK。自JDK1.6发布以后,随着代码的开源,Java的生态变得十分繁荣,代码的复杂性也急剧增加,由于开发JavaFx、经济危机以及Sun的收购等,Sun在JDK的发展上消耗了过高的资源,导致JDK的更新没有再维持两年一更的速度。
2009年2月份,工程代号为Dolphin(海豚)的JDK1.7完成了其第一个里程碑版本,(根据JDK1.7的规划,一共有10个里程碑,当然后续我们已经使用到了)。
2009年4月20日,Oracle公司正式宣布以74亿美元的价格收购Sun公司,Java商标从此正式归Oracle所有(本质上java语言不属于哪家公司所有,它由JCP组织进行管理,尽管JCP组织的老大是Sun和Oracle),Oracle公司在完成Sun公司的收购之后,分别从BEA和Sun中取得了三大商业虚拟机的其中两个:JRockit和HotSpot,Oracle将这两个虚拟机相互取长补短,最终合二为一。