前言
与 C/C++ 不同,Java 规范中没有“依赖具体实现”的地方,基本数据类型大小以及有关算法都做了明确的说明。例如,Java 中 int 类型永远为 32 位整数,而 C/C++ 中 int 的类型大小有可能是16位,32位,也可能与编译器的设置有关。在java中,数据类型具有固定的大小,从而具有很好的可移植性。
C/C++ 中 int 的类型大小在不同的环境存在不一,有这几方面原因:
- C/C++规定int字长和机器字长相同;
- 操作系统字长和机器字长未必一致;
- 编译器根据操作系统字长来定义int字长。
因此我们可以得知,在一些没有操作系统的嵌入式计算机系统上,int 的长度与处理器字长一致;
有操作系统时,操作系统的字长与处理器的字长不一定一致,此时编译器根据操作系统的字长来定义 int 字长。
Java 跨平台的实现原理
什么是平台
所谓的平台,就是 CPU 和操作系统的结合体。
市面上 CPU 的种类很多,不同公司生产的 CPU 支持相同或不同的指令集。指令集就是 CPU 用来计算和控制计算机系统的一套指令的集合。
操作系统是充当用户和计算机之间交互的界面软件,不同的操作系统支持不同的 CPU,严格意义上说是不同的操作系统支持不同 CPU 的指令集。例如 Windows 和 Liunx都支持 Intel 和 AMD 的复杂指令集(CISC),但并不支持精简指令集(RISC)。
总之,开发程序,首先要确定该程序在什么 CPU 上运行,也就是要知道CPU 所使用的指令集,其次要确定操作系统。
实现机制
那 Java 如何实现开发语言跨平台呢?
Java首先利用文本编辑器编写 Java 源程序,源文件的后缀名为 .java;
再利用编译器(javac)将源程序编译成后缀名为 .class 的字节码文件;
最后利用虚拟机(解释器,java)解释执行。
下图是Java实现跨平台的机制。
Java的跨平台原理可以使用八个字修饰:一次编译,到处运行。
但是需要注意的是,Java 的跨平台性是需要该平台支持并安装相应的虚拟机,才可以在该平台上运行!!
如果该平台不知识 Java 虚拟机,则不能运行!
注意
- 编译的结果不是生成机器码,而是生成字节码,字节码不能直接运行,必须通过 JVM 翻译成机器码才能运行。
- 不同平台下编译生成的字节码是一样的,但是由 JVM 翻译成的机器码却不一样。
- 跨平台的是 Java 程序,不是 JVM。
- JVM 是用 C/C++ 开发的,与各个平台是相关的。
- JVM 编译后的机器码是不能跨平台的。
与 C/C++ 对比
C/C++ 语言的跨平台原理:多次编译,到处运行。
下图是 C/C++ 不同平台运行的机制。
理论上,C/C++ 语言是执行机器码,而 Java 的执行增加了一个将字节码转换为机器码后再执行的步骤,所以Java的性能要低于 C/C++。但是经过虚拟机优化后,可以大幅提升执行效率,接近 C/C++ 的执行效率。