我一直想知道为什么某些语言(例如 Java)可以在两个 Linux 上运行而对代码几乎没有修改,但其他语言几乎必须重新编写所有代码。为什么是这样?因为内核?
抱歉,如果这是一个简单的问题,但我真的没有太多线索。
另外,就Linux而言,cpu架构之间有什么区别。
我一直想知道为什么某些语言(例如 Java)可以在两个 Linux 上运行而对代码几乎没有修改,但其他语言几乎必须重新编写所有代码。为什么是这样?因为内核?
抱歉,如果这是一个简单的问题,但我真的没有太多线索。
另外,就Linux而言,cpu架构之间有什么区别。
从技术上讲,你错了。
Java 不能在 Linux 上运行。它也不能在 Windows 上运行。它也不能在 Mac 上运行,也不能在任何其他类 Unix 操作系统上运行。就此而言,它不在任何操作系统上运行。
它直接在机器上运行。它只适用于一种类型的机器——Java 虚拟机。幸运的是,Java 虚拟机已经被虚拟化到 Linux、Windows、Mac 等平台上。
这是一个很长的故事,但本质上是:
Java 代码被转换为字节码可解释文件 (.class)。它由可以安装在 Windows、Linux、Mac 平台上的依赖于平台的 Java 虚拟机解释和执行。
但是,您可以努力使您的 C/C++代码非常独立于平台,但是由于您有不同的操作系统(有时是不同的体系结构),您必须在每个要运行它的系统上编译(相同的)代码,以便构建将在该特定机器上运行的正确二进制文件。
OBS:为了使您的代码更加独立,您应该使用所有系统上都可用的库。
OBS2: To know more about executable files a good "questions" with good "answers" is: What does executable file actually contain?
因为 Java 不是编译成机器码,而是编译成由 JVM(Java 虚拟机)执行的字节码,它负责操作系统的细节(并为 Java 程序提供操作系统功能的统一接口)。
Java 建立在称为 Java 虚拟机或 JVM 的虚拟计算机上。只要在计算机上正确实现了 JVM,所有 Java 程序都应该毫不费力地在其中运行。需要注意的是,代码本身是否包含特定于操作的项目,例如硬编码的路径名(例如,这些在 Unix 和 Windows 之间有所不同。)
问题不在于语言,而在于使用的库。我从事一个项目,该项目在 Windows 和 Linux 上轻松使用 99% 的相同代码。我们可以这样做是因为我们使用了具有 Windows 和 Linux 实现的库。这些库封装了特定于平台的代码。Java 也是如此:它有一个标准库,在每个平台上都以不同的方式实现。