jvm可以提供跨平台的功能

java跨平台的原因是它运行在一个自己特有的环境中。而这个环境是可以在任意一个操作系统上进行实现的。也就是说只要在操作系统上能够建立出一个jvm那么就可以运行java编写的程序。

是不是所有操作系统上都能建立起jvm呢

那当然不是的了。
我们想一想,如果我要实现的原子功能在硬件上没法实现,那么我的程序的运行环境就是缺失的是无法搭建出来的。(比如我需要打印语句到屏幕上,可是这个设备没有屏幕,那么我的程序将不能在这上面运行)

难道只有一个语言写的程序有了相对应平台的虚拟机它才能实现跨平台吗

不,不是的。
比如c++,它可以将源代码在不同平台上编译成不同的机器码(前提:机器能够实现原子功能)。
这就需要很多种的编译器了。不同平台的编译器将源代码编译成不同的机器码。

C语言跨平台性差

像java,c++,都可以跨平台。既然语言可以跨平台,那为什么说C语言跨平台性差呢?
因为跨平台依靠的是抽象。
大家会不会觉得抽象,哈哈。
比如说我现在需要做一个扳手,然后我让铁匠和木匠去做。
我们来用来解释一下这个:
铁匠得到这个命令后,他去买来了铁,然后用火烧化,导入模具,扳手成型。
木匠得到这个命令后,她去买来了一块木头,然后进行切割,拼接,扳手成型。
好了,现在我得到了两把扳手,它们都有扳手所具有的功能。我可以使用它们去做我想做的事情。
我现在需要做一个扳手:这是一个抽象的命令
铁匠和木匠:他们是编译器,他们来实现我的命令
铁匠和木匠的原料、动作:是一条条的指令
计算机依靠指令运行,操作系统输出指令给硬件,从而得以实现功能。
那么作为一个抽象的命令给了编译器,编译器将会把他翻译成操作系统所支持的功能进行实现。
也就是把命令翻译成机器语言。不同的操作系统有不同的编译器就能实现跨平台。
重点来了:c语言你可以认为它发布的命令不是很抽象,它像一条条指令。
我们来看一下,如果我在铁匠铺打造一个扳手。首先买来了铁,然后用火烧化,导入模具,扳手成型。
我已经写好了方法,我现在要把这个方法拿到木匠铺去打造一款扳手,那么我需要将方法翻译成木匠的方法:

  1. 买来木头
  2. (用火烧化)这该怎么翻译???
  3. (导入模具)我已经不知道干什么了
    但是如果我的命令:是我现在需要做一个扳手。
    这个很抽象,交给铁匠铺,就会直接按照铁匠的方法进行执行制造。交给木匠铺,就会直接按照木匠的方法进行执行制造。
    c语言与硬件的耦合性高所以跨平台性差。