平台独立语言的真正含义是什么?

What does platform independent languages really mean?

为什么 C/C++ 不像 java 那样被称为平台独立的,而用 C/C++ 编写的相同源代码可以在不同平台上 运行不同编译器的操作系统,就像在java.

中使用JVM一样

不同的编译器和 JVM 不是做同样的事情并实现平台独立性吗。

如果是 C 或 C++(非平台独立语言),编译器会生成一个 OS 依赖的 .exe 文件。当我们尝试在另一个 OS 上 运行 这个 .exe 文件时,它不会 运行,因为它是 OS 依赖的,因此与另一个 OS 不兼容].

Isn't different compilers and JVM doing same thing and achieving platform independence.

JVM 本身就是平台。是抽象掉了,不管是ARM/AMD64/...

C/C++ 正在编译。它可能只在为其编译的处理器(系列)上 运行。 您不能只获取 MIPS 的二进制文件并在 ARM 上执行它。

比较一下:

[C(++)]
  |
  v
[Processor]

[Java (Classfiles)]
     |
     v
   [JVM] #Abstraction layer
     |
     v
[Processor]

JVM在独立平台中的作用是充当虚拟处理器。当我们使用 c/c++ 编译时,不同的处理器将源代码转换为不同的二进制模式,这就是为什么没有平台无关的原因。

平台相关的不是语言本身。可以为 JVM 编译 C 和 C++,但这样做并不常见。 Compiling C++ for the JVM

以同样的方式,可以为特定目标而不是 JVM 编译 Java。

但是 Java 和 JVM 都是为协同工作而设计的,因此这种组合使用起来非常自然。

C被设计得非常接近硬件。如果您的目标是 JVM,则没有理由使用 C。然后使用 Java 代替。

理论上,您可以为任何目标编译任何语言,只要目标是图灵完备的。

旁注:不要写“C/C++”。它们是完全不同的语言。

C++ 语言本身不假定任何特定平台,因此在这个意义上它是平台独立的。

Isn't different compilers and JVM doing same thing and achieving platform independence.

不是真的。您的 Java 程序 运行ning JVM 中,它充当 Java 字节代码和本机机器代码之间的转换层。它 隐藏 来自 Java 应用程序代码的特定于平台的详细信息。

C 不是这种情况。C 代码(通常)运行 是原生的,因此没有转换层将它与平台特定的细节隔离开来。您的 C 代码可能会直接受到平台特定差异(字长、类型表示、字节顺序等)的影响。

一个严格符合的C程序,它不使用标准库之外的任何东西,也不对超出语言标准保证的最小值的类型大小或表示做任何假设,应该展示在编译它的任何平台上都有相同的行为。您需要做的就是针对目标平台重新编译它。

问题是现实世界中最有用的 C 和 C++ 代码并不严格遵守;几乎任何有趣的事情都必须依赖第三方和系统特定的库和实用程序,而一旦这样做,您就会失去平台独立性。我 可以 编写一个命令行工具来操作本地文件系统中的文件,这将 运行 在 Windows 和 MacOS 和 Linux 以及 VMS 和 MPE 上;我需要做的就是针对不同的目标重新编译它。然而,如果我想写一些 GUI 驱动的东西,或者通过网络通信的东西,或者必须在文件系统中导航的东西,或者类似的东西,那么我依赖于系统特定的工具,我 不能只是在不同的平台上重建代码。