Java程序的跨平台性

我们一般将CPU处理器和操作系统的整体叫做平台。CPU种类繁多,如Intel、AMD、PowerPC等等。不同的CPU有不同的特定的指令集来计算和控制计算机系统。操作系统是用户和计算机之间交互的界面软件,不同操作系统支持不同的CPU,即不同操作系统支持不同的CPU指令集,但不一定一种操作系统唯一支持一种指令集。像Windows、Linux、Mac都支持Intel和AMD的CPU指令集。

如果我们要开发程序,则我们需要确认平台是什么——CPU的类型即指令类型和操作系统。如果用标准C开发程序,使用不同的编译器后的可执行文件是可以在对应的平台上运行的。比如使用GCC编译,生成可执行文件可以在Linux上运行。使用特定编译器编译的程序只能在对应的平台上运行,编译器是与平台相关的,编译后的文件也是与平台相关的。这种执行方式称作编译执行,它把源程序与特定平台的编译器一次性编译成平台相关的机器码。优点是执行速度快,缺点是无法跨平台

Java程序的跨平台性_第1张图片

接着我们看看Java程序的跨平台性是怎么实现的——Java程序被编译成一种中间语言,再由JVM将Java字节码(.class文件)翻译成机器语言。Java源程序编译的结果是生成Java字节码,不同平台下生成的Java字节码是相同的,但由JVM翻译成的机器码却不一样。再次强调,跨平台的是Java程序,因为其后面会被与平台不相关的编译器编译成与平台不相关的中间码。JVM不是跨平台的。不同平台下需要安装不同的JVM。

Java程序的跨平台性_第2张图片

总结一下,无论我们使用什么语言编程,最终要在设备上运行,那一定要被翻译成机器能识别执行的机器码。C、C++这种编译性语言,在不同的编译器下直接编译特定的机器码,在特定的平台下运行。而Java则属于先编译后解释型的语言。与平台不相关的编译器编译成了与平台不相关的.class文件,然后再由JVM解释成其平台下的机器码。就是由于多出的这个机制,让Java程序看起来与众不同。

有人会说,不同平台下使用的机器码是不同的,所以不同平台下的JVM一般不同,这样才翻译成不同的机器码,这跟C要被翻译成不同的机器码有什么本质不同吗?怎么多了个中间码就跨平台了。如果你还冒出这个疑惑,那说明你没有真正明白跨平台指代的对象。当提出的“跨平台性”等概念时候,我们一定要紧抓其指的对象到底是什么。不然云里雾里,基础不扎实,人容易心虚不自信。

你可能感兴趣的:(Java程序的跨平台性)