早期的Java
Oak语言的吉祥物,Duke
Java平台和语言最开始只是升阳公司在1990年12开始研究的一个内部项目。升阳公司的一个叫做帕特里克•诺顿的工程师被升阳自己开发的C++和C语言编译器搞得焦头烂额,因为其中的API极其难用。帕特里克决定改用NeXT,同时他也获得了研究公司的一个叫做“Stealth 计划”的项目的机会。
“Stealth 计划”后来改名为“Green计划”,詹姆斯•高斯林和麦克•舍林丹也加入了帕特里克的工作小组。他们和其它几个工程师一起在加利福尼亚州门罗帕克市沙丘路的一个小工作室里面研究开发新技术,瞄准下一代智能家电(如微波炉)的程序设计,升阳公司预料未来科技将在家用电器领域大显身手。团队最初考虑使用C++语言,但是很多成员包括升阳的首席科学家比尔•乔伊,发现C++和可用的API在某些方面存在很大问题。
工作小组使用的是内嵌类型平台,可以用的资源极其有限。很多成员发现C++太复杂以至很多开发者经常错误使用。他们发现C++缺少垃圾回收系统,还有可移植的安全性、分布程序设计、和多线程功能。最后,他们想要一种易于移植到各种设备上的平台。
根据可用的资金,比尔•乔伊决定开发一种集C语言和Mesa语言大成的新语言,在一份报告上,乔伊把它叫做“未来”,他提议升阳公司的工程师应该在C++的基础上,开发一种面向对象的环境。最初,高斯林试图修改和扩展C++的功能,他自己称这种新语言为 C++ ++ --,但是后来他放弃了。他将要创造出一种全新的语言,被他命名为“Oak”(橡树),以他的办公室外的树而命名。
就像很多开发新技术的秘密的工程一样,工作小组没日没夜地工作到了1992年的夏天,他们能够演示新平台的一部分了,包括Green操作系统,Oak的程序设计语言,类库,和其硬件。最初的尝试是面向一种类PDA设备,被命名为Star7,这种设备有鲜艳的图形用户界面和被称为“Duke”的智能代理来帮助用户。1992年12月3日,这台设备进行了展示。
同年11月,Green计划被转化成了“FirstPerson有限公司”,一个升阳公司的全资子公司,团队也被重新安排到了帕洛阿尔托。FirstPerson团队对建造一种高度互动的设备感兴趣,当时代华纳发布了一个关于电视机顶盒的征求提议书时(Request for proposal),FirstPerson改变了他们的目标,作为对征求意见书的响应,提出了一个机顶盒平台的提议。但是有线电视业界觉得FirstPerson的平台给予用户过多地控制权,因此FirstPerson的投标败给了SGI。与3DO 公司的另外一笔关于机顶盒的交易也没有成功,由于他们的平台不能在电视工业产生任何效益,公司再并回升阳公司。
JAVA遭遇互联网
为Java量身订做的浏览器-Web Runner
1994年6、7月间,在经历了一场历时三天的头脑风暴的讨论后,约翰•盖吉、詹姆斯•高斯林、比尔•乔伊、帕特里克•诺顿、韦恩•罗斯因和埃里克•斯库米,团队决定再一次改变了努力的目标,这次他们决定将该技术应用于万维网。他们认为随着Mosaic浏览器的到来,因特网正在向同样的高度互动的远景演变,而这一远景正是他们在有线电视网中看到的。作为原型,帕特里克•诺顿写了一个小型万维网浏览器,WebRunner,后来改名为HotJava。
在HotJava中看最早的java.sun.com网页
版本历史(timesheet)
从Java 2开始出现的,Java互联网启动中心
- 1995年5月23日,Java语言诞生
- 1996年1月,第一个JDK-JDK1.0诞生
- 1996年4月,10个最主要的操作系统供应商申明将在其产品中嵌入JAVA技术
- 1996年9月,约8.3万个网页应用了JAVA技术来制作
- 1997年2月18日,JDK1.1发布
- 1997年4月2日,JavaOne会议召开,参与者逾一万人,创当时全球同类会议规模之纪录
- 1997年9月,JavaDeveloperConnection社区成员超过十万
- 1998年2月,JDK1.1被下载超过2,000,000次
- 1998年12月8日,JAVA2企业平台J2EE发布
- 1999年6月,SUN公司发布Java的三个版本:标准版、企业版和微型版(J2SE、J2EE、J2ME)
- 2000年5月8日,JDK1.3发布
- 2000年5月29日,JDK1.4发布
- 2001年6月5日,NOKIA宣布,到2003年将出售1亿部支持Java的手机
- 2001年9月24日,J2EE1.3发布
- 2002年2月26日,J2SE1.4发布,自此Java的计算能力有了大幅提升。
- 2004年9月30日18:00PM,J2SE1.5发布,是Java语言的发展史上的又一里程碑事件。为了表示这个版本的重要性,J2SE1.5更名为J2SE5.0
- 2005年6月,JavaOne大会召开,SUN公司公开Java SE 6。此时,Java的各种版本已经更名以取消其中的数字“2”:J2EE更名为Java EE, J2SE更名为Java SE,J2ME更名为Java ME。
- 2006年11月13日,SUN公司宣布Java全线采纳GNU General Public License Version 2,从而公开了Java的源代码。
Java试图通过新的方式解决软件编写的复杂性。很多人认为Java语言做到了它承诺的一切。但是Java并不是一门完
美的语言,在编程风格、编程环境和需求方面并没有获得全球性的认可。
· 并不是所有的工程和环境需要企业级别的复杂性,比如一个简单的个人网站或者独自编程的程序员所写
· 的程序。这些程序员会发现Java的复杂管理对于自己要做的程序来说过于强大了。
· Java经常让那些并不是对面向对象编程很热心的程序员感到不满。
· 一些人觉得Java在面向对象上面做的没有Ruby和Smalltalk纯粹。但是最新出现的用Java实现的语言
· Groovy解决了这些问题。
· 作为一种已经建立的新技术,Java显然综合了很多语言的特性,比如C++、C语言、Python等等。一些
· 对于Java的评论认为Java的不变性在动摇,有些人认为Java只是一种“新的COBOL"语言。
语言问题
· 有些程序员不喜欢原始类型和类的分离,尤其是那些曾经使用过Smalltalk和Ruby的程序员。他们会问
· :“这就是一切皆对象?”
· 事实上,JAVA语言本身只是Smalltalk的一个不完整的代替品。JAVA的流行与SUN背后的支持分不开。
· Java的代码相对于其它的代码来说过于冗长,这与它的轻便化声明相违背。
· Java语言在单范例程序方面非常出色。历史上的Java则在这方面做的不好。
· Java是一种单层继承的语言。这也导致了程序员在试图使用多重继承时候的不便,而很多语言都可以
· 使用这个特性。但是Java可以使用接口类,把多重继承可能导致的风险减少到最小。
· Java不支持运算符重载,这是为了防止运算符重载使得代码的功能变的不清晰。但是用Java实现的语
· 言Groovy可以进行运算符重载。
· 5.0版本增加了大量的基本类的支持,可以节省大量的额外编程工作。
· 过去Java对于文本的操作和其它语言,比如perl和PHP相比差的较多,但Java在1.4版本时候引入了
· 正则表达式。
· 准确地说,JAVA不是平台无关的,它本身就是一个平台。
类库问题
使用Swing平台编写的带有GUI(图形用户界面)的程序和其它原始程序非常不同。选用AWT工具包编写程序的程序
员看到的都是原始界面,而且也无法获得先进的GUI编程支持,如果使用的话,就要提供每个平台上面所需的API,
这将是一项庞大的工程。Swing则是完全用Java语言所写的程序,避免了界面元素重复的问题,只使用所有平台都
支持的最基本的绘图机制。但是很多用户不知道如何在Java风格和Windows风格之间进行转换,结果造成了Java程
序的界面在很多程序中非常特殊。苹果电脑已经提供了优化过的Java运行时程序,包含了Mac OS X的经典Aqua界面风格。
IBM公司提供的SWT和JFace提供了具有本地化风格的界面。
性能问题
由于Java编译器和虚拟机的不同对Java代码的性能影响比语言本身的影响大的多,所以统一讨论Java的程序的性能经
常是有误导性的。据IBM的数据,在同样的硬件上2001年时的IBM JDK版本的性能是1996年的JDK版本的十倍左右。
见IBM东京研究院的数据: http://www.is.titech.ac.jp/ppl2004/proceedings/ishizaki_slides.pdf
而即使是在同一时期,不同公司的JDK和JRE的性能也不一样,比如SUN、IBM、BEA等公司都有自己开发的JDK和JRE。
Java语言的一些特性不可避免的有额外的性能代价,例如数组范围检查、运行时类型检查等等。Java程序的性能还会
因为不同的动态复杂性和垃圾处理机制使用的多少而各有不同。如果JVM的实现比较优化的话,那么这些功能甚至可以
增加内存分配的性能。这和总是使用STL或者托管C++的程序的情况类似。
尽管如此,仍然有许多人认为Java的性能低。这部分归因于Sun公司最初的JVM实现使用未优化的解释机制来执行字节码
。一些新版本的JVM使用Just-In-Time(JIT)编译器,在加载字节码的时候将其编译成针对运行环境的本地代码来实现
一些本地编译器的优化特性。Just-In-Time机制和本地编译的性能比较仍旧是一个有争议的话题。JIT编译需要很多时
间,对于运行时间不长或者代码很多的大型程序并不适宜。但是不算JIT编译阶段的话,程序的运行性能在很多JVM下可
以和本地编译的程序一争短长,甚至在一些计算比较密集的数值计算领域也是这样。目前,Java已经使用更先进的
HotSpot技术来代替JIT技术,Java的性能有了更进一步的提升。另外,在使用-server选项运行java程序时,也可以对
java进行更深入的优化,比如在运行时将调用较多的方法内联(inline)到程序中来提高运行速度,这就是所谓的
“动态优化”,而本地编译器是无法做到这一点的;这也是一些java代码比对应用C/C++等语言编写的本地代码运行的更快
的原因之一。微软的.NET平台也使用JIT编译器,所以也有类似问题。
Java的设计目的主要是安全性和可移植性,所以对于一些特性,比如对硬件架构和内存地址访问的直接访问都被去除了。
如果需要间接调用这些底层功能的话,就需要使用JNI(Java本地接口)来调用本地代码,而间接访问意味着频繁调用这
些特性时性能损失会很大,微软的.NET平台也有这样的问题。所以到目前为止,性能敏感的代码,例如驱动程序和3D视频
游戏,还是大多使用本地编译,甚至直接以不直接支持面向对象的C语言或机器码编写。但最近已经有了许多用纯Java编写
的3D游戏,其效果与用C语言编写的不相上下,例如“合金战士”(英文名:Chrome)。这主要是因为新版的Java 3D技术
已经能像C++一样调用硬件加速,也就是使用显卡来加速,无论是C++还是Java语言写的3D游戏都是使用显卡及GPU来处理,
从而使得CPU可以专注于其它方面的工作。
关于Java的性能,可以参看以下文章:
http://www-128.ibm.com/developerworks/cn/java/j-jtp09275.html
http://www.matrix.org.cn/thread.shtml?topicId=16092&forumId=18
Java运行时环境,即Java Runtime Environment,简称为JRE,是在任何平台上运行Java编写的程序都需要用到的软件。
终端用户可以以软件或者插件方式得到和使用JRE。Sun公司还发布了一个JRE的更复杂的版本,叫做JDK,即Java 2 开发包,
里面包含了Java需要的编译器、参考文档和调试器等。
JRE的成分:
· Java的类库,包含了编译Java程序所需要的最核心文件。
· 核心库文件,其中有
· 数据结构的库,包括列表、字典和树等
· XML分析库
· 安全方面应用库
· 国际化和本地化应用库
· 综合库文件,包含了程序员和其它系统通信的功能文件。
· JDBC,即Java数据库联通的API
· JNDI,即Java命名和目录接口
· RMI和CORBA用于重新分发软件
· 用户界面库文件,包含:
· AWT,即抽象窗口开发包,提供了产生图形用户界面所需要的功能
· Swing库
· 其它用于回访媒体文件、录音、截图的库
· 一个用于执行软件的Java虚拟机
· 插件,可以在浏览器里面使用
· JWS,可以让终端用户连接到互联网
· 许可文件和文档
扩展和与Java程序设计语言紧密相关的架构(按字母排序)。
- Groovy ,一种用纯Java实现的脚本语言,Python的强有力竞争者
- JAIN (Java API for Integrated Networks)Java综合网络应用程序开发接口
- JAI,(Java Advanced Imaging)Java进阶图像
- Java EE(原名J2EE),Java平台企业版
- Java ME(原名J2ME) ,Java平台微型版为PDA和智能手机开发的移动版本
- Java SE(原名J2SE),Java平台标准版
- JDBC ,(Java Database Connectivity)Java数据库联通
- JDMK,(Java Dynamic Management Kit)Java动态管理开发包
- JDO ,(Java Data Objects)Java数据对象
- JJSF,Java服务器界面
- JMF,(Java Media Framework) Java媒体框架
- JMI,Java元数据接口
- JML ,(Java Modeling Language)Java建模软件
- JMX ,(Java Management Extensions)Java管理扩展
- JNDI ,(Java Naming and Directory Interface)Java命名和目录接口
- JNI ,Java原始界面
- JOGL,使用OpenGL的低阶三位游戏开发接口
- JSML ,(Java Speech API Markup Language)Java的语音和标记语言
- JSP ,(JavaServer Pages)Java服务器页面
- JSF ,(JavaServer Faces)
- JXTA ,P2P虚拟网络协议
- Java Card
- Java3D ,用于三维游戏编程的高阶应用程序开发接口
- JavaSpaces
- Jini ,Java网络分布计算结构
- Jiro
- OSGi,(Dynamic Service Management and Remote Maintenance)动态服务管理和远程控制
- Rhino, 用Java实现的JavaScript语言。
- SuperWaba ,手持设备的虚拟机程序