介绍
一点历史
Java®编程语言是一种通用的、并发的、面向对象的语言,它的语法类似于 C 和 C ++,但它省略了许多使 C 和 C ++ 复杂、混乱和不安全的特性。最初开发 Java 平台是为了解决为联网的消费者设备构建软件的问题,它旨在支持多种主机架构,并允许安全交付软件组件,为了满足这些要求,编译后的代码必须能够在网络上传输,在任何客户端上运行,并向客户端保证运行安全。
万维网的普及使这些属性更加有趣,Web 浏览器使数百万人能够以简单的方式上网并访问富媒体内容,最后有一种介质,无论你使用的是什么机器,还是连接到快速网络或慢速调制解调器,你所看到和听到的内容基本相同。
网络爱好者很快发现网络 HTML 文档格式支持的内容太有限了,HTML 扩展(例如表单)只突出了这些限制,同时明确表示没有浏览器可以包含用户想要的所有功能,可扩展性就是答案。
HotJava 浏览器首先展示了 Java 编程语言和平台的有趣属性,使在 HTML 页面中嵌入程序成为可能,程序与它们出现的 HTML 页面一起透明地下载到浏览器中,在被浏览器接受之前,会仔细检查程序以确保它们是安全的。与 HTML 页面一样,编译的程序与网络和主机无关,程序的行为方式相同,无论它们来自何处,或者它们被装入和运行的机器类型。
包含 Java 平台的 Web 浏览器不再局限于预定的一组功能,包含动态内容的网页的访问者可以确保他们的机器不会被该内容损坏,程序员可以编写程序一次,它将在任何提供 Java 运行时环境的机器上运行。
Java 虚拟机
Java 虚拟机是 Java 平台的基石,它是该技术的组成部分,负责其硬件和操作系统的独立性,其编译的代码很小以及保护用户免受恶意程序攻击的能力。
Java 虚拟机是一种抽象计算机,像真正的计算机一样,它有一个指令集并在运行时操作各种内存区域,使用虚拟机实现编程语言是相当普遍的,最著名的虚拟机可能是 UCSD Pascal 的 P -Code 机器。
在 Sun Microsystems,Inc. 完成的 Java 虚拟机的第一个原型实现模拟了由类似于当代个人数字助理(PDA)的手持设备托管的软件中的 Java 虚拟机指令集。Oracle 当前的实现模拟在移动、桌面和服务器设备上的 Java 虚拟机,但 Java 虚拟机不承担任何特定的实现技术、主机硬件或主机操作系统,它本身并没有被解释,但也可以通过将其指令集编译为硅 CPU 来实现,它也可以用微代码实现或直接用硅实现。
Java 虚拟机不知道 Java 编程语言,只知道特定的二进制格式,即 class 文件格式,class 文件包含 Java 虚拟机指令(或字节码)和符号表,以及其他辅助信息。
出于安全考虑,Java 虚拟机对 class 文件中的代码施加了强大的语法和结构约束,但是,任何具有可以用有效 class 文件表示的功能的语言都可以由 Java 虚拟机托管,由通用的、与机器无关的平台吸引,其他语言的实现者可以将 Java 虚拟机作为其语言的交付工具。
此处指定的 Java 虚拟机与 Java SE 11 平台兼容,并支持 Java 语言规范 Java SE 11 Edition 中指定的 Java 编程语言。
规范的组织
第 2 章概述了 Java 虚拟机架构。
第 3 章介绍用 Java 编程语言编写的代码编译成 Java 虚拟机指令集。
第 4 章说明了 class 文件格式,这是一种独立于硬件和操作系统的二进制格式,用于表示已编译的类和接口。
第 5 章说明了 Java 虚拟机的启动以及类和接口的加载、链接和初始化。
第 6 章说明了 Java 虚拟机的指令集,按字母顺序显示操作码助记符。
第 7 章给出了一个由操作码值索引的 Java 虚拟机操作码助记符表。
在 Java®虚拟机规范的第二版中,第 2 章概述了 Java 编程语言,该语言旨在支持 Java 虚拟机的规范,但它本身并不是规范的一部分。在 Java 虚拟机规范 Java SE 11 Edition 中,有关 Java 编程语言的信息,请参阅 Java 语言规范 Java SE 11 Edition。
在 Java®虚拟机规范的第二版中,第 8 章详细介绍了解释 Java 虚拟机线程与共享主内存交互的低级别操作,在 Java 虚拟机规范 Java SE 11 Edition 中,读者可以参考 Java 语言规范的第 17 章,Java SE 11 Edition,了解有关线程和锁的信息,第 17 章反映了 JSR 133 专家组制作的 Java 内存模型和线程规范。
符号
在整个规范中,引用了从 Java SE Platform API 中提取的类和接口,每当使用单个标识符 N 引用类或接口(除了在示例中声明的那些之外),预期的引用是包 java.lang 中名为 N 的类或接口,使用 java.lang 以外的包中的类或接口的完全限定名。
每当引用在包 java 或其任何子包中声明的类或接口时,预期的引用都是由引导类加载器加载的类或接口。
每当引用名为 java 的包的子包时,预期的引用就是由引导类加载器确定的子包。