Java如何实现跨平台

时间:2022-06-19 06:22:53

1. 前言

     与C,C++不同,java规范中没有“依赖具体实现”的地方,基本数据类型大小以及有关算法都做了明确的说明。例如,Java中int类型永远为32位整数,而C/C++中int的类型大小有可能是16位,32位,也可能与编译器的设置有关。在java中,数据类型具有固定的大小,从而具有很好的可移植性。

     C/C++中int的类型大小在不同的环境存在不一,有这几方面原因:① C/C++规定int字长和机器字长相同;② 操作系统字长和机器字长未必一致;③ 编译器根据操作系统字长来定义int字长。因此我们可以得知,在一些没有操作系统的嵌入式计算机系统上,int的长度与处理器字长一致;有操作系统时,操作系统的字长与处理器的字长不一定一致,此时编译器根据操作系统的字长来定义int字长,比如你在64位机器上运行DOS16系统,那么所有for dos16的C/C++编译器中int都是16位的;在64位机器上运行win32系统,那么所有for win32的C/C++编译器中int都是32位的。

2. 跨平台的实现原理

2.1 什么是平台

       所谓的平台,就是CPU和操作系统的结合体。市面上CPU的种类很多,不同公司生产的CPU支持相同或不同的指令集。指令集就是CPU用来计算和控制计算机系统的一套指令的集合。指令集又分为精简指令集(RISC)与复杂指令集(CISC)。        操作系统是充当用户和计算机之间交互的界面软件,不同的操作系统支持不同的CPU,严格意义上说是不同的操作系统支持不同CPU的指令集。例如  windows和liunx都支持Intel和AMD的复杂指令集(CISC),但并不支持精简指令集(RISC)。
       总之,开发程序,首先要确定该程序在什么CPU上运行,也就是要知道CPU所使用的指令集,其次要确定操作系统。

2.2 实现机制

下图描述了C程序在不同平台的编译、运行的过程。  Java如何实现跨平台
        如图可知,使用不同的编译器编译C程序生成的可执行文件是可以在对应平台运行的,比如windows可以使用VC编译,那编译后的exe文件就可以在windows下运行;liunx下可以使用GCC编译,生成的可执行文件就可以在Liunx上运行。然而使用特定编译器编译的程序不能跨平台运行,这是因为编译器是与平台相关的,编译后的文件也是与平台相关的
      那如何实现开发语言跨平台呢?实现思想主要是将开发语言编译成一种中间语言,然后利用和平台相关的解释器进行解释执行。下图是Java实现跨平台的机制。 Java如何实现跨平台

       首先,通过与平台无关的编译器将Java源程序编译生成的中间码,该中间码与平台无关。然后通过Java虚拟机(Java Virtual Machine,简称 JVM)将中间码(字节码)文件翻译成特定平台下的机器码然后运行

       JVM也是一个软件,在不同的平台有不同的版本。也就是说,只要在不同平台上安装对应的JVM,就可以运行字节码文件,即运行我们编写的Java程序,从而实现了”一次编译,到处运行“的目的。


       注意:编译的结果不是生成机器码,而是生成字节码,字节码不能直接运行,必须通过JVM翻译成机器码才能运行。不同平台下编译生成的字节码是一样的,但是由JVM翻译成的机器码却不一样。跨平台的是Java程序,不是JVM。JVM是用C/C++开发的,与各个平台是相关的。JVM编译后的机器码是不能跨平台的。

        所以,运行Java程序必须有JVM的支持,因为编译的结果不是机器码,必须要经过JVM的再次翻译才能执行。即使你将Java程序打包成可执行文件(例如 .exe),仍然需要JVM的支持。