java的所谓一次编译,到处运行,也是对于同一个版本的jre而言的,比如你用1.5版本编译出来的,在1.4版本的就不一定能运行了(jre包括jvm以及运行时的类库)。但是,就同一个版本的jre而言,java的确做到一次编译,到处运行。因为java编译出来的并不是具体某个平台的二进制指令,而是一种伪代码,jre就是在运行java程序的时候,把这些伪代码解析为具体某个平台的二进制指令。计算机只认识二进制,这点大家都知道的,对于不同的平台,每条指令的二进制代码不一定相同,比如move指令,windows下可能010,而unix下可能是001。java编译出来的并不是具体的010或001,而是一种可以让jre解释为010或001的伪代码。而C呢,编译出来的就直接是010或001这样的二进制指令了,所以假如你把windows下编译好的C代码拿到unix下运行,unix在遇到010时不会认为它是move指令,可能把它当作push指令(假设unix下010是push指令),这样windows下编译出来的代码就不能在unix下正常被执行。所以,C是做不到编译一次,到处运行的。但是LZ所说的,C在一个平台下编译一次,在多个相同的平台下到处运行,这是可以的。这个应该每种语言基本都能做得到。
不同的平台下,C的编译器也可能不同,C的lib,头文件等等也不同,那么,相同的程序就不一定能在不同的平台下编译,有可能需要改代码,否则就不存在移植这样的说法了。
精通C的人,可能什么都能做,但是精通java的人,可能就只能做java。java只能做到jre提供的能力范围,超越jre的范围,java是做不到的(也没必要做到,否则jre就没意义了),就好像Linux的内核是用C写,java的虚拟机也是用C写的,这点java就做不到了。
不同的平台下,C的编译器也可能不同,C的lib,头文件等等也不同,那么,相同的程序就不一定能在不同的平台下编译,有可能需要改代码,否则就不存在移植这样的说法了。
精通C的人,可能什么都能做,但是精通java的人,可能就只能做java。java只能做到jre提供的能力范围,超越jre的范围,java是做不到的(也没必要做到,否则jre就没意义了),就好像Linux的内核是用C写,java的虚拟机也是用C写的,这点java就做不到了。