文章目录
声明:
本博客是本人在学习《深入理解 Java 虚拟机》后整理的笔记,旨在方便复习和回顾,并非用作商业用途。
本博客已标明出处,如有侵权请告知,马上删除。
6.1 概述
记得在第一节计算机程序课上我的老师就讲过:“计算机只认识 0 和 1,所以我们写的程序需要经编译器翻译成由 0 和 1 构成的二进制格式才能由计算机执行”。10 多年时间过去了,今天的计算机仍然只能识别 0 和 1,但由于最近 10 年内虚拟机以及大量建立在虚拟机之上的程序语言如雨后春笋般出现并蓬勃发展,将我们编写的程序编译成二进制本地机器码(Native Code)已不再是唯一的选择,越来越多的程序语言选择了与操作系统和机器指令集无关的、平台中立的格式作为程序编译后的存储格式。
6.2 无关性的基石
如果计算机的 CPU 指令集只有 x86 一种,操作系统也只有 Windows 一种,那也许 Java 语言就不会出现 。 Java 在刚刚诞生之时曾经提出过一个非常著名的宣传口号:“一次编写,到处运行(Write Once,Run Anywhere)”,这句话充分表达了软件开发人员对冲破平台界限的渴求。在无时无刻不充满竞争的 IT 领域,不可能只有 Wintel 存在,我们也不希望只有 Wintel 存在,各种不同的硬件体系结构和不同的操作系统肯定会长期并存发展。“与平台无关” 的理想最终实现在操作系统的应用层上:Sun 公司以及其他虚拟机提供商发布了许多可以运行在各种不同平台上的虚拟机,这些虚拟机都可以载入和执行同一种平台无关的字节码,从而实现了程序的 “一次编写,到处运行”。
各种不同平台的虚拟机与所有平台都统一使用的程序存储格式——字节码(ByteCode)是构成平台无关性的基石。但本节标题中刻意省略了 “平台” 二字,那是因为笔者注意到虚拟机的另外一种中立特性——语言无关性正越来越被开发者所重视。到目前为止,或许大部分程序员都还认为 Java 虚拟机执行 Java 程序是一件理所当然和天经地义的事情。但在 Java 发展之初,设计者就曾经考虑过并实现了让其他语言运行在 Java 虚拟机之上的可能性,他们在发布规范文档的时候,也刻意把 Java 的规范拆分成了 Java 语言规范《The Java Language Specification》及 Java 虚拟机规范《The Java Virtual Machine Specification》。并且在 1997 年发布的第一版 Java 虚拟机中就曾经承诺过:“In the future,we will consider bounded extensions to the Java virtual machine to provide better support for other languages”(在未来,我们会对 Java 虚拟机进行适当的扩展,以便更好地支持其他语言运行于JVM之上),当 Java 虚拟机发展到 JDK 1.7〜1.8 的时候,JVM 设计者通过 JSR-292 基本兑现了这个承诺。
时至今日