基本信息

编辑推荐
Oracle官方发布,Java虚拟机技术创建人撰写,国内资深Java技术专家翻译,Amazon畅销书基于最新Java SE 8,完整且准确地阐述Java虚拟机规范,是深度了解Java虚拟机和Java语言实现细节的必读之作。
内容简介
计算机书籍
本书由Oracle官方发布,Java虚拟机技术创建人撰写,国内资深Java技术专家翻译。书中基于最新Java SE 8,完整且准确地阐述Java虚拟机规范,是深度了解Java虚拟机和Java语言实现细节的必读之作。
本书共分7章。第1章从宏观的角度介绍了Java虚拟机与Java的关系及发展历程;第2章概述Java虚拟机的整体架构,包括class文件格式、数据类型、原始类型、引用类型、运行时数据区、栈帧、浮点算法、异常等,这对理解本书后面的内容有重要帮助;第3章详述如何将Java语言编写的程序转换为Java虚拟机指令集,涉及常量、局部变量、控制结构、算术运算、参数接收、方法调用、数组、操作数栈、异常处理、同步与注解等;第4章深入分析用来表示编译后的类和接口的class文件格式;第5章定义Java虚拟机启动以及类与接口的加载、链接和初始化过程;第6章阐释并列举Java虚拟机指令集;第7章提供一张以操作码值为索引的Java虚拟机操作码助记符表。
作译者
弗兰克·耶林(Frank Yellin),曾是Sun公司高级工程师,Java项目元老级成员。最近十余年中,他都从事着解释型及编译型语言的运行时系统方面的工作。在到Sun公司工作之前,他在Lucid公司从事Common Lisp编译器相关的工作。
吉拉德·布拉查(Gilad Bracha),Newspeak编程语言的创建者,曾是Sun公司杰出工程师。在到Sun公司工作之前,他在Animorphic Smalltalk System公司从事Strongtalk语言相关的工作。
亚历克斯·巴克利(Alex Buckley),Oracle公司Java编程语言和Java虚拟机规范负责人。
目录
前 言
第1章 引言1
1.1 简史1
1.2 Java虚拟机2
1.3 各章节摘要2
1.4 说明3
1.5 反馈3
第2章 Java虚拟机结构4
2.1 class文件格式4
2.2 数据类型5
2.3 原始类型与值5
2.3.1 整数类型与整型值6
2.3.2 浮点类型、取值集合及浮点值6
2.3.3 returnAddress类型和值8
2.3.4 boolean类型8
2.4 引用类型与值9
2.5 运行时数据区9
2.5.1 pc寄存器9
2.5.2 Java虚拟机栈10
译者序
Java从诞生到现在历经20多年,如今已成为一门应用场合非常广泛的编程语言。而在它逐步发展的过程中,还有另一件事物也在不断发生变化,这就是Java虚拟机。
与某些语言相比,Java的特色之一就是通常需要把编译好的class文件放在虚拟机中执行,而不是直接放在硬件上执行。这种在硬件和二进制文件中加入虚拟机层的做法,自然有其优势与局限性,然而纵观Java语言与Java虚拟机的发展脉络就可看出,各种Java虚拟机的实现者依然在以他们自己的方式不断地优化虚拟机。
虚拟机的具体实现可以有差别,但它们都遵循一套抽象的规则,这就是Java虚拟机规范。这份规范不仅可以使Java虚拟机的实现变得更加协调,而且还阐明了Java虚拟机与Java语言之间的契合点,令实现者可以在保持程序语义不变的前提下获得充分的发挥空间。
从J2SE 5.0开始,Java有了较大改变,加入了泛型、枚举、变长参数、多异常catch语句等特性,到了Java SE 8,更是引入了与lambda表达式相关的许多新功能,使Java语言的写法变得更为灵活。与此同时,Java虚拟机也在针对这些特性而调整。无论读者是否从事虚拟机开发,都可以从研读规范的过程中更为深入地体会这些特性。大家还可以参考Bill Venners所著的《Inside the Java 2 Virtual Machine》(《深入Java虚拟机(原书第2版)》),以了解Java虚拟机的原理及指令细节。
尽管Java虚拟机通常与Java语言配套使用,但除了Java语言之外,用Clojure、Scala等语言所写的程序也可以运行在Java虚拟机上。此外,还可以用Java语言实现出Python、Ruby等语言的解释器,从而将其放在Java虚拟机中执行。这些用法都表明:虚拟机规范不但对学习Java有帮助,而且还能促使我们以全新的手法来运用其他常见的语言。从某种意义上来看,Java虚拟机有其独特的地位,而且还是程序设计领域中的一种思维方式。
翻译本书的过程中,译者参考了由周志明、薛笛、吴璞渊、冶秀刚所翻译的《Java虚拟机规范(Java SE 7版)》,并保留了上一版的部分译者注,在此谨对四位译者深表感谢。同时感谢机械工业出版社华章公司诸位编辑与工作人员的帮助。
本书的风格和术语尽量与上一版相符,有时会酌情稍作调整。欢迎大家发邮件至eastarstormlee@gmail.com,或访问github.com/jeffreybaoshenlee/zh-translation-errata-jvmspec8/issues,给我以批评和指正。该网址还列有《中英文词汇对照表》,以供参考。
爱飞翔
前言
本版与前面各版一样,仅仅描述了抽象的Java虚拟机,而在实现具体的Java虚拟机时,本书指出了设计规划。Java虚拟机的实现必须体现出本书中的内容,但仅在确有必要时才应该受制于这些规范。
对于Java SE 8来说,Java编程语言里的一些重要变化在这本Java虚拟机规范中都有相应的体现。为了尽量保持二进制兼容性,我们应该直接在Java虚拟机里指定带有默认实现代码的default方法,而不应该依赖于编译器,因为那样做将无法在不同厂商、不同版本的产品之间移植,此外,那种做法也不可能适用于已有的class文件。在设计JSR 335,也就是《Lambda Expressions for the Java Programming Language》(Java编程语言的lambda表达式)时,Oracle公司的Dan Smith向虚拟机实现者咨询了将default方法集成到常量池和方法结构、方法与接口方法解析算法,以及字节码指令集中的最佳方式。JSR 335也允许在class文件级别的接口里出现private方法与static方法,而这些方法也同接口方法解析算法紧密地结合起来了。
Java SE 8的特点之一是:Java SE平台的程序库也伴随着Java虚拟机一起进化。有个小例子可以很好地说明这一特点:在运行程序的时候,Java SE 8可以获取方法的参数名,虚拟机会把这些名字存放在class文件结构中,而与此同时,java.lang.reflect.Parameter里也有个标准的API能够查询这些名字。另外,我们也可以通过class文件结构中一项有趣的统计数据来说明这个特点:本规范的第1版中定义了6个属性,其中有3个属性对Java虚拟机至关重要,而Java SE 8版的规范则定义了23个属性,其中只有5个属性对Java虚拟机很重要。换句话说,在新版规范中,属性主要是为了支持程序库而设计的,其次才是为了支持Java虚拟机本身。为了帮助读者理解class文件结构,本规范会更为清晰地描述出每项属性的角色及其使用限制。
在Oracle公司的Java Platform团队里,有多位同事都对这份规范提供了大力支持,他们包括:Mandy Chung、Joe Darcy、Joel Franck、Staffan Friberg、Yuri Gaevsky、Jon Gibbons、Jeannette Hung、Eric McCorkle、Matherey Nunez、Mark Reinhold、John Rose、Georges Saab、Steve Sides、Bernard Traversat、Michel Trudeau和Mikael Vidstedt。尤其感谢Dan Heidinga (IBM)、Karen Kinnear、Keith McGuigan及Harold Seigel,他们对常见的Java虚拟机实现中的兼容性及安全性贡献良多。
Alex Buckley
于加利福尼亚州圣克拉拉