【问题标题】:Is there a machine independent compiler?是否有独立于机器的编译器?
【发布时间】:2013-11-28 15:40:18
【问题描述】:

我知道 java 会生成字节码,但 JVM 每次都需要在运行时解释它。

是否存在生成与机器无关的代码的编译器,比如 C 语言。 然后在目标机器上,这会永久转换为其本地机器代码一次,而不是每次运行都转换?

这是否解决了为什么许多开发人员为 windows 开发而不是 linux 的原因?

【问题讨论】:

  • 你实际上不想要那个。 Java 可以做到这一点,但这不是一个好主意。 JVM 不仅可以为它所在的系统编译代码,还可以为它运行的情况编译代码。今天字节码 JIT 的方式不一定与明天 JIT 的方式相同。正因为如此(预热后)java 有时可以胜过 C++
  • 拥有一个独立于机器的“前端”,然后让“后端”进行从基于堆栈或基于四边形的表示法到目标机器指令的转换是相当普遍的.与机器无关的优化器可能会卡在两者之间。
  • @RichardTingle - JITCed Java 比静态编译代码运行得更快的能力正是因为它不是静态编译的。与机器独立无关。 (事实上​​,JITC 是按照我上面描述的方式构建的。)
  • @HotLicks 实际上,关键是编译一次然后一遍又一遍地使用它实际上并不像人们想象的那么棒(尽管听起来会如此)。机器独立性只是一个额外的好处
  • @RichardTingle - 可能是因为 Java 是当前唯一的架构。许多开发人员希望能够发布针对不同架构的编译应用程序,但除了 Java 之外没有其他方案可以做到这一点。曾经是旧的 P 代码方案,但在 PC 的早期就被 Borland 埋没了。

标签: java compiler-construction


【解决方案1】:

不是真的,但有些东西很接近。

C 被一些人认为是低级的,同时便于携带。 (当然,这不包括所有 API)。 GHC Haskell 编译器在这方面内部使用了一种非常类似于 c 的语言 c--,它可能与您正在寻找的依赖代码中的机器非常接近。

大多数现代编译器都有这样的中间代码,例如 LLVM。甚至还有一个类似的汇编器(所以甚至比 C 还要低)。但请注意,LLVM 中间代码不可移植,例如指针大小必须在编译时知道。 (此时C中的所有sizeofs都会固定)

但是有一个 IMO 更简单的解决方案:为任何平台编译代码,如果您在不同的平台上,您可以使用 QEMU 等动态重新编译器。这仍然会对性能产生负面影响。

【讨论】:

  • IBM 大型机可以做到这一点。代码(例如 C)被编译成中间语言,并在安装时翻译成机器代码。他们在 16 位和 32 位时代将用于中间语言的指针类型设置为 128 位(这些被转换为本机指针大小)——这将在很长一段时间内成为未来的证明。
【解决方案2】:

这当然是可能的,interpreters exist 用于 C 和 C++。但是,使用这些语言的项目通常会使用特定于平台的代码(如 Windows API),这会阻止它们的可移植性。解释型语言通常提供独立于平台的核心库。

现代编译器(如 Clang、LLVM 和 GCC)都将您的源代码编译为中间语言。这意味着相同的代码级优化可以应用于编译器可以转换的任何语言,它还支持像Emscripten 这样可以有效地将 C 编译为 JavaScript 的工具!我相信它被用于最近的JavaScript Unreal Engine demo

【讨论】:

    【解决方案3】:

    一个 Java 示例:Android 4.4 引入了一个新的实验性运行时虚拟机,ART(Android Runtime)。

    ART 跨越编译代码和解释代码之间的一个有趣的中间地带,称为提前 (AOT) 编译。目前对于 Android 应用程序,每次打开它们时,它们都会在运行时(使用 JIT)进行解释。这很慢。 (相比之下,iOS 应用程序是编译的本机代码,速度要快得多。)启用 ART 后,每个 Android 应用程序在安装时都会编译为本机代码。然后,当需要运行应用程序时,它会以原生应用程序的所有速度运行。

    Source

    【讨论】:

    • 很高兴知道这方面取得了一些进展。 Java 总是很慢
    • @user3041058 Java 通常比优化的 C/C++ 慢,但比大多数其他语言快。 Java 性能针对服务器等长时间运行的应用程序进行了优化。对于 Android 应用而言,启动时间和初始性能很重要,因此很高兴看到该方向的进展。
    猜你喜欢
    • 2012-06-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-03-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多