`
RednaxelaFX
  • 浏览: 3053155 次
  • 性别: 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语言规范和JVM虚拟机规范.zip

    Java语言规范和JVM虚拟机规范是理解Java编程基础及其执行机制的核心文档,它们由Oracle官方发布,确保了Java开发的准确性和一致性。本压缩包包含的文件详细阐述了Java编程语言的各个方面以及Java虚拟机(JVM)的工作...

    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虚拟机规范SE8英文

    ### Java虚拟机规范SE8知识点概述 #### 一、引言 - **历史背景**:Java虚拟机(JVM)自1995年首次发布以来,已经发展成为支持多种编程语言的重要平台。 - **Java虚拟机定义**:Java虚拟机(JVM)是一种能够执行Java...

    Java虚拟机规范PDF

    ### Java虚拟机规范知识点 #### 1. JVM概述 Java虚拟机是运行所有Java程序的抽象计算机,它遵循一定的规范,这样相同的Java字节码就可以在任何遵循此规范的机器上运行。JVM的主要职责是加载字节码、执行字节码指令...

    Java 虚拟机规范.pdf

    由于提供的文件内容没有具体文字...Java 虚拟机规范是Java平台的重要组成部分,它不仅保证了Java语言的跨平台特性,也为Java的运行提供了强大的支撑。Java开发人员需要熟悉JVM规范,以便更好地编写和优化Java应用程序。

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

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

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

    Java SE 7(Java Standard Edition 7)是Java语言的一个重要版本,引入了许多新特性和改进,使得开发更加高效和灵活。下面将详细讨论Java虚拟机规范在Java SE 7中的主要内容和相关知识点。 1. 类加载机制:JVM负责...

    JDK15java虚拟机规范

    在介绍JDK15版本的Java虚拟机规范之前,需要先理解Java虚拟机(JVM)的基本概念。Java虚拟机是一种抽象的计算机,它提供了一个运行环境,使得Java程序能在不同的硬件和操作系统上以相同的方式运行。JVM规范详细定义...

    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虚拟机规范中文版》是对Java虚拟机全面深入解析的重要参考资料,对于理解和优化Java应用程序有着至关重要的作用。 在Java虚拟机规范中,主要涵盖以下几个核心知识点: 1. **内存管理**:JVM内存分为堆内存、...

    JAVA 11 虚拟机规范

    Java虚拟机规范是一套详细描述Java虚拟机(JVM)结构和行为的文档,其目的是让Java语言能够在不同的平台上运行,同时保持“一次编写,到处运行”的承诺。在Java 11版本中,虚拟机规范进行了更新,提供了对Java 11...

Global site tag (gtag.js) - Google Analytics