1.5 Java语言的核心机制之JVM
Java最初风靡世界的原因是它有良好的跨平台性。而Java能够跨平台的核心机制在于它的虚拟机。
在Java出现之前,最为流行的编程语言是C语言和C++。如果我们想要在一台使用x86_64指令集的CPU的机器上运行一个C语言程序,那么就需要编写一个将C语言翻译成x86_64汇编语言的编译器。如果想要在一台使用arm指令集的CPU机器上运行一个C语言程序,那么同样需要编写一个将C语言翻译成arm汇编语言的编译器。这严重影响了C语言程序的跨平台性,因为针对特定的指令集编写编译器是一个难度非常大的工作。C语言程序针对不同指令集的处理方式如图1-5所示。
图1-5 C语言程序针对不同指令集的处理方式
那么Java是如何解决这个问题的呢?Java设计了一套简洁的虚拟指令集,也就是字节码。如果我们想要在一台机器上运行Java程序,那么只需要将Java程序编译成字节码。编写一个将Java程序翻译成Java字节码的编译器(适用于各个平台),比编写一个将Java程序翻译成x86_64指令集的编译器要简单得多。可是这里产生了一个问题,难道我们的机器可以直接执行字节码这样的虚拟指令集吗?当然是不能的。我们需要针对不同的指令集,开发对应的字节码解释器,这个工作同样比较简单。Java程序针对不同指令集的处理方式如图1-6所示。
图1-6 Java程序针对不同指令集的处理方式
Java虚拟机是由软件技术模拟出计算机运行的一个虚拟的计算机,它负责解释执行字节码指令集。也就是说,只要一台机器可以运行Java虚拟机,那么就能运行Java语言编写的程序。而不同的平台,需要安装不同的Java虚拟机程序。那么我们编写完Java程序之后,需要先将.java的源文件编译为.class的字节码文件,然后在Java虚拟机中执行这些字节码文件。Java程序的编辑、编译、运行过程如图1-7所示。
图1-7 Java程序的编辑、编译、运行过程
Java虚拟机的设计不仅解决了Java程序跨平台的问题,还解决了很多语言的跨平台问题。有无Java虚拟机的对比图如图1-8所示。
图1-8 有无Java虚拟机的对比图