2007-02-27
Java语言下一步可能快速演化, Eclipse将疲于跟从, NetBeans 6 值得一些期待
关键字: IDE
作为Java开发者, 学习了5以后带来的泛型语法之后, 不知道你有没有注意到一个特殊的地方:
Class<?> java.lang.Object.getClass();
虽然它的签名返回值为 Class<?> , 但是它的规范文档却给出了这样的说明:
Returns ...
The actual result type is Class<? extends |X|> where |X| is the erasure of the static type of the expression on which getClass is called. For example, no cast is required in this code fragment:
Number n = 0;
Class<? extends Number> c = n.getClass();
这确实让开发者更方便, 不过仔细想想, 这本质上却超出了正常的Java语法范畴.
为了实现这个特性, 其实是在Java编译器上做了特殊处理.
翻一下已经通过OpenJDK项目GPL开源的javac源码, 可以找到对应的编译器代码在
com.sun.tools.javac.comp.Attr.visitApply(JCMethodInvocation tree){}
方法中的这段程序:
也不是那么复杂对吧, 十行代码而已. 以此认知, 假如我们想现在就自己实现类似下面的语法:
只要给每个CompilationUnit增加一个 var 类型定义, 然后类似的替换成变量初始化表达式的结果类型就可以了.
整套SUN JAVAC的代码既然已经通过GPL开源, 那么我们就可以毫无顾忌的去做一些修改, 重新发布自己的版本了 - 只要基于GPL就可以. 而最大的意义还不止如此, 因为我们不大会去变动javac的公开接口, 所以我们自己版本的javac将可以和JDK无缝兼容, 最原始的办法是将标准JDK的tools.jar更名为sun-tools.jar, 把我们自己的 javac.jar 更名为 tools.jar 放到 JDK/lib 下面去, 同时在我们jar的MANIFEST.MF里增加一个Class-Path, 引用 sun-tools.jar. 这样不仅让命令行的 javac 完全变成我们的编译工具, 连通过Apache Ant的编译脚本也无需任何改动, 成为我们扩充版本Java语言的完备的编译系统.
有人担心Java通过GPL开源以后因为上面的原因会造成太多的变形版本, 从而毁了Java语言, 不过我倒不这么认为. Java始终还是SUN的注册商标, SUN有法律权利要求变形版本不得称为 Java, 如果其它商业实体想利用SUN发布的Java相关内容另立门户, 名称问题其实很致命. 因为Java规范实质上仍旧通过JCP控制在SUN手里, 与JCP规范不完全兼容的语言版本, 是不可能得到SUN的认证从而获得Java冠名权的. 另外GPL提供了强有力的法律保障, 衍生版本的全部修改都可以合法的被SUN归入它维护的Java软件版本中, 这意味着SUN没有失去任何Java控制权, 反而会有越来越多的研究者无偿贡献他们的改进, SUN将有更多免费的, 直接可以吃下的, 经过实践检验的Java语言增值特性可供选择, 并且时机可以自己掌控. 作为Java5泛型语法源头的GJ编译器是一个先例, 以后这样的事情只会更普遍起来.
快速演进的Java语法对Eclipse来说将是一场噩梦. Eclipse相对于其它Java IDE的最大优势是从VisualAge 4J编译器演化来的增量编译器, 因为此编译器与IDE无缝紧密的集成, 让Eclipse收到很多其它IDE无法达到的好处. 但是, 成也风云, 败也风云. Eclipse JDT Compiler是Java语言语法稳定性的最大受益者之一, 但是一旦Java语法开始快速增强, JDT 弄不好就要跟着疲于奔命, 从主导Java IDE功能特性的领导者, 变成被动适应Java新语法的跟从者.
而对NetBeans来说, 在这方面的形势则颇为有利, Jackpot子项目展示并且有效的推动着SUN Javac向一个增量的, 动态恢复的, IDE友好的Java编译器兼语法元素建模工具前进. 从NB 6开始, 其Java编辑界面已经是基于javac的Compiler API模型, 虽然NetBeans团队对javac的动态特性增强还没有真正合并到SUN javac的代码当中, 但这一步已经是目前工作的方向, 完全合并的目标已经指日可待. 这个目标一旦实现, 最激动人心的结果, 那就是:
你可以基于openjdk的GPL javac, 开发并且发布你自己的Java编译器, 增加各种想要的语法元素, 只要仔细考虑一些兼容性问题, 完全可以让那些利用了这些新语法的Java项目代码, 不光是能够顺利通过javac命令行成功编译, NetBeans IDE将能够经过简单的配置, 就可以让一个Java项目引用你发布的javac版本, 通过可移植的Ant脚本, 来编译这些项目. 并且新语法元素, 将直接在NetBeans IDE中得到支持, 包括关键字高亮, 重构, 引用检索 以及更多的高级开发功能特性. 这点将是其它IDE, 特别是用自家编译器的Eclipse非常难于做到的.
另外, 通过对开发版本的NB6的试用, 我发现它已经远远超出了当年那个为了效仿Delphi而作的GUI Builder, 很多特性, 比如 重构, 相关内容高亮 等等已经直追Eclipse. 特别是从Update Center可以安装一个免费版本的Jalopy用于Java代码自动格式化, 感觉已经比Eclipse默认的自动格式化插件强了不少. 如果NB6的正式发行版也会包含免费的Jalopy, 感觉会是一大亮点.
Class<?> java.lang.Object.getClass();
虽然它的签名返回值为 Class<?> , 但是它的规范文档却给出了这样的说明:
引用
Returns ...
The actual result type is Class<? extends |X|> where |X| is the erasure of the static type of the expression on which getClass is called. For example, no cast is required in this code fragment:
Number n = 0;
Class<? extends Number> c = n.getClass();
这确实让开发者更方便, 不过仔细想想, 这本质上却超出了正常的Java语法范畴.
为了实现这个特性, 其实是在Java编译器上做了特殊处理.
翻一下已经通过OpenJDK项目GPL开源的javac源码, 可以找到对应的编译器代码在
com.sun.tools.javac.comp.Attr.visitApply(JCMethodInvocation tree){}
方法中的这段程序:
// as a special case, x.getClass() has type Class<? extends |X|>
if (allowGenerics &&
methName == names.getClass && tree.args.isEmpty()) {
Type qualifier = (tree.meth.tag == JCTree.SELECT)
? ((JCFieldAccess) tree.meth).selected.type
: env.enclClass.sym.type;
restype = new
ClassType(restype.getEnclosingType(),
List.<Type>of(new WildcardType(types.erasure(qualifier),
BoundKind.EXTENDS,
syms.boundClass)),
restype.tsym);
}
也不是那么复杂对吧, 十行代码而已. 以此认知, 假如我们想现在就自己实现类似下面的语法:
var list = new ArrayList<String>();
list.add("Haha");
只要给每个CompilationUnit增加一个 var 类型定义, 然后类似的替换成变量初始化表达式的结果类型就可以了.
整套SUN JAVAC的代码既然已经通过GPL开源, 那么我们就可以毫无顾忌的去做一些修改, 重新发布自己的版本了 - 只要基于GPL就可以. 而最大的意义还不止如此, 因为我们不大会去变动javac的公开接口, 所以我们自己版本的javac将可以和JDK无缝兼容, 最原始的办法是将标准JDK的tools.jar更名为sun-tools.jar, 把我们自己的 javac.jar 更名为 tools.jar 放到 JDK/lib 下面去, 同时在我们jar的MANIFEST.MF里增加一个Class-Path, 引用 sun-tools.jar. 这样不仅让命令行的 javac 完全变成我们的编译工具, 连通过Apache Ant的编译脚本也无需任何改动, 成为我们扩充版本Java语言的完备的编译系统.
有人担心Java通过GPL开源以后因为上面的原因会造成太多的变形版本, 从而毁了Java语言, 不过我倒不这么认为. Java始终还是SUN的注册商标, SUN有法律权利要求变形版本不得称为 Java, 如果其它商业实体想利用SUN发布的Java相关内容另立门户, 名称问题其实很致命. 因为Java规范实质上仍旧通过JCP控制在SUN手里, 与JCP规范不完全兼容的语言版本, 是不可能得到SUN的认证从而获得Java冠名权的. 另外GPL提供了强有力的法律保障, 衍生版本的全部修改都可以合法的被SUN归入它维护的Java软件版本中, 这意味着SUN没有失去任何Java控制权, 反而会有越来越多的研究者无偿贡献他们的改进, SUN将有更多免费的, 直接可以吃下的, 经过实践检验的Java语言增值特性可供选择, 并且时机可以自己掌控. 作为Java5泛型语法源头的GJ编译器是一个先例, 以后这样的事情只会更普遍起来.
快速演进的Java语法对Eclipse来说将是一场噩梦. Eclipse相对于其它Java IDE的最大优势是从VisualAge 4J编译器演化来的增量编译器, 因为此编译器与IDE无缝紧密的集成, 让Eclipse收到很多其它IDE无法达到的好处. 但是, 成也风云, 败也风云. Eclipse JDT Compiler是Java语言语法稳定性的最大受益者之一, 但是一旦Java语法开始快速增强, JDT 弄不好就要跟着疲于奔命, 从主导Java IDE功能特性的领导者, 变成被动适应Java新语法的跟从者.
而对NetBeans来说, 在这方面的形势则颇为有利, Jackpot子项目展示并且有效的推动着SUN Javac向一个增量的, 动态恢复的, IDE友好的Java编译器兼语法元素建模工具前进. 从NB 6开始, 其Java编辑界面已经是基于javac的Compiler API模型, 虽然NetBeans团队对javac的动态特性增强还没有真正合并到SUN javac的代码当中, 但这一步已经是目前工作的方向, 完全合并的目标已经指日可待. 这个目标一旦实现, 最激动人心的结果, 那就是:
你可以基于openjdk的GPL javac, 开发并且发布你自己的Java编译器, 增加各种想要的语法元素, 只要仔细考虑一些兼容性问题, 完全可以让那些利用了这些新语法的Java项目代码, 不光是能够顺利通过javac命令行成功编译, NetBeans IDE将能够经过简单的配置, 就可以让一个Java项目引用你发布的javac版本, 通过可移植的Ant脚本, 来编译这些项目. 并且新语法元素, 将直接在NetBeans IDE中得到支持, 包括关键字高亮, 重构, 引用检索 以及更多的高级开发功能特性. 这点将是其它IDE, 特别是用自家编译器的Eclipse非常难于做到的.
另外, 通过对开发版本的NB6的试用, 我发现它已经远远超出了当年那个为了效仿Delphi而作的GUI Builder, 很多特性, 比如 重构, 相关内容高亮 等等已经直追Eclipse. 特别是从Update Center可以安装一个免费版本的Jalopy用于Java代码自动格式化, 感觉已经比Eclipse默认的自动格式化插件强了不少. 如果NB6的正式发行版也会包含免费的Jalopy, 感觉会是一大亮点.
- 12:54
- 浏览 (33438)
- 评论 (62)
- 分类: Java
- 进入论坛
- 发布在 驾驭无形的力量—软件艺法思考 圈子
- 相关推荐
评论
sea7
2007-08-19
确实,我本来也是用netbeans,但现在集体开发为了同一也改用
eclipse了
eclipse了
zjlee
2007-05-24
NetBeans 的cvs功能实在不怎么样阿!!
是不是??
是不是??
xieke
2007-04-26
拜托大家用美女图作为头像而不要用自己的照片,这样可以净化论坛的环境,另外不要说一些听不懂的话了,要深入浅出嘛,太多比喻反而不好,多用代码说话,要务实嘛
javsky
2007-04-26
各种语言都有他自己的特点 这个很正常!
wing5jface
2007-03-21
SWING太差了,SWT至少可做到含JRE在内的软件发布包3M SIZE,内存占用10M的桌面软件。
jackhlp
2007-03-15
dearwolf 写道
和Idea比起来,Eclipse的重构确实太欠缺了些,不过日常用来,已经差不多了
是的,idea的重构可以说是最强的啊,支持XML文件的重构,对于如今配置文件大行其道的时代,这一点很重要。
田小鱼
2007-03-12
如果说NB的出身使得他具有优势的话,也没见到swing比SWT强到哪去,其实支不支持某些特性并不重要,关键是所支持的特性有没有价值,用的是不是广泛。
再者说,特性支持的慢点不一定是坏事,等新特性稳定下来,再进行支持也许更是明智地
再者说,特性支持的慢点不一定是坏事,等新特性稳定下来,再进行支持也许更是明智地
ssuupv
2007-03-12
eclipse用用还可以,但是,用了几年了,一直没看到他有什么好的升级。
icefire
2007-03-10
很期待NetBeans6的正式发布,到时候就能好好爽爽了!
很多时候看到的都是贬低NetBeans,抬高Eclipse的言语。
但是不管怎么样,我都会一如既往的支持NetBeans,就如我支持Opera一样,虽然用的人都比较少!
很多时候看到的都是贬低NetBeans,抬高Eclipse的言语。
但是不管怎么样,我都会一如既往的支持NetBeans,就如我支持Opera一样,虽然用的人都比较少!
dearwolf
2007-03-09
和Idea比起来,Eclipse的重构确实太欠缺了些,不过日常用来,已经差不多了
zjlee
2007-03-09
不知道netbeans的重构支持的怎样?
eclipse好像重构功能不太强
eclipse好像重构功能不太强
lbfhappy
2007-03-09
强烈同意楼上
歆渊
2007-03-09
OSGi, 其实是一种接口规范, 就像螺丝和螺母的标准口径和斜度. 这个主要是一个platform上装卸各种插件的时候发挥效用. 其实和 Java 开发用的 IDE 环境倒没有直接关系.
lovefly_zero
2007-03-09
我坦白,我真的不喜欢NetBeans,跟Eclipse没法比...
soulmachine
2007-03-08
那谁好些呢?我在osgi.org 上看到这个标准用在了各行各业,软件,工业控制,电子,。。。。貌似有很广泛的群众基础啊
歆渊
2007-03-08
soulmachine 写道
eclipse 的核心是基于osgi 标准的,netbeans 的核心是基于什么标准的?我模模糊糊看到了是个j2se ....标准。两者架构谁好一点?
NetBeans基于JavaBeans标准, 哈哈
歆渊
2007-03-08
hantsy 写道
netbeans比eclipse要早两年
不过NetBeans的起初是个人发起的一个项目, 最近才得到SUN的大力支持;
而Eclipse是当年IBM号称捐赠了价值4000万美元的软件发起的项目, 从VisualAge for Java直接拿过来好多东西.
soulmachine
2007-03-08
eclipse 的核心是基于osgi 标准的,netbeans 的核心是基于什么标准的?我模模糊糊看到了是个j2se ....标准。两者架构谁好一点?
hantsy
2007-03-08
netbeans比eclipse要早两年
simohayha
2007-03-07
steeven 写道
啥时候java的IDE能象vs一样,导个com,给你包装好,导入个ws,给你包装好。
Eclipse的Update太差劲恶心了,整天看到在状态条上忙活,死活过不去20%,插件装多了,打开一下管理器都慢。
Eclipse的GUI设计也比较差,太久没创新了,还巨耗资源。
如果Eclipse的update能综合插件评级、智能安装卸会好很多。
NB起步晚,起点高,能促进IDE发展是好事~有空去玩玩
Eclipse的Update太差劲恶心了,整天看到在状态条上忙活,死活过不去20%,插件装多了,打开一下管理器都慢。
Eclipse的GUI设计也比较差,太久没创新了,还巨耗资源。
如果Eclipse的update能综合插件评级、智能安装卸会好很多。
NB起步晚,起点高,能促进IDE发展是好事~有空去玩玩
同意,那个什么update简直就像是摆设,等update完,估计都地球末日了.
- 浏览: 181879 次
- 性别:


- 详细资料
搜索本博客
最近加入圈子
最新评论
-
实例观察网络模型与关系模 ...
Class Screwing()不就是一种服务吗?[Evans03]跟关系模型有 ...
-- by sslaowan -
我也谈谈JAVA并发程序设计 ...
读写锁,这个概念几十年前就有了,*nix下应用的很广泛。JAVA如果能支持那是更 ...
-- by ken1984 -
我也谈谈JAVA并发程序设计 ...
可惜无法下载源码看看写得怎样。。 不然,我参与进来。。。。。。
-- by whyandwhat -
我也谈谈JAVA并发程序设计 ...
使用 j.u.c 的工程在并发控制的代码编写上,明显比传统的 synchroni ...
-- by totobacoo -
我也谈谈JAVA并发程序设计 ...
不知道LZ的Hosting Based Interfacing和移动代理的差异。 ...
-- by cuijunrong






评论排行榜