最近我们收到一封电子邮件,咨询 “什么是Java?”条目的信息。在2006年,难道还有人不知道“什么是Java”吗?十年来,有大量介绍Java的书籍、网站和会议,难道不是所有人都知道“什么是Java”吗?显然答案是否定的。
毕竟,情况已经改变。
每个涉及applet和实时(Just-in-time)编译器的含糊定义都有许多已固定下来并为许多人所了解的新说明和新事实,但它们并非全部都写入文档中了。过去,Java常常意味着:
•Applet
•字节码解释
•缓慢的性能
•等待Sun恩赐的“拜物教”
而如今,它意味着:
•Web应用程序、Web服务、SOA等等
•热点动态编译
•高性能
•一个日益独立于Sun的开源社区
过去有个口号叫做“一次编写,随处运行”,这仍然是事实,但编写的内容及其运行环境和方式正在改变。
Java编程语言
Java是一种面向对象的高级编程语言,它在许多方面受到C、C++和Smalltalk的影响,还借用了其他语言的概念。其语法的设计方式使得那些熟悉“大括号”语言(继承自C)的人也会熟悉Java语法,但它具有比C++更强的面向对象性、对象的静态类型转换以及相当严格的异常系统,该系统要求调用堆栈中的每个方法要么处理异常,要么声明其抛出异常的能力。当然还有垃圾自动收集功能,这使开发人员不必释放由废弃对象占用的内存。
Java的一个比较受争议的方面(这些方面在发布Java时被广为接受,但现在正日益受到批评)是它的不完全的面向对象性。具体来说,Java基本类型(如int、char、boolean等等)都不是对象,并且开发人员需要以完全不同的方式来处理它们:由于int不是类,因此不能为其创建子类并为其声明新方法,也不能将它传递给需要普通对象的方法,诸如此类。基本类型提高了Java的性能,但却降低了代码的清晰度,这一点使用所谓的“包装器类”(Integer、Character和Boolean)的人应该深有体会。Java 5.0引入了autoboxing(自动装箱)模式,以消除许多使用包装器类的用例,但在某些方面这使代码的功能不那么明显了。
从理论上讲,Java是种“早期出错”语言。由于它的语法约束,许多编程错误在Java中不可能出现。由于不能直接访问指针,所以指针运算错误也就不存在了。使用对象时的类型如果与当初声明它的类型不同,就会要求进行显式的类型转换,这使编译器能够拒绝不合逻辑的编程,如对一幅图像调用一个字符串方法。
许多Java企业框架都要求使用配置文件或者部署描述符(通常用XML编写)来指定操作:哪个类处理特定的HTTP请求、在规则引擎中执行的步骤顺序等等。实际上,要实现这些功能不能只用这种语言。评论人士指出,这会产生不当后果:不仅避开了Java编译器的检查,而且开发人员无法再(只)根据程序的源代码就可确定它如何运行。Java 5.0为该语言添加了注释(annotation)特性,它允许使用值为方法、字段和类添加标签,在运行时,通常可通过反射对这些值进行内省和操作。许多程序员喜欢注释,因为它简化了工作,否则就需要通过部署描述符或其他方法来解决问题。但是,注释也有可能使Java代码难以理解,因为注释的有无可能会影响代码的执行方式,而这从注释中不太容易看出来。
尽管存在这么多的批评意见,但Java通常还是被认为是当今最流行的通用计算语言。在企业编程领域,它是一个广泛使用的标准,而且2005年它取代C++成为SourceForge项目使用最多的语言。使用Java有很多好处:免费的工具(适用于多种平台:Linux、Windows、Solaris和Mac均可编译和执行Java应用程序)、内容丰富的知识库以及大量乐意提供帮助的开发人员。
Java语言已经达到了开发人员生产率与代码性能之间的一个特定平衡点:CPU周期成本持续降低,但开发人员的开发周期却并未明显缩短,因此在开发人员与CPU操作码执行之间再出现一个抽象层也许是不可避免的了,它将使开发人员能够更快地创建更好的软件。实际上,Java生产率的批评者(如《Beyond Java》的Bruce Tate)可能正是观察到了这种不断推进Java使其达到新的平衡点,从而进一步牺牲性能去换取更高的开发人员生产率的趋势。
Java平台
通常有三种Java平台:Standard Edition(标准版,SE)、Enterprise Edition(企业版,EE)和Micro Edition(微型版)。每个平台都是一个包含某个语言版本、一组标准库和执行代码的虚拟机(见下文)的组合。EE是SE的超集,任何EE应用程序都可假定所有的SE库都存在。EE平台的语言使用与SE的一样。
由于小型设备(如:电话或机顶盒)的局限性,Java Micro Edition与另两个版本有很大区别。它并非SE的子集(像SE是EE的子集那样),因为它的一些库只存在于Micro Edition中。而且,ME取消了一些语言特性,如float类型和Float类,这反映了它的运行平台的局限性。ME需要与SE和EE不同的工具,而且设备之间的巨大差异使ME领域代码的可移植性更加不现实,因此许多Java开发人员将ME视为异类。
Java虚拟机
在某种程度上,Java源代码需要成为平台自带的可执行代码。这个过程一般需要两个步骤:开发人员将源代码编译成Java字节码,然后Java虚拟机(JVM)将其转换为主机平台的本地代码。第二步最初是通过解释方式执行的:读取每条JVM指令,然后动态地将其转换为一条或多条本地指令。然后,在程序开始运行时,实时(just-in-time,JIT)编译器将所有的Java程序从JVM字节码转换为本地代码。如今,该过程有多种实现方式。Sun的HotSpot编译器在运行时解释并分析代码,编译并优化对程序的操作最为关键的那部分。IBM的JVM工作原理与此非常类似。这些方法避免了由于对整个程序进行实时编译所导致的启动时性能下降,随着时间的推移,性能将会恢复,因为关键的代码部分已被定位并优化。长时间运行的服务器进程很适合采用这种方法,但这对客户机应用程序不太适用。
就像基本类型一样,现在批评人士认为Java的这个两步编译周期是一种不成熟的优化方法。他们提出疑问:如果要等到运行时将Java字节码编译为本地代码,那么为何不采用解释Java源代码(而非Java字节码)的方式,从而为开发人员节省一个步骤?正如Tate在《Beyond Java》一书中所说的那样,“Java并不是最简单的语言。它对很短的迭代也不友好……其他语言允许轻松地应用更改,而无需麻烦的编译/部署周期。”
没有Java的JVM
实际上,Tate在寻找秉承Java成功表现的后继者的过程中抱有这样的理念:“下一个在商业上取得成功的语言应该拥有在JVM上运行的版本。这将有助于该语言克服许多障碍,不管是在策略上还是在技术上。”他指出,虚拟机方法可提供安全性(“如果能确保虚拟机的安全性,则要确保语言的安全性就容易得多了”)、可移植性、互操作性和可扩展性。由于JVM已有效地解决了这些问题,因此如果新语言可运行在已安装于数百万台计算机中的JVM上,那么它就不需要自己的虚拟机。
在许多方面,这种情况业已发生。用Java为脚本语言编写解释器可有效地将这些语言移植到JVM上,如:用于JavaScript的Rhino、用于Python的Jython或者用于Ruby的JRuby。
但也可以完全绕过Java语言,而直接进入JVM级别。已经有一些将C转换为JVM字节码的编译器,如商业工具Axiomatic Multi-Platform C,它提供了ANSI C的子集。而且,Java字节码处理工具(如ASM和Apache BCEL)的发展允许Java应用程序在运行时创建可执行的类。这些类不再是Java语言,而是一种用于JVM编程的有效汇编语言。
或许由于意识到了在JVM上运行非Java代码的需求,最近已提交了一项新的JSR(Java规范请求),即“Supporting Dynamically Typed Languages on the Java Platform(在Java平台上支持动态类型化语言)”(JSR 292),它指定了一种新的字节码,将使JVM更适用于运行不含静态类型信息的语言。
没有JVM的Java
也可以从另一个角度来看问题,即不使用JVM而运行Java。毕竟从某种意义上讲,Java源代码转换为字节码,反过来字节码又转换为本地代码,没人会说这些转换不能一次完成。GNU Compiler for Java (GCJ)允许一次性地将Java源代码编译为一个平台的可执行代码。不过它尚不完善,不支持Abstract Windowing Toolkit(抽象窗口操作工具包,AWT),因此它不适用于AWT或Swing GUI编程,但它的功能足以编译服务器端和命令行应用程序。
该流程有一个明显缺陷:跨平台的代码在一步中必须绑定到一个平台。此外,静态编译并非是HotSpot的动态编译所擅长的。笔者曾参与一个项目,结果发现,与HotSpot版本相比,GCJ带来的性能提升不到5%。尽管如此,GCJ还是可以解决一些重要问题,如部署可运行的Java应用程序,而不必担心JVM是否可用或者在运行特定的版本。
Java Community Process
Java领域除了语言、库和虚拟机外,还有一个Java社区。尽管有大量用Java编写的开源软件,但在整个Java社区与开源社区之间仍然存在着公开且明显的矛盾。这在很大程度上可归咎于Sun不愿在适当的开源许可下发布它的Java实现,虽然这些源代码可在各种Sun指定的许可下获得。
有人说,这种冲突被大大地误导了。开发人员Bruno Souza在O'Reilly最新一期的Distributing the Future播客中讲到,这种反对Sun的争论完全误解了Java的性质,因为语言、库和虚拟机都是由开放且透明的Java Community Process制定的标准集:“其中的所有Java标准都被实现为开源软件。至于Sun之外的组织是否执行Java标准,我认为这区别不大。最重要的是,JCP的规则非常清楚。JCP是非常开放的标准组织。当然,它并不完美。但我认为一个非常重要的事实是,JCP创建标准,而您可以实现这些Java标准的开源形式。这极为重要,因为这就是我们想要的组合.... ”。
有人会说Java不是开源的,这样说毫无意义。因为说Java是或不是开源的并没有什么实际意义。这就像说HTTP是不是开源的一样没有实际意义。
实际上,Apache Harmony项目正在开发旨在成为“获得全球认证”的J2SE实现,它可在Apache License V2许可下获得,而且JCP允许并鼓励所有这些工作。
JCP之外的社区
但是,仍然存在许多并未采用JCP标准的Java项目。如前所述,Java是开发SourceForge项目的首选语言,但在java.net、Apache Jakarta Project、Javalobby的Javaforge、OpenSymphony以及其它无数独立站点上可找到更多的开源Java项目。在人们心目中,其中许多项目已经成熟,可与官方的JCP标准进行竞争,显然其中大部分是轻量级企业框架,如Spring framework,它诱使许多开发人员对EJB 2.1之类的“官方”规范感到失望。独立项目也快速适应了Java外部的变化,并产生了它们的最佳特性,如Rails,它就是改进后的Trails,或者如AJAX,它简化了Direct Web Remoting (DWR)项目。
结束语
十年来,数百万开发人员已使Java的面貌发生了巨大变化。现在需要推翻以往有关Java的假设了:语言与虚拟机之间的耦合、它与开源领域对立的错误描述,以及常见的对其性能或缺点的批评。在未来十年内,Java将变得完全不同,且发生巨大变化的潜力不在语言本身,而在于关注点。届时,许多开发人员将继续在不同的环境中使用不断发展的Java语言,而其他人则将在虚拟机上运行许多种不同的语言。不久以后,“什么是Java”的问题就会转变为“哪个Java?语言还是虚拟机?”这个问题。
分享到:
相关推荐
"java期末复习习题和答案总结" 一、Java基础知识点: 1. 运行Java程序需要的工具软件所在的目录是JDK的bin目录。 2. 在Java中,NULL不是一个关键字。 3. while循环和for循环都是循环结构,但是它们的使用场景不同...
问题描述: 一天,鬼谷子随意从2-99中选取...第二天, 庞涓很有自信的 对孙膑说:虽然我不知到这两个数是什麽,但我知道你一定也不知 道。随后,孙膑说: 那我知道了。庞涓说:那我也知道了。 解决上述问题的JAVA代码
从不知java 为何物到现在一个小小的j2ee 项目经理 虽说不上此道高手,大概也算有点斤两了吧 每次上网,泡bbs逛论坛,没少去java 相关的版面 总体感觉初学者多,高手少,精通的更少 由于我国高等教育制度教材陈旧,...
标题中的"C#打表工具(完整源码) 导出JSON和编译JAVA文件"是一个C#编程项目,它的主要功能是将Excel表格的数据转换成JSON格式的文件,并且能够根据这些数据自动生成Java的实体类代码。这个工具对于那些需要处理大量...
学java不知不觉也已经三年了 从不知java为何物到现在一个小小的j2ee项目经理 虽说不上此道高手,大概也算有点斤两了吧 每次上网,泡bbs逛论坛,没少去java相关的版面 总体感觉初学者多,高手少,...
Java自学指导是一个面向初学者的指南,旨在帮助那些想要学习Java但不知从何入手的人。以下是一条推荐的自学路径: 首先,你需要掌握Java Standard Edition (JavaSE),这是所有Java学习的基础。JavaSE包含了核心的...
喜欢Java,却苦于不知如何发布自己的应用,限制因素包括不知如何精简的jre,带着70~80M的身体,一处编写,到处适用就不怎么现实了。 网上搜索了大把的关于jre如何精简的资料,可是却读不懂,放了一阵,后来看到一...
在Java项目开发的世界里,实例代码是学习和理解编程概念的关键。"Java项目开发实例代码"这个资源提供了与"Java项目开发...在学习过程中,不断练习、思考和改进,你会发现自己的编程能力在不知不觉中得到了显著提升。
2. **第5章 不可不知的数据分类法──数据类型.PPT**:这部分深入讲解了Java中的数据类型,包括基本数据类型(整型、浮点型、字符型和布尔型)以及引用数据类型。还会讨论常量、变量的概念,以及如何进行类型转换。 ...
或者 开始 --> 运行 --> cmd --> 转到解压目录 --> java -jar tetris.zhh.1.1.jar 【菜单选项】 也做了不少菜单选项 可自定义控制键,可设置单色彩色显示,可设置网格是否显示网格 关卡有三组选择: 标准关卡...
Java 数据库连接 ResultSet Java 数据库连接中的 ResultSet ...ResultSet 是 Java 数据库连接中一个非常重要的概念,它提供了对数据库中数据的访问和操作。正确地使用 ResultSet,可以提高数据库操作的效率和可靠性。
中文完整高清版.pdf》是一本广受Java学习者欢迎的教程书籍,它不仅提供了对Java语言的详细介绍,而且强调了学习方法,通过各种有趣的方式帮助读者更好地理解和记忆Java编程的核心概念。这本书适合广泛的读者群体,从...
Java连接SQL Server数据库...总的来说,这个压缩包提供了Java连接SQL Server所需的JDBC驱动,你可以按照上述步骤进行配置和使用。关于JDBC驱动的详细配置,可以参考微软官方文档或网上众多教程,以便更好地理解和实践。
我没看到实体书,不知是否相同, 近些日学习一下ruby方面的,顺便看看java方面的, 这个是Java JDK6的学习笔记电子版, 压缩包里包含两个文件, 一个是chm格式(这个还行吧),当然如果你喜欢PDF,你可使用ABC Amber ...
Java编程语言以其跨平台的能力和高效执行闻名,这主要得益于其独特的执行机制,包括Java编译器、Java虚拟机(JVM)以及Java解释器。本文将深入探讨这些组件的作用和交互。 首先,Java编译器是开发过程中的关键部分...
在Java编程世界里,实践是理解概念和提升技能的关键。"关于JAVA编程的100个例子"这个压缩包提供了一百个精心设计的Java代码示例,旨在帮助初学者逐步掌握这门强大的面向对象语言。这个资源对于那些希望通过实际操作...
学java不知不觉也已经三年了 从不知java为何物到现在一个小小的j2ee项目经理 虽说不上此道高手,大概也算有点斤两了吧 每次上网,泡bbs逛论坛,没少去java相关的版面 总体感觉初学者多,高手少,精通的更少
3. 自定义列:你可以自由配置列的显示,包括宽度、对齐方式、是否可编辑等。 4. 行操作:提供行选择、行编辑、行删除等操作。 5. 数据操作:支持排序、过滤、搜索等功能。 接下来,我们来看看如何利用Java生成JSON...
人的一生,要锻炼产能,也要及时产出,引擎要转,也要停下来加油,这两者平衡的越好,你的贡献和产量就会越大。如果钻研的东西和产能目标(或者说近期的产能目标)无关的话,要舍得放手。 所以,对于SWING,暂时先...
笔记旨在理解Java SE的知识,并构建一个比较系统化的知识结构,而不是停在知其然,而不知其所以然的处境以及方便复习和查阅。在笔记中有很小一部分JVM原理的知识,即反译查看Java的字节码。这对我们理解Java SE的...