[链接帖] 新的Java语言规范、Java虚拟机规范

随着7月28日,也就是[url=http://www.jcp.org/en/jsr/detail?id=336]Java SE 7[/url]预定的发布日期越来越近,相关的一些规范也已得到或即将得到批准。

这里主要关注的是下面几个规范:
[url=http://www.jcp.org/en/jsr/detail?id=336]JSR 336: Java™ SE 7 Release Contents[/url]
[url=http://www.jcp.org/en/jsr/detail?id=901]JSR 901: Java™ Language Specification[/url]
[url=http://www.jcp.org/en/jsr/detail?id=924]JSR 924: Java™ Virtual Machine Specification[/url]

新的Oracle官网Java规范页面:[url]http://docs.oracle.com/javase/specs/index.html[/url]
另外可以通过JSR 336来获取Java SE 7的各种文档的不同版本。例如说其中的附录3(Annex 3)包含带有更详细说明的JLS7与JVMS7

Java语言规范,[url=http://download.oracle.com/otndocs/jcp/jls-7-mr3-fullv-oth-JSpec/]JSR 901的第三修订版(Maintenance Review 3)[/url]已经完成审核但尚未正式得到批准。
Java语言规范的Java SE 7版的正式版在这里:
[url]http://docs.oracle.com/javase/specs/jls/se7/jls7.pdf[/url]
[url]http://download.oracle.com/javase/7/specs/jls/JLS-JavaSE7.pdf[/url]

Java虚拟机规范,[url=http://download.oracle.com/otndocs/jcp/jvm-se7-mr3-approved-oth-JSpec/]JSR 924的第三修订版(Maintenance Review 3)[/url]在今年3月19日已经得到批准。
Java虚拟机规范的Java SE 7版的正式版在这里:
[url]http://docs.oracle.com/javase/specs/jvms/se7/jvms7.pdf[/url]
[url]http://download.oracle.com/javase/7/specs/jvms/JVMS-JavaSE7.pdf[/url]
更新:Java虚拟机规范的Java SE 7版由IcyFenix等同学翻译并发布了出来,请见[url]http://icyfenix.iteye.com/blog/1256329[/url]

[color=gray]这两个规范以前在[url=http://java.sun.com]java.sun.com[/url]官网上的链接昨天已经坏掉了。事情挺突然的,前天我还打开过老的JVM规范的链接,昨天再试就不行了。[/color]

[color=red]已死的链接[/color]:
Java语言规范:[url]http://java.sun.com/docs/books/jls/[/url]
Java虚拟机规范:[url]http://java.sun.com/docs/books/jvms/[/url]
<< [color=red]2011-06-13更新:这两个链接今天又恢复了。不过里面的内容还没全恢复,只能看到目录。[/color]
<< [color=red]2011-06-??更新:貌似两个都完全恢复了,耶。[/color]

如果有人对考古感兴趣的话,从这里可以下载到Java虚拟机规范1.0 Beta:
[url]http://www.di.uniovi.es/procesadores/Herramientas/Java/Bytecodes/vmspec.pdf[/url]

======================================================================

现在这几个规范的准确版本叫起来有点麻烦。

以前Java语言规范的大版本有三个,分别是[b]第一版[/b](First Edition,对应Java 1.0)、[b]第二版[/b](Second Edition,对应Java 2 SE 1.2)、[b]第三版[/b](Third Edition,对应Java SE 5)。Java SE 6有个修正补丁,不过没出新的大修订版规范。

以前Java虚拟机规范的大版本则有两个,分别是[b]第一版[/b](First Edition,对应Java 1.0)、[b]第二版[/b](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规范同理。

命名来源可参考[url=http://jcp.org/aboutJava/communityprocess/maintenance/jsr924/JVMSpec-JavaSE7-ChangeLog.html]此文档[/url]:
[quote]The complete amended specification is the [color=blue]Java Virtual Machine Specification[/color], [color=red]Java SE 7 Edition[/color]. (The next edition of the [color=blue]Java Language Specification[/color] will also be known as the [color=red]Java SE 7 Edition[/color].)[/quote]

另外,这篇blog也讲解了新规范版本号命名的来由:[url=https://blogs.oracle.com/abuckley/entry/jls7_and_jvms7_online]JLS7 and JVMS7 online[/url]

======================================================================

上面提到了Java SE 7的几个新规范,如果想跟踪相应的实现进度,可以关注这几个地方:

Java SE 7的参考实现的JDK7:
[url=http://openjdk.java.net/projects/jdk7/]OpenJDK: JDK7 Project[/url]
[url=http://jdk7.java.net/]java.net: JDK7 Project[/url]

另外两个主流JDK实现:
[url=http://www.oracle.com/technetwork/middleware/jrockit/overview/index.html]Oracle JRockit[/url]
[url=https://www.ibm.com/developerworks/java/jdk/]IBM JDK[/url]

另外,Java SE规范与JDK版本之间的关系也值得留意一下。[url=http://www.jroller.com/scolebourne/]Stephen Colebourne[/url]发过一帖,里面特别强调了JDK是实现而Java SE是标准,两个概念的意思的不一样的:
[url=http://www.jroller.com/scolebourne/entry/no_more_java_7]Stephen Colebourne: No more Java 7[/url]
此文对Sun迟迟不推进新的JSR来定义Java SE 7规范颇有微词。请只参考其中提到JDK与Java SE两概念的区别的部分。

======================================================================

发这篇日志的原因是最近接连有好几个人问到关于Java内存模型(Java Memory Model)的规定,例如[url=http://icyfenix.iteye.com/blog/1070804]这里提到的[/url]。
不少人都还在引用过时的文档,例如说Java语言规范第二版与Java虚拟机规范第二版的内容。它们在Java SE 5的时候就已经不适用,有新版本的规范替代了老的版本。

因而像是老的Java语言规范中提到的“read/load/store/write”等概念,因为定义不够明确所以在较新版本规范(Java语言规范第三版/Java SE 5对JVM规范的补丁)已经不再使用这样的概念了。我觉得没必要在这种已经被淘汰的概念上深究。

题外,放张[url=http://www.cs.umd.edu/~pugh/java/memoryModel/JavaOneTalk.pdf]JavaOne 2000 TS-754[/url]的图:
[img]http://dl.iteye.com/upload/attachment/509147/87c100e4-373f-329d-811b-eb98117433af.png[/img]
这是Java SE 5对Java内存模型修正之前的描述。多有趣 XD

Java平台即将渐渐向新的Java SE 7过渡。在这个前提下,我觉得以后在讨论JVM问题时,如果需要援引规范的规定,还是参考最新的版本比较好。

如果以前已经读过Java虚拟机规范第二版,想了解新版本规范与第二版的差异,下面的这个文档是个不错的入口:
[url=http://jcp.org/aboutJava/communityprocess/maintenance/jsr924/JVMSpec-JavaSE7-ChangeLog.html][b]Maintenance Review of JSR 924 (JavaTM Virtual Machine Specification) for Java SE 7[/b][/url]
这篇文档有需求的话以后可以翻译一下…不过我还是想推荐阅读原文。

除了前面提到关于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指令的,因为这条指令的原始规定不便于校验,也不便于编译器的分析,所以被废弃了。如今这条指令终于在规范里也得到明文规定被废弃。

所以想提醒大家的是,读资料啊文档啊啥的请留意它的原始出处和有效日期。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值