1.2.2 JVM:跨语言的平台
本书所讲的JVM与Java SE 8平台相互兼容,如果说Java是跨平台的语言,那JVM就是跨语言的平台。首先,我们看一下JVM的官方文档,如图1-3所示,请扫码查看。
图1-3 JVM官方文档介绍
JVM是整个Java平台的基石,是Java技术用于实现硬件无关与操作系统无关的关键部分,是Java语言生成出极小体积的编译代码的运行平台,是保障用户机器免于恶意代码损害的屏障。
JVM可以看作是一台抽象的计算机。如同个人计算机,它有自己的指令集以及各种运行时内存区域。使用虚拟机来实现一门程序设计语言是相当常见的,业界中流传最为久远的虚拟机可能是UCSD Pascal的P-Code虚拟机。
第一个JVM的原型机是由Sun Microsystems公司实现的,它用在一种类似PDA(Person Digital Assistant,掌上电脑)的手持设备上,以仿真实现JVM指令集。时至今日,Oracle已经将许多JVM实现应用于移动设备、台式机和服务器等领域。但JVM并不局限于特定的实现技术、主机硬件和主机操作系统。JVM也不局限于特定的代码执行方式,它虽然不强求使用解释器来执行程序,但是也可以通过把自己的指令集编译为实际CPU的指令来实现。它可以通过微代码(Microcode)来实现,甚至可以直接在CPU中实现。
JVM与Java语言并没有必然的联系,它只与特定的二进制文件格式——class文件格式所关联。class文件包含JVM指令集[或者称为字节码(Bytecode)]和符号表,以及其他一些辅助信息。
基于安全方面的考虑,JVM在class文件中施加了许多强制性的语法和结构化约束,凡是能用class文件正确表达出来的编程语言,都可以放在JVM里面执行。由于它是一个通用的、与机器无关的执行平台,所以其他语言的实现者都可以考虑将JVM作为那些语言的交付媒介。
随着Java 7的正式发布,JVM的设计者通过JSR-292规范基本实现了在JVM平台上运行非Java语言编写的程序,如图1-4所示。不同的编译器,可以编译出相同的字节码文件,字节码文件也可以在不同的JVM上运行。
图1-4 JVM跨平台的语言
JVM根本不关心运行在其内部的程序到底是使用何种编程语言编写的,它只关心“字节码”文件。也就是说JVM拥有语言无关性,并不会单纯地与Java语言“终身绑定”,只要其他编程语言的编译结果满足并包含JVM的内部指令集、符号表以及其他的辅助信息,它就是一个有效的字节码文件,就能够被虚拟机所识别并装载运行。现在开发语言越来越多,虽然Java语言并不是最强大的语言,但JVM可以说是业内公认的最强大的虚拟机。
我们平时说的Java字节码,指的是用Java语言编译成的字节码。准确地说,任何能在JVM平台上执行的字节码格式都是一样的。所以应该统称为“JVM字节码”。
Java平台上的多语言混合编程正在成为主流,通过特定领域的语言去解决特定领域的问题是当前软件开发应对日趋复杂的项目需求的一个方向。
试想一下,在一个项目之中,并行处理使用Clojure语言,展示层使用JRuby/Rails语言,中间层则使用Java语言,每个应用层都使用不同的编程语言来完成。而且,接口对每一层的开发者都是透明的,各种语言之间的交互不存在任何困难,就像使用自己语言的原生API一样方便,因为它们最终都运行在一个虚拟机上。
对这些运行于JVM之上、Java之外的语言,来自系统级的、底层的支持正在迅速增强,以JSR-292为核心的一系列项目和功能改进(如Da Vinci Machine项目、Nashorn引擎、InvokeDynamic指令、java.lang.invoke包等),推动JVM从“Java语言的虚拟机”向“多语言虚拟机”的方向发展。
前面讲了这么多JVM,那么JVM在整个JDK体系中处于什么位置呢?如图1-5所示,JDK包含了JRE,JRE包含了JVM。
图1-5 JVM在JDK中的位置