Java 执行全流程略讲

最近研究JVM,产生了一个困惑。Java文件被JVM的编译器(javac命令)编译成CLASS文件,JVM的解释器将CLASS文件解释执行为机器码,这是Java跨平台的基础。对于Java使用者来说这个一个常识性的东西,那么是什么让我产生了困惑呢,是"JVM的解释器将CLASS文件解释执行为机器码"这个描述。
首先解释器是怎么将CLASS文件编译成机器码的呢?其次编译成机器码的过程中是否涉及到操作系统(OS)呢?

查阅了一些资料,网上可用的资料很少,直观感觉查技术文档还是Google吧。


回忆一下基础知识,什么是字节码,什么是机器码

字节码(Byte Code)是一种包含执行程序、由一序列OP(操作)代码/数据对组成的二进制文件。字节码是一种中间码,它比机器码更抽象。它经常被看作是包含一个执行程序的二进制文件,更像一个对象模型。通常情况下它是已经经过编译,但与特定机器码无关。字节码通常不像源码一样可以让人阅读,而是编码后的数值常量、引用、指令等构成的序列。

机器语言(Machine Language)是一种指令集的体系。这种指令集,称机器码(Machine Code),是电脑的CPU可直接解读的数据。
通常意义上来理解的话,机器码就是计算机可以直接执行,并且执行速度最快的代码。

由上可知,字节码是一种于平台无关的二进制文件,而机器码是与平台息息相关的二进制文件(资料)。


问题一:
HotSpot(JVM的实现技术,1.2以后的标配)提供了Client Compiler(C1),Server Compiler(C2)两个解释器,感兴趣的朋友可以编译OpenJDK源码查看相应细节。因为本人对解释器和JIT(Just In Time,及时编译)不甚了解,所以不在这误导大家。
感兴趣的朋友可以跟一下OpenJDK相关文档以及下面两个帖子所提及的内容。
http://hllvm.group.iteye.com/group/topic/26998
http://hllvm.group.iteye.com/group/topic/39493


问题二:
还是先来说说CPU指令集和OS的关系
CPU的指令集取决于CPU的体系架构,每一种CPU都有自己的指令集,同一厂商不同型号的CPU的也有可能具有不同的指令集,目前主流的就是两类,ARM和X86。
我们组装了一个物理机,就有了一套自己的CPU架构,然后总得装个系统跑起来吧。对于不同的指令集,OS的支持不同,比如Windows支持的指令集是X86,其他的就装不了。


假设解释器在执行的时候和OS无关,那么解释器是如何识别具体的硬件系统的呢?

如果解释执行与OS无关,那么解释器的解释执行所产生的机器码就必须被每一种CPU体系架构所识别,就像OS做的事情一样。
此时,OS仅作为支持JVM能够运行的必要条件,Java程序和物理机OS没有任何关系,因为JVM实现了对硬件级别的支持,所以这个时候对于Java程序而言,JVM来说就相当于OS。
这种情况来说,JVM和CPU之间通信,它的实现和OS有相当大的重叠,就相当于每个JVM里面单独实现了一个OS,得不偿失。
那么JVM的解释执行就是和OS有关系的,有什么关系呢?

先贴一个图: 



OS管理硬件,让硬件能够正常、合理的运行,当然各种硬件的驱动实现了操作系统的接口,操作系统调用这些接口就能管理硬件。(类似于Java的面向接口,相当于JDBC)
操作系统还向程序员提供了一层接口,叫做系统呼叫层,程序员可以面向这一层的接口编程,来实现对计算机的控制,而不同的操作系统(或者说不同的CPU架构)所提供的接口都是不一样的,Windows和Linux提供给的那肯定是完全不一样的,虽然站在最终的角度来看都能实现某一功能。
所以同样一个程序是不能在不同的系统上运行的,甚至可能在同一个系统的不同版本都不一定能完美运行,这就是所谓的平台相关的程序,比如C/C++程序。
然而计算机和互联网的飞速发展,计算机种类和型号千千万,操作系统也有很多种类,Window、Linux、iOS等,同样一款软件不能不做改变就在不同的操作系统上面运行,这对开发者来说不是很友好。Java语言就能解决这个问题(说成是Java平台更准确),鉴于不同的操作系统所需要的程序是不一样的,那么就可以寻找一个方法来解决这个问题,于是JVM就诞生了。
由JVM来向下关联所有操作系统,它能操作所有操作系统,向上提供统一接口。JVM将开发者编写的程序编译成解释器能够识别CLASS文件(不一定是Java语言编写的程序),解释器将CLASS解释执行为可以在任意操作系统平台上面运行的机器码,这就是所谓的跨平台。(资料)


注:JRE中是没有javac命令的,javac命令仅存在于JDK中,具体原因请参考JDK和JRE的区别。


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值