Java 知一点

 
Java 知一点
======================================================================
 
by 朱培旭 @ 2006/09
 
琢磨 Java 和 Java 相关的东西一段时间了,越来越发现其中的魅力,但是,突然发现自己虽然了解一堆的名词术语,对Java认识却很少,那种感觉,就好像喜欢上一个姑娘,已经约会了很多次,却突然发现自己还不知道她的名字一般。于是乎,就着一点好奇心,探究一下 Java,争取多点认识。
 
曾经有哲人说,存在即是合理。那么,在纷纷纭纭的编程语言中,存在了十几年,在工业界和大学里面被广泛使用,而且还在蓬勃发展的 Java,应该有其存在的理由。不过,在探究这个问题之前,或许我们更应该去看看为什么当时会发明它。套用一下那位哲人的话,一个事物的出现也必有其理由。
 
我们都知道Java语言的前身是Oak语言,开始还是为了应用于智能家电中而被发明的(不过,我们到现在还看不到多少智能家电 ),在1991年James Gosling用C写了第一个编译器,而Naughton,Gosling和Sheridan则一起编写了解释器,这一年,第一个Oak应用程序开始运行,后来又折腾了一把机顶盒操作系统,不过到了1994年,Sun公司认识到了web应用的重要性,从此Java/Oak才正式获得了生命。到了1995年,Oak被改名为Java,发布了JDK 1.0 Alpha版,1996年JDK 1.0发布。从面向智能家电到面向web的转移,使得Java的面目全新,现在我们可以看到从赌智能家电和机顶盒到赌Internet,Sun这次获得了成功,Java也获得了巨大的发展。我们来看看 1996 年 5月份 James Gosling 和 Henry McGilton 的白皮书《The Java Language Environment》里面的说明,Java的发明是这样的:
 
“Java语言是为了满足在异构和网络分布式计算的环境下进行应用程序开发而发明的,在这种环境下,一个挑战就是保证应用程序的安全传送,这些应用程序消耗尽可能少的系统资源,可以运行在任何硬件和软件平台上,可以被动态扩展。在开始的时候,这门语言只是另外一个研究项目(Green Project)的一部分,这个项目的目的是开发给大量的网络设备和嵌入式设备使用的高级软件,一个小巧的、可靠的、可移植的、分布式的、实时的操作平台。开始的时候,这个项目使用C++,但是随着时间的推移,产生的困难和问题越来越多,以致于这些问题需要发明一门新的语言平台来解决。这门新的语言的设计和体系结构从 Eiffel,SmallTalk,Objective C,还有 Cedar/Mesa等大量的语言里面继承了某些特性,结果产生了这个理想的开发安全、分布式、网络用户应用程序的语言平台,适用于从网络嵌入式设备到WWW和桌面的广泛环境。”
 
注意,在这里,作者定位 Java 为一个语言平台(language platform),而不仅是简单的一门语言(language)。Java平台是有多个组件互相协作提供功能的,而 Java编程语言只是这个平台的一个组件,它提供了整个平台的基础,也是最基本和最重要的。但是我们在平常不会分的这么细,在使用Java这个名词的时候我们需要根据上下文来确认是指的Java平台还是Java编程语言。
 
接下来,我们看看Java编程语言是如何设计的,是如何来满足前面所说的要求的,当然,还可以在白皮书中找答案!
 
“Java编程语言的设计需求由软件应用的计算环境的本质来驱动”。这个计算环境的本质是什么呢?不要忘记了,发明Java的时间正好是第一波Internet烧钱运动的前夜。“Internet和WWW的大量增长将我们引入了一个全新的软件开发和发布应用的视野。在电子商务和应用的世界里,Java技术必须能够在异构的、分布式网络的多种平台上开发安全的、高性能的、和健壮的应用程序。”这就是为什么Java一出世就能够在多种操作系统上使用,就支持 Internet应用,就支持分布式计算(在上世纪,Java RMI和CORBA、DCOM并列为三大分布式计算技术)。
 
为了在多种异构操作系统上运行分布式应用,需要考虑应用程序的发布、应用、升级和补丁等问题,这就要求Java编程语言是“(计算)架构中立、可移植、可动态适配”的。要求计算架构中立,所产生的应用程序就不能使用依赖于CPU架构和操作系统的(本地)代码,而是使用和具体的CPU架构和操作系统无关的代码,这就是Java编程语言里面的字节码(bytecode)。不过,这也没有限制在 Java 程序里面使用本地代码,一门实用的语言应该是具有适当的扩展能力的,比如,在C/C++里面就可以嵌入汇编语言,在 Java 程序里面可以使用 JNI 技术来使用本地代码。但是一个纯粹的 Java 应用程序应该是只包含字节码的。所以,一个声明为纯Java(pure java)的应用程序可以在不同的操作系统上运行,比如 ArgoUML,而分布式应用里面,纯粹的字节码更是至关要紧。字节码使得“Write once, run anywhere”的梦想变成了现实,这也是 Java 吸引人的一个重要地方。
 
说到这个字节码,其实就是一种虚拟机的机器码,类似于Intel 386的机器码,使用Java语言开发的应用程序就被这个虚拟机解释和执行,这个虚拟机叫做Java虚拟机(Java Virtual Machine, JVM)。我们会发现,我们除了可以使用Sun发布的JDK/JRE之外,还可以使用IBM出品的JDK/JRE,可以使用BEA出品的JDK/JRE,而且我们在任何一个JDK下开发出来的应用程序都可以在另外的JDK/JRE中使用,这除了因为他们均遵循Java语言规范(Java Language Specification)之外,还因为他们都遵循Java虚拟机规范。在我们执行一个Java程序的时候,比如 demo.class,我们是通过调用命令 java demo 来执行,在MS Windows里面,这个java二进制程序就是java.exe程序,在Linux里面,是一个ELF程序,不过这个程序并不是虚拟机,虚拟机是JRE(Java运行环境,Java Runtime Environment)安装目录的 client或者server子目录下的 jvm 运行库,在 MS Windows 下面,就是 jvm.dll。client和server下面的jvm是不一样的,不单表现在其大小上,他们的特点也不同,虽然他们都解释Java字节码,一般的来说,client JVM (通过java –client来调用)装载程序比较快,而 server JVM(通过 java –server来调用)则运行应用程序比较快,这是一种非常典型的面向网络的应用的表征。
 
Java语言除了这个字节码的特点之外,还有一个特点,就是面向对象,我们看看前面所说的Java语言的设计思想的传承关系,它传承了Eiffel, SmallTalk, Objective C的设计思想,另外,其语法形式则类似于C++(可能因为那个时候C++是使用得最广泛的面向对象编程语言,就好像现在林林总总的Linux Desktop模仿MS Windows的操作界面一样)。面向对象的思想萌发于上个世纪的60年代,到了Java出世的时候,人们已经发明了很多的面向对象的编程语言、面向对象设计技术,而且,人们对面向对象编程、面向对象开发、面向对象设计、面向对象分析已经积累了经验,一个重要标识就是在1994年著名的《设计模式:可复用面向对象软件的基础》(Design Patterns – Elements of Reusable Object-Oriented Software)出版了。这些,意味着什么?意味着Java一出世就可以象牛顿说的那样“站在巨人的肩膀上”。这也是为什么越来越多的大学采用Java语言为面向对象程序设计的课程的语言,为什么那么多的软件新思想首先使用Java来实现!它不单单象一杯浓郁的咖啡吸引着在101个按键之间游戏人生的程序员,而是更像一个八爪鱼,吸引了各种各样的软件人。这是Java如此吸引人的另一个重要地方。
 
说到Java语言的吸引人的地方,人们或许会提到其内存回收功能,而且拿这个功能来贬低C++。不过,内存回收对于大规模程序,特别是对于程序的响应时间比较敏感的软件来说,这可能更是一把双刃剑,难以预料的内存回收导致CPU使用率的波动,从而严重影响程序的响应特性,如果碰到了内存泄漏(可能难以相信,但的确存在),那更是一个噩梦。而这个对于一个专业的C++程序员来讲,是很难想象的。所以,我觉得是否由程序员来决定是否进行内存回收只是一个设计理念的差异而已,而不是一个吸引人的地方。
 
如前面所说,Java平台除了有Java编程语言之外,还有众多的组件一起协同工作。这又不能不提到上世纪80-90年代的事情,在1987年Apple公司的一个工程师发明了一个注重用户界面的交互式的编程工具HyperCard,这个工具可以认为是现在众多的可视化RAD工具的鼻祖,而可视化RAD是基于组件编程的一个重要方面;在1989年OMG成立,开始着手CORBA的工作;1992年Apple、IBM、Lotus联手开发OpenDoc;1993年Microsoft第一个COM版本发布;1995年Microsoft发布DCOM……在这个“组件化”的时代背景下,Java除了提供Java Applet之外,Java平台更是无组件则无Java,不过,在Java里面,这些组件体现为类库,先且不说各种各样的第三方的软件包(大多是些jar文件,呵呵),单是JRE自带的rt.jar已经集成了各种各样的组件,用java代码浏览工具,比如Eclipse,Netbeans看看rt.jar里面的package即可知道。这么丰富的组件,节省了开发人员不少时间和精力,这也是人们选择Java的一个很重要的理由。
 
当我玩Java的时候,发现看到的是一堆的术语,只有what,而甚少why,于是乎,想起了那句“自己动手,丰衣足食”,于是乎,就顺手写了下来。如果能够对其他的人也有所益处,那就是更加开心了
 
 
一些资料来源:
[4]    Eric Gamma等著,李英军等译《设计模式:可复用面向对象软件的基础》机械工业出版社,2000.09
 
 
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值