为什么C和C++难跨平台?
要了解java为什么可以跨平台,知道为什么之前的语言不能才能更加体会到跨平台,在java诞生之前,C和C++是主流的语言,两者的特点就是快,因为它们是直接一次编译成机器码来执行的。
直接编译成机器码会造成以下两点问题:
1.机器架构不同,对应机器码的含义也不同,而C/C++的编译器在不同的架构中会生成不同的机器码,你说我拿X86架构的机器码运行在ARM上可不可以,当然是会出错。
2.操作系统不同带来的不便,每个操作系统的文件管理,内存管理都是不同的实现,使用C/C++自然也就需要重新定义一下
那么针对以上两点,java是如何克服的呢?
字节码:
java字节码,直白的来说就是面向JVM(java虚拟机)开发的一种指令集,它是一些16进制的数字,JVM可以根据字节码文件来执行命令,从java语言到机器语言一般会经历以下几个步骤:
JVM:
JVM是java虚拟机,JVM对于不同的操作系统有着不同的实现,同时java标准类库提供了跨平台的一致接口,JVM中的JIT(即时编译器)还可以根据本地的硬件架构生成不同的机器码。
那么JVM存在哪呢,下java时也只是下了个JDK呀,看看下面的图你就知道了:
编译与解释共存:
C/C++可以一次就编译成机器语言被称为编译型语言,python被称为解释型语言,而java却被称为半编译半解释型语言,通过下面的图就可以知道为什么了:
可以看到在字节码执行的时候会有部分代码是被直接编译成机器语言,部分代码是解释执行,所以称java为半编译半解释型语言
总结:
总结一下,字节码是面向JVM而开发的一套指令集,JVM在不同的编译器中有不同的实现,JVM通过半编译半解释的特性来与底层硬件交互,JVM充当了中间人,使得开发者能专注代码实现而不用太操劳底层硬件,编写一套代码转换成字节码后只用换一个JVM的版本或类型就可以实现多个平台的使用,也就是一次编译到处运行。