Java逍遥游记
上QQ阅读APP看本书,新人免费读10天
设备和账号都新为新人

1.2 Java程序的基本运行原理

在1.1节讲过,操作系统看不懂用高级编程语言编写出来的源程序,但是能看得懂编译生成的可执行程序。那么,对于同一个可执行程序文件,是不是所有的操作系统都能看得懂呢?答案是否定的。例如,IE浏览器只能在Windows操作系统中运行,到了Linux操作系统中就无法运行,这是因为IE浏览器的可执行程序文件中包含了只有Windows操作系统才能看得懂的操作指令。

如图1-4所示,假如悟空想编写一个在Windows和Linux操作系统中都能运行的程序,那么就需要把源程序分别编译成适合这两种操作系统的可执行程序。

图1-4 把源程序分别编译成适合Windows和Linux的可执行程序

悟空觉得这样做还是有点麻烦,要是有一种编程语言可以跨操作系统平台就好了,这意味着只需对用这种语言编写出来的源程序编译一次,编译出来的可执行程序能够在所有的操作系统中运行。刚好Java语言就是悟空所期望的跨操作系统平台的高级编程语言。

Java语言为何会有跨操作系统平台的本领呢?这还得归功于Java虚拟机。Java虚拟机这名字好玄乎!Java虚拟机看不见摸不着,到底算何方神圣?它可不是工厂里的庞大无比的机器,其实它本身也不过是一个可执行程序,这个可执行程序的任务就是运行Java程序。

如图1-5所示,Java虚拟机程序本身不是跨操作系统平台的,对于不同的操作系统,有着不同的Java虚拟机可执行程序。不过,不管是哪个操作系统中的Java虚拟机,它们的任务都是一样的,该任务就是请求底层操作系统运行Java程序。

图1-5 Java程序的跨操作系统平台运行的过程

从图1-5可以看出,Java源程序是以“.java”作为扩展名的文件,编译生成的可执行程序是以“.class”作为扩展名的文件。Java可执行程序本身不能直接在操作系统中运行,它必须借助Java虚拟机才能运行。Java可执行程序中包含了只有Java虚拟机才能看得懂的二进制字节码,而Windows和Linux操作系统都无法直接看得懂这些二进制字节码。

以下图1-6进一步展示了Java虚拟机执行Java程序的过程。

图1-6 Java虚拟机执行Java程序的过程

从图1-6可以看出,Java虚拟机封装了底层操作系统的差异,不管是在哪种平台上,都按以下同样的步骤来运行程序。

(1)加载Java类,即把类的.class文件中的二进制字节码加载到内存中。

(2)对类的二进制字节码进行验证。

(3)解析并请求操作系统执行指令。