`
RednaxelaFX
  • 浏览: 3015096 次
  • 性别: Icon_minigender_1
  • 来自: 海外
社区版块
存档分类
最新评论

[链接帖] 新的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规范同理。

命名来源可参考此文档
引用
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.)


另外,这篇blog也讲解了新规范版本号命名的来由:JLS7 and JVMS7 online

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

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

所以想提醒大家的是,读资料啊文档啊啥的请留意它的原始出处和有效日期。
  • 大小: 229 KB
分享到:
评论
5 楼 RednaxelaFX 2011-06-13  
IcyFenix 写道
RednaxelaFX 写道
或许你把catch和finally的处理弄混了…它们是不一样的。现在的javac的处理方式是,把同一组try/catch/finally里的 finally块的代码拷贝到try块以及每一个catch块的最后,这样就避免了jsr/ret指令的使用,但异常表的作用还是照旧

不,不~光把finally块生成在catch块之后不能解决所有问题,还是需要生成异常表记录来保证catch块本身出现了异常时finally块能被正常执行到。

我说的是从以前用jsr实现finally到后来不用jsr,并且“异常表的作用照旧”。
下面是你的代码例子在JDK 1.1.8的javac编译后的结果:
public int inc();
  Code:
   Stack=1, Locals=5, Args_size=1
   0:	iconst_1
   1:	istore_1
   2:	iload_1
   3:	istore_2
   4:	jsr	25
   7:	iload_2
   8:	ireturn
   9:	pop
   10:	iconst_2
   11:	istore_1
   12:	iload_1
   13:	istore_2
   14:	jsr	25
   17:	iload_2
   18:	ireturn
   19:	astore_3
   20:	jsr	25
   23:	aload_3
   24:	athrow
   25:	astore	4
   27:	iconst_3
   28:	istore_1
   29:	ret	4
  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”。
4 楼 IcyFenix 2011-06-12  
呃,刚才眼花了,原文中的是The Java™ Programming Language,不是JLS = =#
3 楼 IcyFenix 2011-06-12  
RednaxelaFX 写道
那个…正文有仔细读么。都说不叫JVMS3和JLS4咯。废除了这种叫法,而改叫JVMS Java SE 7和JLS Java SE 7了
我看了正文,只是这样写也太麻烦了 。说JDK7和JDK1.7、Java SE和J2SE都不会让人产生歧义和误解吧= =#,何况现在JVMS3……呃,我的意思是JVMS Java SE 7的正文里面都还有直接叫JLS4的,我们就不纠结了吧:
JVMS Java SE 7 写道
For an introduction to the Java programming language, see The Java™ Programming Language, Fourth Edition, by Ken Arnold, James Gosling, and David Holmes.

RednaxelaFX 写道
或许你把catch和finally的处理弄混了…它们是不一样的。现在的javac的处理方式是,把同一组try/catch/finally里的 finally块的代码拷贝到try块以及每一个catch块的最后,这样就避免了jsr/ret指令的使用,但异常表的作用还是照旧。
不,不~光把finally块生成在catch块之后不能解决所有问题,还是需要生成异常表记录来保证catch块本身出现了异常时finally块能被正常执行到。譬如:
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     // 这条异常表记录是为上述情况准备的

RednaxelaFX 写道
我对翻译文档仍然是没什么热情…如果有其他人愿意翻的话我可以帮忙校对,但我不想自己翻。

嗯,其实校对也是很费时的工作。
我在翻译的时候已经有阴影了,很多时候想偷懒,不去琢磨某些文字的严谨性时就会想到这个出来搞不好又得被撒迦吐槽了,然后就只能认认真真滴去查去写,囧……
2 楼 RednaxelaFX 2011-06-12  
IcyFenix 写道
RednaxelaFX 写道
已死的链接:
Java语言规范:http://java.sun.com/docs/books/jls/
Java虚拟机规范:http://java.sun.com/docs/books/jvms/
旧的链接挂掉,很很很很可能意味着新的即将要出来了,JVMS3和JLS4应该在7月28日前后发布最合理。

那个…正文有仔细读么。都说不叫JVMS3和JLS4咯。废除了这种叫法,而改叫JVMS Java SE 7和JLS Java SE 7了。或许是因为无论是JLS还是JVMS在Sun时代都有些积累着一些内容没出整合版规范,出新版再用序号可能有歧义吧,所以干脆直接用对应的Java SE版本来命名了。

IcyFenix 写道
RednaxelaFX 写道
版本号在51.0或更高的Class文件中不允许出现jsr/jsr_w指令,等等。
相信现在还有许多人以为Java语言的try/catch/finally是用jsr/ret指令来实现的

try-catch-finally很早之前就改用exception handler table来处理了,不再使用jsr/jsr_w。这个我记得哪份官方文档明确说过来着。

那个…异常表跟jsr指令本来就不是同一个用途的啊。你看JVMS1里已经有对异常表的定义。

jsr/ret用来实现try/finally的话,只能解决同一方法内的跳转问题。也就是说,如果在方法foo()内某个try块里抛出了某异常,无论是对应的哪个catch块接住了,最后都用jst跳到对应的finally块里去,然后通过ret指令返回到正常的指令处理继续执行下去。

异常表则是用来解决catch的问题的。抛异常的地方跟接住异常的处理器很可能不在同一个方法里,但jsr/ret只能在同一方法内做跳转,显然是不够用的。异常表则正好处理该问题,无论抛异常的点与接异常的处理器在不在同一个方法内,都可以统一的通过查异常表的方式解决。

或许你把catch和finally的处理弄混了…它们是不一样的。现在的javac的处理方式是,把同一组try/catch/finally里的finally块的代码拷贝到try块以及每一个catch块的最后,这样就避免了jsr/ret指令的使用,但异常表的作用还是照旧。

IcyFenix 写道
RednaxelaFX 写道
Maintenance Review of JSR 924 (JavaTM Virtual Machine Specification) for Java SE 7
这篇文档有需求的话以后可以翻译一下…不过我还是想推荐阅读原文。

撒迦不如直接把JSR-133翻译了吧,搞不好正式版的JVMS3都不把JMM直接纳进来,像现在那样直接写段话说线程和锁的规定参见JSR-133了事。JVMS3我翻译好了第2、6章,2百多页,到时候一起放出来。

不用“搞不好”,是“一定不”。那个文档已经说得很清楚了,为了保证JVMS对内存模型与线程的规定与JLS保持一致,所以他们决定不从JLS里把相关规定拷贝到JVMS里去,而是做成规范间的引用,这样就总是保持一致了——JVMS总是使用JLS的内存模型与线程的规定。

我对翻译文档仍然是没什么热情…如果有其他人愿意翻的话我可以帮忙校对,但我不想自己翻。
1 楼 IcyFenix 2011-06-12  
RednaxelaFX 写道
已死的链接:
Java语言规范:http://java.sun.com/docs/books/jls/
Java虚拟机规范:http://java.sun.com/docs/books/jvms/
旧的链接挂掉,很很很很可能意味着新的即将要出来了,JVMS3和JLS4应该在7月28日前后发布最合理。

RednaxelaFX 写道
版本号在51.0或更高的Class文件中不允许出现jsr/jsr_w指令,等等。
相信现在还有许多人以为Java语言的try/catch/finally是用jsr/ret指令来实现的

try-catch-finally很早之前就改用exception handler table来处理了,不再使用jsr/jsr_w。这个我记得哪份官方文档明确说过来着。

RednaxelaFX 写道
Maintenance Review of JSR 924 (JavaTM Virtual Machine Specification) for Java SE 7
这篇文档有需求的话以后可以翻译一下…不过我还是想推荐阅读原文。

撒迦不如直接把JSR-133翻译了吧,搞不好正式版的JVMS3都不把JMM直接纳进来,像现在那样直接写段话说线程和锁的规定参见JSR-133了事。JVMS3我翻译好了第2、6章,2百多页,到时候一起放出来。

相关推荐

    Java虚拟机规范.Java SE 8版.zip

    书中基于全新Java SE 8,完整且准确地阐述Java虚拟机规范,是深度了解Java虚拟机和Java语言实现细节的必读之作。 《Java核心技术系列:Java虚拟机规范(Java SE 8版)》共分7章。第1章从宏观的角度介绍了Java虚拟机...

    java虚拟机规范高清中文版本(java SE 8版本)

    第1章 :简单地介绍了Java虚拟机的历史并... 第5章:定义了Java虚拟机启动以及类和接口的加载、链接和初始化的过程; 第6章:定义了Java虚拟机指令集; 第7章:提供了一张以操作码值为索引的Java虚拟机操作码助记表。

    Java虚拟机规范.Java SE 8版

    书中基于全新Java SE 8,完整且准确地阐述Java虚拟机规范,是深度了解Java虚拟机和Java语言实现细节的必读之作。  《Java核心技术系列:Java虚拟机规范(Java SE 8版)》共分7章。第1章从宏观的角度介绍了Java...

    java虚拟机规范

    《Java虚拟机规范(Java SE 8版)英文版》由Java虚拟机技术创建人..., 《Java虚拟机规范(Java SE 8版)英文版》基于Java SE 8,完整且准确地阐述Java虚拟机规范,是深度了解Java虚拟机和Java语言实现细节的极佳选择。

    Java虚拟机规范

    《Java虚拟机规范(Java SE 8版)英文版》由Java虚拟机技术创建人..., 《Java虚拟机规范(Java SE 8版)英文版》基于Java SE 8,完整且准确地阐述Java虚拟机规范,是深度了解Java虚拟机和Java语言实现细节的极佳选择。

    Java虚拟机规范(Java SE 7)中文版

    《Java虚拟机规范(Java SE 7版)》是Java领域最重要和最权威的著作之一,由Oracle官方发布,基于Java SE 7,对最新的Java虚拟机规范进行了完整且详细的讲解,是深度了解Java虚拟机实现细节的必读之作。由国内几位资深...

    【带书签】Java虚拟机规范(Java SE 7).pdf

    《Java虚拟机规范(Java SE 7版)》是Java领域最重要和最权威的著作之一,由Oracle官方发布,基于Java SE 7,对最新的Java虚拟机规范进行了完整且详细的讲解,是深度了解Java虚拟机实现细节的必读之作。由国内几位资深...

    java虚拟机规范 jdk8.

    书中基于全新Java SE 8,完整且准确地阐述Java虚拟机规范,是深度了解Java虚拟机和Java语言实现细节的必读之作。  《Java核心技术系列:Java虚拟机规范(Java SE 8版)》共分7章。第1章从宏观的角度介绍了Java...

    Java虚拟机规范jdk8版

    《Java虚拟机规范(Java SE 8版)英文版》中完整地讲述了由Java SE 8所引入的新特性,例如对包含默认实现代码的接口方法所做的调用,以及为支持类型注解及方法参数注解而对class文件格式所做的扩展等,还阐明了class...

    Java虚拟机规范 Java SE 8版

    书中基于全新Java SE 8,完整且准确地阐述Java虚拟机规范,是深度了解Java虚拟机和Java语言实现细节的必读之作。 《Java核心技术系列:Java虚拟机规范(Java SE 8版)》共分7章。第1章从宏观的角度介绍了Java虚拟机...

    JDK SE8 Java语言规范与虚拟机规范 官方文档

    JDK SE8 Java语言规范与虚拟机规范 官方文档,以及更多版本官方文档链接!可以更详细的理解Java语言以及Java虚拟机 这些是规范可以有多种实现

    java虚拟机2021面试题第二季

    3. 字节码验证和安全性检查:JVM对字节码进行验证,以确保它符合Java语言规范,并且没有潜在的安全漏洞。 4. 类加载和链接:JVM通过类加载器负责将字节码加载到内存中,并进行链接和初始化。类加载器还支持动态类...

    java虚拟机2021面试题第三季

    3. 字节码验证和安全性检查:JVM对字节码进行验证,以确保它符合Java语言规范,并且没有潜在的安全漏洞。 4. 类加载和链接:JVM通过类加载器负责将字节码加载到内存中,并进行链接和初始化。类加载器还支持动态类...

    java虚拟机2021面试题第一季

    3. 字节码验证和安全性检查:JVM对字节码进行验证,以确保它符合Java语言规范,并且没有潜在的安全漏洞。 4. 类加载和链接:JVM通过类加载器负责将字节码加载到内存中,并进行链接和初始化。类加载器还支持动态类...

    JAVA上百实例源码以及开源项目

     使用Java语言编写的一款用于反映颜色变化的面板,也就是大家熟悉的颜色调色板演示程序。原理是初始化颜色选择按钮,然后为颜色选择按钮增加事件处理事件,最后实例化颜色选择器。 Java二进制IO类与文件复制操作...

    JAVA上百实例源码以及开源项目源代码

     使用Java语言编写的一款用于反映颜色变化的面板,也就是大家熟悉的颜色调色板演示程序。原理是初始化颜色选择按钮,然后为颜色选择按钮增加事件处理事件,最后实例化颜色选择器。 Java二进制IO类与文件复制操作...

    java开源包4

    github-java-api 是 Github 网站 API 的 Java 语言版本。 java缓存工具 SimpleCache SimpleCache 是一个简单易用的java缓存工具,用来简化缓存代码的编写,让你摆脱单调乏味的重复工作!1. 完全透明的缓存支持,对...

Global site tag (gtag.js) - Google Analytics