Java编程全解析:从历史中洞察未来

发表时间: 2020-07-23 17:14

著名人类学家费孝通先生曾指出,我们所谓的“当前",其实包含着从“过去”历史中拔萃出来的投影和时间选择的积累。历史对于我们来说,并不是什么可有可无的点缀之饰物,而是实用的、不可或缺的前行之基础。

Java从诞生( 1995年)发展到现在,已经度过了20多年。了解Java的一些发展历史,有助于我们更好地认识Java,看清这纷杂的编程语言世界,进而用好Java。

说到Java的发展历程,就不能不提到它的新老两个东家--Sun (太阳)公司和Oracle (甲骨文)公司。先说Sun公司,事实上, Sun的本意并非“太阳" ,而是斯坦福大学校园网( Stanford University Network )的首字母缩写,跟“太阳"并没有关系。不过,由于这个缩写的蕴意不错,"太阳"就这样叫开了。

1982年, Sun公司从斯坦福大学产业园孵化而成,后来成为一家大名鼎鼎的高科技IT公司,其全称是太阳微系统公司( Sun Microsystems ) . Sun的主要产品是服务器和工作站,产品极具竞争力,自然市场表现斐然。在硬件方面,他们于1985年研制出了自己的SPARC精简指令(RISC )处理器,能将服务器的性能提高很多,在软件方面,他们引以为傲的操作系统Solaris ( UNIX的一个变种)比当时的Windows NT能更好地利用计算机资源,特别是在用户数急剧上升,计算机系统变得非常庞大的情况下, Solaris表现更佳。

20世纪90年代,互联网兴起。Sun公司就站在那个时代的潮流之上,所以它的服务器和工作站销量极佳,以至于这家公司在自己的广告中宣称:"我们就是.com前面的关键一点(We are the dot in the .com)",言外之意,没有我们这画龙点睛的一点(服务器+操作系统) ,互联网公司就难以开起来。其得意之情,溢于言表。

Sun公司之所以敢于高抬自己,也不是吹嘘出来的,它实力的确非常雄厚,在当时足以傲视群雄。其重要的软实力,就是人才济济。在任何年代,人才都是稀缺的(不光是21世纪)。

Sun公司创始人之一史考特·麦克尼里(Scott McNealy ) ,可谓是一代"枭雄",他非常重视研发。在他的主持下, Sun公司先后开发了基于SPARC系列的处理器、工作站和Solaris操作系统,这些产品为Sun公司带来了丰厚的利润。

但如果我们把格局放大一些的话,从科技史的角度来看,可能Sun公司给人类带来的最有意义的产品,并不是前面提及软件和硬件,而是我们即将要介绍的重要内容——Java编程语言。

现在,让我们简单地回顾一下Java诞生的背景。在20世纪90年代,世界上的计算机多处于两种状态:要么孤零零地“宅着"——不联网,要么小范围地宅着"——企业内部局域网互联,那时可供公众分享的资源是非常有限的。

后来,互联网蓬勃发展,不同类型的计算机系统需要连接、信息需要共享的需求就产生了,亟需一种跨越不同硬件和不同操作系统的新平台-这就是那个时代的"痛点”。任何时候,能解决时代的痛点,就会出现划时代的产品。能解决时代的痛点,就抓住了时代的发展方向。

Sun公司的创始人麦克尼里,对网络计算有着超前的洞察力。在他的带领下, Sun公司的网络视野,并未仅仅定格于计算机之间的互联,它还看得更远-计算机与非计算机彼此也是隔断的,它们也需要彼此连接!

在Sun公司,麦克尼里一直在推行"网络即计算机( The Network is the computer)"的理念。这个关于无限连通世界观念的表述,推动着Sun公司参与时代的发展。事实上,这个理念和现在火热的云计算理念,也是一脉相承的。

2016年4月28日,全球移动互联网大会(GMIC )在北京举行,当时的腾讯副总裁程武发表了《共享连接的力量》主题演讲。他提到, 3年前,腾讯就提出“连接一切"。无论连接人与人、服务、设备,互联网根本上是在满足人的延伸,让网络中的个体获得更多的资源和能力,去实现更大的价值。

这样的认知,其实是梅特卡夫定律( Metcalfe's Law )的体现,其内容是:网络的价值等于网络节点数的平方,网络的价值与联网的用户数的平方成正比。梅特卡夫认为,“连接"革命后,网络价值会飙升,网络中的个体有望实现更大的价值.

回顾起来,不论是现在流行的物联网( Internet of things , IoT )概念,还是腾讯的"连接一切"理念,其实和Sun公司30多年前的理念相差无几。因此可以说, Sun公司在那个时代的视角,不可谓不"高瞻远瞩。

Sun公司认为,如果能把计算机和非计算机(主要指的是电子消费品,如家电等)系统这两者连接起来,将会带来一场计算机革命,这是一个巨大的机遇,而连接二者的媒介自然就是网络。

无限连通的世界,令人怦然心跳。但心动不如行动。Sun公司行动的结果,就是Java语言的诞生。

后来被称为Java之父的詹姆斯·高斯林( James Gosling )说:"放眼当时的市场,两个领域的厂家各自为政,没有形成统一的网络。因此很多时候不得不重复大量的实验,但这些其实早在30年前的计算机科学中已得到解决。

那么核心问题在于,当时的电子消费品制造者,压根并没有考虑使用网络,例如没有哪家生产商想生产一台会上网的冰箱。一流的企业,如苹果公司,是引导用户需求,而不是满足用户需求。因为有时候,用户压根也不能明确知道自己的需求。

为了解决计算机与计算机之间、计算机与非计算机之间的跨平台连接,麦克尼里决定组建一个名叫Green的、由詹姆斯·高斯林领衔的项目团队。其目的在于开发一种新的语言,并基于这种语言,研制专为下-代数字设备(如家电产品)和计算机使用的网络系统,这样就可以将通信和控制信息通过分布式网络,发给电冰箱、电视机、烤面包机等家用电器,对它们进行控制和信息交流。想一想,这不正是当下很热门的物联网思维吗?

最初Green项目的工程师们准备采用C++实现这一网络系统。但C++比较复杂,最后经过裁剪、优化和创新, 1990年,高斯林的研发小组基于C++开发了一种与平台无关的新语言Oak (即Java的前身)。 Oak的取名,缘于高斯林办公室外有一棵枝繁叶茂的橡树,这在硅谷是一种很常见的树。

Oak主要用于为各种家用电器编写程序, Sun公司曾以Oak语言投标一个交互式电视项目,但结果被SGI (硅图公司, 1982年成立于美国)打败。由于当时智能化家电的市场需求比较低迷, Oak的市场占有率并没有当初预期的高,于是“见风使舵"的Sun公司放弃了该项计划(事实上,“见风使舵"在市场决策中并不是一个贬义词,而是一种灵活的市场策略)。就这样, Oak几近"出师未捷身先死"。其实也不能全Sun公司想一想,即使在30多年后的今天,物联网、智能家居的概念虽然很火,但接地气、成气候的项目,至今也屈指可数。

恰逢这时, Mark Ardreesen (美国软件工程师,普创办网景通讯公司)开发的Mosaic浏览器(互联网历史上第一个获普遍使用且能够显示图片的网页浏览器)和Netscape浏览器(网页浏览器,市占率普位居主导地位)启发了0ak项目组成员,让他们预见Oak可能会在互联网应用上“大放异彩",于是他们决定改造Oak。

及时地调整战略,把握住了时代的需求, Oak于是又迎来了自己的"柳暗花明又一村"。也就是说,计算机与非计算机之间的连接,由于太超前而失败了,但是计算机与计算机之间的连接需求(更加接近那个时代的地气)又救活了Oak。

1995年5月23日, Oak改名为Java,至此, Java正式宣告诞生。Oak之所以要改名,其实也是情非得已,因为Oak作为一个商标,已早被一家显卡制造商注册了。Oak若想发展壮大,在法律层面上,改头换面,势在必行。

其实Java本身也韵意十足,它是印度尼西亚"爪哇" (注: Java的音译)岛的英文名称,该岛因盛产咖啡而闻名。这也是Java官方商标为一杯浓郁咖啡的背后原因,而咖啡也是“爱"加班、“爱"熬夜的程序员们提神的最佳饮品之一。

当时, Java最让人着迷的特性之一,就是它的跨平台性。在过去,计算机程序在不同的操作系统平台(如UNIX, Linux和Windows等)上移植时,程序员通常不得不重新调试与编译这些程序,有时甚至需要重写。

Java的优点在于,在设计之初就秉承了“一次编写,到处运行"("Write Once, Run Everywhere" ,WORE;有时也写成"Write Once, Run Anywhere" , WORA )思想,这是Sun公司为宣传Java语言的跨平台特性而提出的口号。

传统的程序,通过编译,可以得到与各种计算机平台紧密耦合( Coupling )的二进制代码。这种二进制代码可以在一个平台运行良好,但是换一个平台就"水土不服",难以运行。

而Java的跨平台性,是指在一种平台下用Java语言编写的程序,在编译之后,不用经过任何更改,就能在其他平台上运行。比如,一个在Windows环境下开发出来的Java程序,在运行时,可以无缝地部署到Linux, UNIX或macos环境之下。反之亦然,在Linux下开发的Java程序,同样可在Windows等其他平台上运行。Java是如何实现跨平台性的呢?我们可用下面的图来比拟说明。

比如说,中国人(一个平台)说了一句问候语:"你好,世界!"美国人、法国人、德国人及日本人(其他平台)都能理解中国人的“问候"。之所以能这样,这得益于英语、法语、德语及日语翻译们的翻译。

类似的, Java语言的聪明之处在于,它用一个名为Java虚拟机( Java Virtual Machine , JVM)的机制屏蔽了这些“翻译"的细节。各国人尽管尽情地表达(编写Java代码) ,通过编译,形成各个平台通用的字节码( Byte Code ) ,然后JVM"看平台下菜" ,在背后默默地干起了"翻译沟通"的活。正是因为有JVM的存在,Java程序员才可以做到"一次编写,到处运行"-这也是Java的精华所在。

在经过一段时间的Java学习后,读者就会知道由Java源代码编译出的二进制文件叫.class (类)文件,如果使用十六进制编辑器(如UltraEdit等)打开这个.class文件,你会发现这个文件最前面的32位将显示为"CAFE BABE",连接起来也就是词组"CAFE BABE "(咖啡宝贝) ,如下图所示。每个Class文件的前4个字节,都是这个标识,它们被称为“魔数”,主要用来确定该文件是否为一个能被虚拟机接受的Class文件。其另外一个作用就是,让诸如James Gosling等这类具有黑客精神的编程天才尽情表演,他们就是这样,在这些不经意的地方雁过留声,人过留名"。

Java class文件的中“咖啡宝贝”

或许,正是麦克尼里看到了Java的这一优秀特性,在Java推出以后, Sun公司便赔钱做了大量的市场推广。仅3个月后,当时的互联网娇子之一——网景( Netscape )公司,便慧眼识珠,决定采用Java。

由于Java是新一代面向对象的程序设计语言,不受操作系统限制,对网络支持很强,加之对终端用户是免费的, Java一下子就火了。很快,很多大公司诸如Oracle, Borland, SGI, IBM,AT&T和英特尔等都纷纷加入了Java阵营。当Java逐渐成为Sun的标志时, Sun公司索性就把它的股票代码"SUNW"直接改为了"JAVA"。Sun公司对Java的重视程度,可见一斑。

1997年, Sun公司推出64位处理器,同年推出Java 2 , Java渐渐风生水起,市场份额也越做越大。1998年, Java2按适用的环境不同,被分化为4个派系(见下图) : Java 2 Micro Edition (J2ME )、Java 2 Standard Edition (J2SE)、 Java 2 Enterprise Edition (J2EE )以及Java Card。ME的意思是小型设备和嵌入系统,这个小小的派系,其实是Java诞生的"初心"。

(1) Java SE ( Standard Edition ,标准版) :支持面向桌面级应用(如Windows下的应用程序)的Java平台,提供了完整的Java核心API,这个版本2005年以前称为J2SE.

(2) Java EE ( Enterprise Edition ,企业版) :以Java SE为基础向外延伸,增加了许多支持企业内部使用的扩充类,同时支持使用多层架构的企业应用(如ERP-企业资源计划系统、CRM-客户关系管理系统的应用)的Java平台。除了提供Java SE AP1外,还对其做了大量的扩充并提供了相关的部署支持。这个版本2005年以前称为J2EE

(3) Java ME ( Micro Edition,微型版) : Java ME同样以Java SE为基础,但相对精简。它所支持的只有核心类的子集合,它支持Java程序运行在移动终端(手机、PDA-掌上电脑)上的平台,加入了针对移动终端的支持。这个版本2005年以前称为J2ME, Java的微型版主要是进行嵌入式开发,目前渐渐被Android开发所替代。

(4) Java Card (智能卡版) :由于服务对象定位更加明确化, Java Card版本比Java ME (微型版)更加精简。它支持一些Java小程序(Applets )运行在小内存设备(如容量小于64KB的智能卡)的平台上。

但是, Java的技术平台不管如何划分,都是以Java SE为核心的,所以掌握Java SE十分重要,这也是本书的主要讲解范围。如果想进行Java EE的开发, Java SE是其中必要的组成部分,这也是为什么在学习Java EE之前要求读者一定要有扎实的Java SE基础。

当时专为连接智能家电而开发的Java ,不曾想“有心裁花花不开,无心插柳柳成荫",在家电市场室无起色,却因其“一次编程,到处运行的跨平台特性,赶上了互联网的高速发展时机,在企业级市场上大放异彩。

Java ME一度在翻盖手机应用上得到极大推广,成为当时的标配。但后来,随着安卓(Android )的兴起,也慢慢中落。Java之父高斯林后来也说, "ME已经做得足够好了,在当时是最强大的智能电话开发平台之一。不过现在渐渐被遗忘,因为Android太耀眼了。

有起有落,螺旋上升,是事物发展的常态。Java的发展历程,也不例外。Oracle Java平台开发副总裁、OpenJDK管理委员会核心成员Georges Saab普经这样说道: "在20世纪90年代,大多数开发者都把精力投入到真面应用的编写之上。到了2000年, Pet.com (一家美国宠物网站)的成功吸引了大批的跟风者。业界又把焦点从桌面转移到了HTML应用。随着智能电话和平板电脑的到来,基于触摸屏的移动应用又站在了潮流前端。所以对于下一个流行趋势是很难把握的,这涉及天时、地利、人和。"

然而, Java对于Sun来说,是“华而不实"的资产。因为,除了带来日渐高涨的声誉外, Java并没有直接给Sun带来与其声誉对等的回报。用华尔街的话来说, Java是赔钱赚吆喝。吆喝Java是赚到了,但赚钱盈利才是生存之道。

现在具备互联网思维的公司都知道,“免妻的目的是不免费,不免妻的对象要发生转移,其实是要让“羊毛出在猪身上",最后让狗来买单”。但那是30多年前, Sun公司还没有很强的互联网赚钱思维,它到"死(直到被Oracle收购)都没有想明白,为什么抱着一个金饭碗,却要不到饭。

事实上,除了生产处理器、服务器和操作系统之外, Sun还开发了办公软件OpenOffice, 1995年到2000年,是Sun公司高速增长的时期。这期间互联网飞速发展,它曾经和Oracle共同提出了网络计算机( Networkcomputer, NC )的概念,主要就是指没有硬盘的计算机,其实也就是低价台式机,是瘦客户机(或称无盘工作站)。

但在2000年之后,网络泡沫破碎,绝大多数的".com"公司都关门了,苟延残喘活下来的公司,也急刹车般地停止了扩张采购。服务器市场一下子低迷起来, Sun公司这个当初意气风发誓言成为互联网公司的"关键的一点的"公司,已经不再关键了。老的盈利点(服务器市场)不盈利了,新的盈利点(如Java市场)又找不到, Sun公司突然陷入风雨飘摇的境地。

有道是"月满则亏,水满则溢". Sun公司从1982年成立,到2000年达到顶峰,用了将近20年,而走下坡路只用了仅仅一年。这种断崖式的毁灭,足以让今天的创业者引以为戒。

2008年爆发的金融危机,让持续亏损的Sun公司,更加雪上加霜。到了2009年,由于业绩不佳, Sun公司的市值又比2007年下降了一半,终于跌到了对它期盼已久的Oracle公司可以买得起的价格。2009年4月,这个市值曾经超过2000亿美元的Sun公司,在最低潮的时候,以74亿美元的便宜价被Oracle收购,这个价格仅仅为Sun公司顶峰市值的3%,作为Sun公司的核心资产之一的Java,自然也换了新东家——Oracle。

按照Oracle老板拉里,埃里森( Larry Ellison )的话讲, Sun公司有很好的技术,也有很好的工程师,但它们的管理层实在是太烂了(Astonishingly bad managers ) ,而且做了很多错误的决策,这样才导致Oracle能以很便宜的价格捡了漏。

2015年5月23日,在北京中关村3W咖啡屋,作者参加了由Oracle (中国)举办的Java诞生20周年庆典。在概括Java成功的原因时, Oracle开发人员关系团队总监Sharat Chander总结了三点:社区排在第一这是Java成功的基础; Java技术的不断进步排在第二;而排在第三位的,才是Oracle对Java的管理。

在收购Sun后, Oracle一方面继续积极推动Java社区发展,另一方面及时将社区成果反馈、焦成到新版本产品中。Oracle承诺,大型版本的更新每2年一次发布,小型版本的更新每6个月一次。

在版本推新上, Oracle极大尊重Java社区的意见, Java 7就是在与社区深入交流的基础上推出的,尽管当时并非推出Java 7的最好时机,其后续功能在Java 8里进行了补全。

对于Java的发展,的确不能忽视Java社区的重要性。Oracle认为自己并非Java的管家,他们是在与Java社区一起来管理Java ,而Java社区也被誉为Java成功的基础。对此Sharat Chander介绍, Java社区拥有314个Java用户组、900多万Java开发人员、超过150个Java Champion (技术领袖)。

2009年12月,企业版的升级版Java EE 6发布。2011年7月28日, Java SE 7发布。

CPU多核( many-core )时代的兴起,让程序员们纷纷探索起怎么编写并行代码。一番折腾后,大家发现很多编程的好思想,都来自一个叫函数式编程的程序范式。这个曾束之高阁的好理念又被人重抬起来。2014年3月19日, Oracle公司发布Java 8.0正式版,提供了大家望眼欲穿的Lambda。

当然, Java也不是没有缺点的。普经,有人采访C++之父Bjarne Stroustrup ,问他如何看待Java的简洁,他的回答却是,时间不够长。大师之见,果然深邃。Java之美,早已不是简洁,而是开发高效。其为之付出的代价是,各种类库、框架的异常复杂而臃肿。通常,即使一个专业级的Java程序员,也需耗费不菲的(包括时间上或金钱上的)学习成本。但这符合事物的发展规律,就像我们不能期望一个横纲级的相扑运动员力大无穷,却又期望他身轻如燕。

这就是我们的Java!它不甚完美,却非常能干!

本文节选自《Java编程技术大全》

本书面向Java的零基础读者,用实际案例引导读者学习。本书主要包括基础知识、核心技术、高级应用和项目案例等4篇内容,帮助读者系统、全面地学习。 为了增强实用性,还特别赠送了精选的考试认证、求职面试等题库,供读者研究学习。最后,为帮助初入职场的从业者顺利进入角色,还赠送了职业规划建议及相关开发文档。


专栏
Spring Boot 2 核心技术实战基础
作者:异步社区
33.9币
27人已购
查看