[链接帖] 新的Java语言规范、Java虚拟机规范
随着7月28日,也就是Java SE 7预定的发布日期越来越近,相关的一些规范也已得到或即将得到批准。
这里主要关注的是下面几个规范:
JSR 336: Java? SE 7 Release Contents
JSR 901: Java? Language Specification
JSR 924: Java? Virtual Machine Specification
新的Oracle官网Java规范页面:http://docs.oracle.com/javase/specs/index.html
另外可以通过JSR 336来获取Java SE 7的各种文档的不同版本。例如说其中的附录3(Annex 3)包含带有更详细说明的JLS7与JVMS7
Java语言规范,JSR 901的第三修订版(Maintenance Review 3)已经完成审核但尚未正式得到批准。
Java语言规范的Java SE 7版的正式版在这里:
http://docs.oracle.com/javase/specs/jls/se7/jls7.pdf
http://download.oracle.com/javase/7/specs/jls/JLS-JavaSE7.pdf
Java虚拟机规范,JSR 924的第三修订版(Maintenance Review 3)在今年3月19日已经得到批准。
Java虚拟机规范的Java SE 7版的正式版在这里:
http://docs.oracle.com/javase/specs/jvms/se7/jvms7.pdf
http://download.oracle.com/javase/7/specs/jvms/JVMS-JavaSE7.pdf
更新:Java虚拟机规范的Java SE 7版由IcyFenix等同学翻译并发布了出来,请见http://icyfenix.iteye.com/blog/1256329
这两个规范以前在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规范同理。
命名来源可参考此文档:
这是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指令的,因为这条指令的原始规定不便于校验,也不便于编译器的分析,所以被废弃了。如今这条指令终于在规范里也得到明文规定被废弃。
所以想提醒大家的是,读资料啊文档啊啥的请留意它的原始出处和有效日期。 。说JDK7和JDK1.7、Java SE和J2SE都不会让人产生歧义和误解吧= =#,何况现在JVMS3……呃,我的意思是JVMS Java SE 7的正文里面都还有直接叫JLS4的,我们就不纠结了吧:public int inc() {int x;try {x = 1;return x;} catch (Exception e) {x = 2;return x;} finally {x = 3;}}javap :public int inc(); Code: Stack=1, Locals=5, Args_size=1 0: iconst_1 1: istore_1 2: iload_1 3: istore 4 5: iconst_3 6: istore_1 7: iload 4 9: ireturn 10: astore_2 11: iconst_2 12: istore_1 13: iload_1 14: istore 4 16: iconst_3 17: istore_1 18: iload 4 20: ireturn 21: astore_3 22: iconst_3 23: istore_1 24: aload_3 25: athrow Exception table: from to target type 0 5 10 Class java/lang/Exception 0 5 21 any 10 16 21 any // 这条异常表记录是为上述情况准备的
public int inc(); Code: Stack=1, Locals=5, Args_size=1 0:iconst_1 1:istore_1 2:iload_1 3:istore_2 4:jsr25 7:iload_2 8:ireturn 9:pop 10:iconst_2 11:istore_1 12:iload_1 13:istore_2 14:jsr25 17:iload_2 18:ireturn 19:astore_3 20:jsr25 23:aload_3 24:athrow 25:astore4 27:iconst_3 28:istore_1 29:ret4 Exception table: from to target type 0 9 9 Class java/lang/Exception 0 19 19 any // 这里 LineNumberTable: line 4: 0 line 5: 0 line 6: 2 line 7: 9 line 8: 10 line 9: 12 line 4: 19 line 11: 27 line 4: 29
看到了么,finally一直都有这么一块覆盖全范围的代码,用不用jsr都一样。所以说“异常表作用照旧”。废除jsr之后替代它的就是所谓的“inline finally”。