【问题标题】:Why do you have to write separate Programs for Windows & Linux为什么你必须为 Windows 和 Linux 编写单独的程序
【发布时间】:2012-04-10 03:12:59
【问题描述】:

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

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

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

【问题讨论】:

标签: java linux architecture compiler-construction


【解决方案1】:

技术上你错了。

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

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

【讨论】:

    【解决方案2】:

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

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

    Java 代码被转换为字节码可解释文件 (.class)。它由平台相关的 Java 虚拟机解释和执行,可以安装在 Windows、Linux、Mac 平台上。

    但是,您可以努力使您的 C/C++ 代码 非常独立于平台,但是由于您有不同的操作系统(有时是不同的架构),您必须在您想运行它的每个系统,以便构建将在该特定机器上运行的正确二进制文件。

    OBS:为了使您的代码更加独立,您应该使用所有系统上都可用的库。

    OBS2:要了解有关可执行文件的更多信息,一个好的“问题”和好的“答案”是:What does executable file actually contain?

    【讨论】:

      【解决方案3】:

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

      【讨论】:

        【解决方案4】:

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

        【讨论】:

        • 我正在阅读有关该内容的信息,这似乎是一种非常酷的做事方式。是否有任何其他语言本身可以编译成中间代码。
        • @TheBlueCat:.NET 上的每种语言,我相信,使用 CLR,它等同于 JVM。特别是 C#。有 C++ 和 VB 的 .NET 版本,不应与非 .NET 版本混淆。 Java 曾经单独在 JVM 上,但现在有一堆语言可以编译/解释成它的字节码。
        【解决方案5】:

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

        【讨论】:

        • 你仍然需要为每个平台甚至架构编译,而 Java 只编译一次。因此,这不仅是库,而且是一个依赖于语言的问题。除此之外,Java 标准库是用 Java 实现的,因此在每个平台上都是相同的。不同的是 JVM。
        • 您确实仍然需要为每个架构进行编译,但我不同意必须为每个平台进行编译。只要两个平台在相同的架构上,完全有可能在两者上运行相同的二进制文件。
        • 而且 Java 标准库不是用 Java 实现的。其中一些是,但肯定不是全部。
        • 嗯,这取决于你如何定义标准库。确实,操作系统特定的东西,如 GUI、文件访问等,通常以特定于平台的方式实现,但它主要只是完成工作所需的真正。如果您将 JVM 视为 Java 在其上运行的平台,则可以将这些本机实现视为该“平台”(JVM)的一部分。除此之外,我的观点是:库只是其他语言必须重新编译的部分原因,另一个重要部分是语言本身。
        猜你喜欢
        • 2012-02-05
        • 1970-01-01
        • 2020-05-31
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-03-06
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多