大家都说JAVA是跨平台的,其实我不是很理解,像c在Windows上用VS编译器编译可以运行,在Linux上用gcc编译可以运行,那么我觉得c也是跨平台的,但是编译后的可执行文件是无法在不同平台上执行,这个我能理解因为平台内核不一样,可执行文件坑定是不一样的,我想问JAVA的可执行文件其实是一样的是不是无论是在Linux上还是在Windows上?关键在于jdk这个东西是不是,那么我想问jdk做了什么工作在这个过程中?
平台不单纯只操作系统,包括硬件和OS,包括指令集的不同,内存管理的不同等等。
c、c++,可以认为具有跨平台“开发”的能力,但是不具备“一次编译,到处运行”的跨平台“应用”的能力。
java的跨平台不是魔法,它编译生成的是平台不相关的字节码,例如它说要有光,那么jvm(虚拟机)在windows平台点亮led,在linux平台点亮蜡烛,
在苹果平台点亮火把。
jvm的编程,一定会深入具体的平台特性,他是跨平台的关键。
首先你要明白java运行的原理,java不同于一般的编译执行计算机语言和解释执行计算机语言。它首先将源代码编译成二进制字节码(bytecode),然后依赖各种不同平台上的虚拟机来解释执行字节码
JAVA为什么能跨平台?因为字节码是在虚拟机上运行的,而不是编译器。换而言之,是因为JVM能跨平台安装,所以相应JAVA字节码便可以跟着在任何平台上运行。只要JVM自身的代码能在相应平台上运行,即JVM可行,则JAVA的程序员就可以不用考虑所写的程序要在哪里运行,反正都是在虚拟机上运行,然后变成相应平台的机器语言,而这个转变并不是程序员应该关心的。
因为JAVA有虚拟机(JVM),JAVA程序不是直接在电脑上运行的,是在虚拟机上进行的,每个系统平台都是有自己的虚拟机(JVM),所以JAVA语言能跨平台。 Java的运行离不开JVM(java虚拟机),Java语言是解释执行的,Java源代码先编译成字节码(bytecode),然后再由JVM解释字节码执行。不同的操作系统上面JVM有不同的实现机制,以确保java能够“一次编译,到处执行”,这也是java能够跨平台的原因。因为C\C++和操作系统的兼容性较好,能够进行一些底层操作,大部分的JVM都是C和C++写的。
可以建议你去买一本叫深入理解jvm虚拟机的书
去看一下虚拟机的原理
Java是运行在虚拟机上面的
就像你的电脑装了一个Linux的虚拟机
这时候再这个虚拟机就可以运行Linux的程序差不多。
跨平台是一个比较业余和含混的词。
你讨论的是移植性。
移植性有这么几个层次:
api移植性,也就是不同的系统有相同的api接口,比如unix和linux
源代码移植性,在不同平台,通过再次编译,得到可以运行的程序,比如c程序
java平台有jvm的移植性和字节码移植性。
前者就是说,一个java程序,在不同平台适配不同的jvm就可以运行。
后者是说,可以开发别的语言,在字节码上兼容java(jvm),比如scala,jruby等等语言
然后就是二进制兼容性。二进制文件可以拿另一个平台跑。
cpu架构兼容性(虚拟化兼容性)。比如说都是x86代码,linux的程序拿windows下的虚拟机可以跑。但是拿不同的cpu架构不能跑。
性能的可移植性。就是在异构运算平台上,将一个程序移植过去,而不损失性能。典型的,opengl/dx3d对于不同显卡,让同一个游戏在不同显卡上都能达到比较好的速度。如果没有性能移植性,比如专门为a显卡编写的程序,在b显卡上很慢,那么即便能运行但是很慢,也没有意义了。
移植性有很多不同的类型。所以首先搞清楚你说的是哪个。