write once,run anywhere!
参考资料:《揭秘Java虚拟机 JVM设计原理与实现》 封亚飞著
为什么要实现跨平台
解释这个问题还得从最开始的机器语言说起,从最初的机器语言,那个时候的程序员可真是太难了,计算机能够读懂的就是0和1,像这样,什么意思很难看懂啊
1010101
10010001000100111100101
11000111010001011111110000000001000000000000000000000000
11000111010001011111100000000010000000000000000000000000
100010110100010111111000
10100010111111100
1011101
11000011
辛辛苦苦的写了几百行机器码,过程中把一个0写成1,想一下是不是头大,你必须得一个个的检查,因可读性太差了,大佬们开始发挥自己的智慧,开发出了Fortran,B,C,C++,VB,PHP等高级语言,之所以叫高级语言,是因为它们极大的提高了我们的写代码的效率,解放了程序员的生产力。
在这种高级语言百家齐放的景象下,大家使用的技术各不相同,因此使用的芯片也不一样,需要针对不同的硬件开发,自然而然的问题就出现了啊,我在这个硬件这个平台开发的程序如何拿到另一个平台去用呢???这时天降猛男,不用我多说了吧哈哈哈哈,Java之父——James Gosling,人称詹爷。开发一款能够横跨各种异构平台的编程语言挺难的,但是呢,这可难不倒詹爷嗷,来看看詹爷做了哪些方法,如何实现跨平台的。
实现跨平台的两种方式
一款编程语言兼容底层系统的方式大概有两种
- 通过编译器实现兼容
C,C++等编程语言既能运行在Linux操作系统,又能运行于Windows操作系统;既能运行于x86平台,也能运行于AMD平台,就是通过编译器兼容的,针对不同的平台,系统开发不同的编译器,通过编译器将C,C++等代码,编译成与目标平台匹配的机器指令,从而达到编程语言的兼容性,这中间有个问题,就是如果涉及系统调用的情况下,往往都需要修改程序来调用系统特定的API,否则放到新平台上的程序是无法运行的。
- 通过中间语言来实现兼容
Java,C#等语言属于这种兼容方式。
Java,C#程序被编译之后,生成中间语言(ML),中间语言指令负责由虚拟机负责解释和运行,虚拟机在运行期间将中间语言实时翻译成与特定平台底层匹配的机器指令并运行,无论最终程序在哪种平台下运行源代码被编译生成的中间语言是相同的,中间语言的兼容性由虚拟机完成。
虚拟机将中间语言翻译成本地机器指令,其实Java的中间语言就是Java字节码指令集(该指令集对硬件CPU指令集的抽象与再加工,能够满足java开发的一切需要),对没错就是你看到以.class后缀结尾的文件中写的就是java字节码指令,不过显示的 .class文件是被反编译过的,基本与原java文件一样,我们需要反编译才能看到字节码指令。运行期直接直接由Java虚拟机根据Java字节码调用对应的机器指令来执行的,这种调用机制主要是通过依靠CPU所提供的call和jmp指令来完成的。