随着7月28日,也就是 Java SE 7预定的发布日期越来越近,相关的一些规范也已得到或即将得到批准。
这里主要关注的是下面几个规范:
JSR 336: Java™ SE 7 Release Contents
JSR 901: Java™ Language Specification
JSR 924: Java™ Virtual Machine Specification
Java语言规范, JSR 901的第三修订版(Maintenance Review 3)已经完成审核但尚未正式得到批准。
Java虚拟机规范, JSR 924的第三修订版(Maintenance Review 3)在今年3月19日已经得到批准。
这两个规范以前在java.sun.com官网上的链接昨天已经坏掉了。事情挺突然的,前天我还打开过老的JVM规范的链接,昨天再试就不行了。
已死的链接:
Java语言规范: http://java.sun.com/docs/books/jls/
Java虚拟机规范: http://java.sun.com/docs/books/jvms/
<<
2011-06-13更新:这两个链接今天又恢复了。不过里面的内容还没全恢复,只能看到目录。
<<
2011-06-??更新:貌似两个都完全恢复了,耶。
如果有人对考古感兴趣的话,从这里可以下载到Java虚拟机规范1.0 Beta:
http://www.di.uniovi.es/procesadores/Herramientas/Java/Bytecodes/vmspec.pdf
======================================================================
现在这几个规范的准确版本叫起来有点麻烦。
以前Java语言规范的大版本有三个,分别是
第一版(First Edition,对应Java 1.0)、
第二版(Second Edition,对应Java 2 SE 1.2)、
第三版(Third Edition,对应Java SE 5)。Java SE 6有个修正补丁,不过没出新的大修订版规范。
以前Java虚拟机规范的大版本则有两个,分别是
第一版(First Edition,对应Java 1.0)、
第二版(Second Edition,对应Java 2 SE 1.2)。Java SE 5和Java SE 6分别有些补丁,特别是Java SE 5的补丁很大,本来应该出大的修订版但Java官网上一直没更新相关信息。
实际上JSR 924就是从Java SE 5开始跟踪Java虚拟机规范的变更点的一个规范。只不过在Java SE 5和Java SE 6的时候一直没出整合的新规范,只给了补丁。
现在,两规范的新版本都不再遵循原本的序号了,而是直观的叫做“Java SE 7版”(也就是上面提到的第三修订版,Maintenance Review 3)。所以注意了哦,新的Java语言规范不叫“Java语言规范,第四版”,而是叫“Java语言规范,Java SE 7版”;JVM规范同理。
命名来源可参考 此文档:
引用
The complete amended specification is the
Java Virtual Machine Specification,
Java SE 7 Edition. (The next edition of the
Java Language Specification will also be known as the
Java SE 7 Edition.)
======================================================================
上面提到了Java SE 7的几个新规范,如果想跟踪相应的实现进度,可以关注这几个地方:
Java SE 7的参考实现的JDK7:
OpenJDK: JDK7 Project
java.net: JDK7 Project
另外两个主流JDK实现:
Oracle JRockit
IBM JDK
另外,Java SE规范与JDK版本之间的关系也值得留意一下。 Stephen Colebourne发过一帖,里面特别强调了JDK是实现而Java SE是标准,两个概念的意思的不一样的:
Stephen Colebourne: No more Java 7
此文对Sun迟迟不推进新的JSR来定义Java SE 7规范颇有微词。请只参考其中提到JDK与Java SE两概念的区别的部分。
======================================================================
发这篇日志的原因是最近接连有好几个人问到关于Java内存模型(Java Memory Model)的规定,例如 这里提到的。
不少人都还在引用过时的文档,例如说Java语言规范第二版与Java虚拟机规范第二版的内容。它们在Java SE 5的时候就已经不适用,有新版本的规范替代了老的版本。
因而像是老的Java语言规范中提到的“read/load/store/write”等概念,因为定义不够明确所以在较新版本规范(Java语言规范第三版/Java SE 5对JVM规范的补丁)已经不再使用这样的概念了。我觉得没必要在这种已经被淘汰的概念上深究。
题外,放张 JavaOne 2000 TS-754的图:
这是Java SE 5对Java内存模型修正之前的描述。多有趣 XD
Java平台即将渐渐向新的Java SE 7过渡。在这个前提下,我觉得以后在讨论JVM问题时,如果需要援引规范的规定,还是参考最新的版本比较好。
如果以前已经读过Java虚拟机规范第二版,想了解新版本规范与第二版的差异,下面的这个文档是个不错的入口:
Maintenance Review of JSR 924 (JavaTM Virtual Machine Specification) for Java SE 7
这篇文档有需求的话以后可以翻译一下…不过我还是想推荐阅读原文。
除了前面提到关于Java内存模型的规定得到了修正外,像是Class文件的校验方式之类的规定也有更新:版本号在51.0或更高的Class文件必须使用type checking校验而不能使用type inferencing校验;版本号在51.0或更高的Class文件中不允许出现jsr/jsr_w指令,等等。
相信现在还有许多人以为Java语言的try/catch/finally是用jsr/ret指令来实现的,特别是只读过老的Java虚拟机规范或者《深入Java虚拟机》(第一或第二版)的人。事实上Sun JDK里的javac从1.4.2开始就已经不生成jsr指令的,因为这条指令的原始规定不便于校验,也不便于编译器的分析,所以被废弃了。如今这条指令终于在规范里也得到明文规定被废弃。
所以想提醒大家的是,读资料啊文档啊啥的请留意它的原始出处和有效日期。
已有 5 人发表留言,猛击->>这里<<-参与讨论
ITeye推荐