Eclipse是一个流行的针对Java编程的集成开发环境(IDE)。它还可以用作编写其他语言(比如C++和Ruby)的环境,合并各种种类工具的框架,以及创建桌面或服务器应用程序的富客户端平台。如今,Eclipse开源社区拥有数十个项目,其范围从商务智能到社会网络等各个方面。Eclipse同时也是管理这些项目的非赢利性组织的名称。(而且,尽管我相当肯定它并非地板蜡,还是存在Eclipse汽车、足球队和口香糖。)
Eclipse version 3.2在Eclipse Callisto 发行历史上具有里程碑的意义:于2006年6月30日同时发布了10个Eclipse项目。本文将集中探讨Eclipse IDE,特别是其Java 开发工具 (JDT)。
JDT构成
JDT的历史可以追溯到1996年左右使用Smalltalk编写的Visual Age for Java(VAJ)。在VAJ中,一切内容都会在输入时进行编译,并在内存中完全解析。这种设计的可伸缩性不是很好,难于扩展,重建文件也有一定的困难。
1999年,该IDE团队开始开发Visual Age Micro Edition(VAME)。这个工具完全以Java编写,并使用标准Widget 工具箱(SWT)来实现其用户接口。当时的VAME将目标定为嵌入式空间中的开发与应用。为此,它使用了标准的Java VM,并把工作区保存在文件系统中。然而,文件和文件夹名称都是一些无法读取的UUID。
与VAJ提供的编译器相比,VAME的增量式编译器快了近10倍。该模型是基于状态构建的(与目前的Eclipse相反,Eclipse是基于源代码的)。VAME有自己的存储库系统Rapier,并且可以使用插件对其进行扩展。
VAME实际上并没有在社区中流行开来,但是它包含了大量优秀的思路,开发人员在接下来的Eclipse项目中延用了这些思路。2001年,Eclipse 1.0发布。它被描述为“一种通用的IDE,并不特别针对于什么内容”。一开始,Eclipse和JDT都被构建为其他开发工具使用的平台。工作区保存在磁盘上,并对其他工作区开放。Eclipse 1.0集成了CVS,而没有使用专用的存储库。
Eclipse与其先行者之间有一个重要的区别:它是开源的。其用户社区以爆炸式的速度增长,并可独立维持。Eclipse 3.2的大部分新的和改进功能都源自eclipse用户提出的增强要求。自从3.1版本以来,已经有超过30,000个修复和增强的要求得到了解决。由于要把全部这些要求都过一遍需要很长时间,下面我们就重点讲述其中一些对于大多数Java开发人员特别重要的要求。
Eclipse编译器
JDT更为强大的功能之一即是它内置的增量式Java编译器,这个编译器与javac完全兼容。尽管可以让Eclipse使用Ant和javac,甚至可以让问题标志显示在IDE中(此为3.2版本中的新功能),但是Eclipse编译器可以提供更好的诊断技术和更快的周转周期。
JDT编译器原本是为VAME而编写的,后针对Eclipse进行了修改。这个编译器构建在开发人员称之为“编译的3大规则”(模仿了阿西莫夫的机器人3大定律)之上:
·正确性:编译器不能伤害源程序。
·高效性:编译器必须快速,除非速度与规则1发生冲突。
·友好性:编译器必须帮助用户纠正编程错误,只要这类帮助不与规则1和规则2冲突。
·正确性:设计Java编译器时,不仅必须遵循相应的规范,而且必须领会该规范的“精神”,仅仅考虑正确性是不行的。因此,JDT开发人员多年来辛勤工作,以便与其他编译器的功能保持一致,其中包括Sun的编译器。在Eclipse 3.2中,仅针对正确性的检查就超过了15,000次单元测试(相比之下,VAJ中根本没有进行单元测试)。
·高效性:数千个项目和数百万行代码往往是很平常的事情。这意味着要解决很多问题,例如内存使用必须是可预测的并加以分级。Eclipse 3.2继续对此进行积极的优化。例如,开发人员可以重写一个流程图以使用位操作,结果位操作的时间消耗从20%降到了4%。
·友好性:报告错误是一门艺术。仅仅使用行号还不够。二级错误被最小化。例如,如果一个文件内漏掉了一个分号,它不会影响到与它相关的其他文件。改进后的静态分析功能有助于发现错误模式。另外,Eclipse还可以对Javadoc进行正确性检查。
就3.2版本来说,Eclipse编译器是与Java SE 6.0兼容的。没错,Eclipse支持Java 6类和StackMapTable属性(甚至在Java 6发布之前)。另外,该编译器还提供大量新的诊断功能,有助于在运行代码之前发现其中的错误。与3.2版本的编译器(提供了45种诊断功能)相比,VAJ仅提供了3类诊断功能。最新的一些诊断功能包括对以下内容的检测:
·使用显然是null的变量。
·不必要的null检查。
·对方法参数的偶然赋值。
·通过让之前的大小写状态失效的方式,切换大小写输入。
·使用非一般(原始)类型。
·未使用的标签。
·不必要的-NLS
在默认情况下,大多数这些功能都处于关闭状态。当然,还可以使用注释把它们设置为关闭状态。
从3.2版本开始,如果想在Eclipse外部使用Eclipse编译器,您可以单独下载该版本。它的命令行参数与javac兼容,并且下载文件大小仅有1MB左右。既然Eclipse编译器是开源的,所以许多其它项目(例如Apache Tomcat)就可以把它绑定到它们自己的软件中。