下文通过生动形象的例子,帮助小伙伴们轻轻松松地理解Java虚拟机的基本作用。
大力:“为什么说Java语言是一种高级编程语言呢?”
卫琴:“之所以称Java为高级语言,是因为它和人类的语言有一点点相近。比如用Employee类表示员工,用name属性表示员工的姓名,用selfIntro()方法模拟员工的自我介绍行为,这都很符合人类的思维习惯。”
程序是交代电脑执行的一连串操作命令。可是,电脑作为硬件,只懂得由“1”和“0”排列组合成的机器指令语言。电脑无法直接看得懂用Java高级编程语言编写出来的源程序代码。
为了让电脑“看得懂”程序员编写的Java程序,需要借助Java语言的两个重要工具:
(1)Java编译器:把Java源程序编译成Java字节码。
(2)Java虚拟机:解析并执行Java字节码。
Java编译器会把Java源程序编译成Java字节码,对于Employee.java源文件,编译后的字节码位于Employee.class类文件中。
Java编译器把Java源程序编译成Java字节码
Employee.class文件中的字节码用二进制指令来描述源程序,对普通的程序员而言,尝试阅读字节码,如同阅读外星人的文字一样困难,而且操作系统也无法看得懂字节码。
那么,到底谁会看得懂字节码呢?答案是Java虚拟机。字节码是为Java虚拟机量身定制的语言。在运行Java程序时,Java虚拟机会解析并执行这些字节码。
Java虚拟机解析并执行Java类文件中的字节码
大力:“我大学里学的是小语种语言。本来还打算从事这种语言的翻译工作。这个Java编译器有点像翻译员,把Java源程序翻译成Java虚拟机看得懂的字节码。那为什么编译器不直接把Java源程序翻译成操作系统看得懂的二进制机器指令呢?”
卫琴:“你问的问题很好。C语言的编译器就是直接把源程序翻译成操作系统看得懂的可执行程序,可执行程序中包含了二进制机器指令。问题是,不同的操作系统使用的机器指令语言不一样。这就意味着在Windows操作系统中编译出来的可执行程序只有Windows操作系统能看得懂,并顺利执行它,而Linux完全无法理解它。如果要在Linux中运行程序,还需要在Linux中重新编译源程序。”
用C语言编写的源代码需要在各个操作系统中进行编译
Java语言和其他高级语言(如C语言)的一个重要区别,就在于Java语言是跨越操作系统平台的语言。所谓跨平台,是指编译生成的Java类能够在任意的操作系统中运行。
卫琴:“Java语言之所以具有跨平台的本领,要归功于Java虚拟机。”
大力:“Java虚拟机的名字很玄乎!Java虚拟机看不见摸不着,到底是何方神圣?”
卫琴:“Java虚拟机可不是工厂里的庞大无比的机器,其实它本身也不过是个可执行程序,这个可执行程序的任务就是解析并执行Java程序。”
Java虚拟机解析并执行Java程序
Java虚拟机程序本身的实现不是跨操作系统平台的,对于不同的操作系统,需要开发专门的Java虚拟机程序。不过,不管是哪个操作系统中的Java虚拟机,它们解析并执行Java程序的行为是一样的,都包含以下步骤:
(1)解析Java类文件中的字节码。
(2)把Java字节码翻译成底层操作系统能够理解的机器指令。
(3)由底层操作系统执行机器指令。
大力:“在神话故事中,许多神仙都有特定的坐骑,太上老君的坐骑是青牛精,观音菩萨的坐骑是金毛吼,牛魔王的坐骑是避水金睛兽。有了坐骑,神仙们就能上天下海,周游世界。Java虚拟机就像Java程序的坐骑。”
卫琴:“你的这个比喻很贴切形象。当Java程序乘坐在Java虚拟机上,就能在网络世界里畅通无碍,在如今流行的分布式的软件系统中独领风骚。无论是电脑上的Windows操作系统或Linux操作系统,还是手机上的Android操作系统,都能顺利地运行Java程序。”
Java虚拟机就像Java程序的坐骑,助力跨平台运行
上文参考孙卫琴的经典Java书籍《Java面向对象编程》
标签:看得懂,Java,操作系统,虚拟机,玩意,源程序,字节 From: https://blog.51cto.com/sunweiqin/7870614