![剑指Java:核心原理与应用实践](https://wfqqreader-1252317822.image.myqcloud.com/cover/443/47500443/b_47500443.jpg)
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所示。
![](https://epubservercos.yuewen.com/BBFB00/26895744002143606/epubprivate/OEBPS/Images/txt001_5.jpg?sign=1739136751-AlYUxyThtRApPkgiYZ6jd3fUWVzK1606-0-ad67c038cab58075eed3c3dabad8e673)
图1-5 C语言程序针对不同指令集的处理方式
那么Java是如何解决这个问题的呢?Java设计了一套简洁的虚拟指令集,也就是字节码。如果我们想要在一台机器上运行Java程序,那么只需要将Java程序编译成字节码。编写一个将Java程序翻译成Java字节码的编译器(适用于各个平台),比编写一个将Java程序翻译成x86_64指令集的编译器要简单得多。可是这里产生了一个问题,难道我们的机器可以直接执行字节码这样的虚拟指令集吗?当然是不能的。我们需要针对不同的指令集,开发对应的字节码解释器,这个工作同样比较简单。Java程序针对不同指令集的处理方式如图1-6所示。
![](https://epubservercos.yuewen.com/BBFB00/26895744002143606/epubprivate/OEBPS/Images/txt001_6.jpg?sign=1739136751-B1YCoxKVjUuXVGS7SuLSR6KJ38ghlRu9-0-8750f504af95ec7621342531929475c5)
图1-6 Java程序针对不同指令集的处理方式
Java虚拟机是由软件技术模拟出计算机运行的一个虚拟的计算机,它负责解释执行字节码指令集。也就是说,只要一台机器可以运行Java虚拟机,那么就能运行Java语言编写的程序。而不同的平台,需要安装不同的Java虚拟机程序。那么我们编写完Java程序之后,需要先将.java的源文件编译为.class的字节码文件,然后在Java虚拟机中执行这些字节码文件。Java程序的编辑、编译、运行过程如图1-7所示。
![](https://epubservercos.yuewen.com/BBFB00/26895744002143606/epubprivate/OEBPS/Images/txt001_7.jpg?sign=1739136751-Nne5ELL6ACnCeNSeTsWpL48R43qt1uAJ-0-9849c161bf7e3e692a49f84fa1d9b21a)
图1-7 Java程序的编辑、编译、运行过程
Java虚拟机的设计不仅解决了Java程序跨平台的问题,还解决了很多语言的跨平台问题。有无Java虚拟机的对比图如图1-8所示。
![](https://epubservercos.yuewen.com/BBFB00/26895744002143606/epubprivate/OEBPS/Images/txt001_8.jpg?sign=1739136751-N3cXaQ7KbgQBjQl680AJRjkScyRClaOq-0-ffca785b8518380997815d8b43243774)
图1-8 有无Java虚拟机的对比图