0

我一直想知道为什么某些语言(例如 Java)可以在两个 Linux 上运行而对代码几乎没有修改,但其他语言几乎必须重新编写所有代码。为什么是这样?因为内核?

抱歉,如果这是一个简单的问题,但我真的没有太多线索。

另外,就Linux而言,cpu架构之间有什么区别。

4

5 回答 5

9

从技术上讲,你错了。

Java 不能在 Linux 上运行。它也不能在 Windows 上运行。它也不能在 Mac 上运行,也不能在任何其他类 Unix 操作系统上运行。就此而言,它不在任何操作系统上运行。

它直接在机器上运行。它只适用于一种类型的机器——Java 虚拟机。幸运的是,Java 虚拟机已经被虚拟化到 Linux、Windows、Mac 等平台上。

于 2012-04-09T18:57:41.500 回答
4

这是一个很长的故事,但本质上是:

  1. 二进制可执行文件始终依赖于平台。通常我们说 OS+Architecture 来表示平台。示例:Windows x86、Linux x86-64 等。这是因为它们主要在操作系统的帮助下执行,这些操作系统为可用硬件提供抽象。
  2. 字节码(不可执行)可解释文件可以独立执行,因为它们是由已经安装在机器上的二进制平台相关文件解释的。

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?

于 2012-04-09T19:04:23.510 回答
1

因为 Java 不是编译成机器码,而是编译成由 JVM(Java 虚拟机)执行的字节码,它负责操作系统的细节(并为 Java 程序提供操作系统功能的统一接口)。

于 2012-04-09T18:57:15.700 回答
0

Java 建立在称为 Java 虚拟机或 JVM 的虚拟计算机上。只要在计算机上正确实现了 JVM,所有 Java 程序都应该毫不费力地在其中运行。需要注意的是,代码本身是否包含特定于操作的项目,例如硬编码的路径名(例如,这些在 Unix 和 Windows 之间有所不同。)

于 2012-04-09T18:58:24.030 回答
0

问题不在于语言,而在于使用的库。我从事一个项目,该项目在 Windows 和 Linux 上轻松使用 99% 的相同代码。我们可以这样做是因为我们使用了具有 Windows 和 Linux 实现的库。这些库封装了特定于平台的代码。Java 也是如此:它有一个标准库,在每个平台上都以不同的方式实现。

于 2012-04-09T18:58:33.483 回答