【问题标题】:What are the disadvantages of targeting the JVM instead of x86?针对 JVM 而不是 x86 的缺点是什么?
【发布时间】:2010-06-02 18:28:43
【问题描述】:

我正在开发一种新语言。我最初的目标是为 Windows 平台编译为本机 x86,但现在我很怀疑。

我已经看到一些针对 JVM 的新语言(最著名的 Scala 和 Clojure)。当然,不可能将每种语言轻松移植到 JVM;这样做可能会导致语言及其设计发生小的变化。

提出这个问题后,我什至对这个决定产生了更多的怀疑。我现在知道一些“专业”的 JVM 参数。最初的问题是:在为新语言创建编译器时,以 JVM 为目标是个好主意吗?

更新了问题:在 Windows 上针对 JVM 而不是 x86 有什么缺点?

【问题讨论】:

  • 没有动态输入?对于已经在 J​​VM 上运行的动态类型脚本语言来说,这将是一个惊喜……
  • 好问题,非常有趣。我建议你加强标题,让它提到使用 JVM 编译器的意图。
  • 而且没有“本机动态类型”之类的东西。 VM 运行时要么支持它,要么不支持,对于这种概念来说,本机机器的级别太低了。
  • @skaffman,因为静态类型是动态类型 VM 的高级概念,动态类型是静态类型 VM 的高级概念。比方说:“原生”是指它是在最低级别实现的,而不是在更高级别。
  • @Michael Borgwardt:他们不会通过奇异的扭曲来使其工作,而是通过奇异的扭曲来使其快速。但这并不是 JVM 独有的。本地实现的动态语言为了使其快速而进行奇怪的扭曲,这只是不同的扭曲。您是否研究过任何高性能 Smalltalk VM 的实现?实际上,HotSpot 重新命名的高性能 Smalltalk VM!

标签: compiler-construction jvm


【解决方案1】:

您可能希望查看针对 LLVM 而不是 JVM。 LLVM 可用于针对多种架构,包括 x86。

除了简单的 CPU 支持之外,可移植性还有很多,但 LLVM 可以提供很多帮助,并且如果您愿意,它仍然可以为您提供本机代码。

【讨论】:

    【解决方案2】:

    以 JVM 为目标是一种久经考验的方法。 Clojure、Scala、JRuby 和many other languages 已经成功地做到了这一点,这一事实应该让您放心。

    我的总体观点是,JVM 可能是目前新的/实验性语言的最佳目标,特别是如果您希望在利用真正出色的 JIT 编译器和大量非常强大的库的同时实现跨平台功能。

    话虽如此,我认为针对 JVM 可能遇到的主要缺点如下:

    • 缺乏字节码级别的尾递归支持。有一些方法可以解决这个问题(例如,参见 Clojure 的“recur”特殊形式),但对于某些语言实现来说,这很烦人,尤其是函数式语言。可能最终会在未来的 Java 版本中得到修复。

    • 有点明显,但您需要在客户端上安装 JVM。现在通常不是问题,但在某些情况下这可能会很棘手。

    • Java 中的基元(int、long、float 等)的行为与对象系统的其余部分不同。同样,您可以解决此问题,但对于语言实施者来说这是一些额外的麻烦。

    一些可能有用/有趣的链接:

    【讨论】:

    • 如何 在字节码级别支持尾递归?如果递归调用中发生异常,堆栈跟踪应该包括所有嵌套调用,不是吗?如果一种语言指定看起来像尾递归调用的东西可能不会生成堆栈跟踪条目,那么用循环替换它是合法的,但除非该语言指定我认为 JVM 不应该做出这种推断.
    • 我猜 JVM 可以以向后兼容的方式实现尾递归,其中语言实现者可以向 JVM(可能在方法级别)表明他们不关心完整的堆栈跟踪。想要 TCO 的语言可以要求这样做,其他人都会得到旧的行为。
    • 我认为对语言有一个尾调用结构会更好,并要求使用该功能的程序使用更新版本的 JVM(同样支持它)。一个针对旧 JVM 的程序不可能支持百万深度的“递归”,同时让尾调用与传统调用一样高效,让旧 JVM 将尾调用转换为传统调用比让它直接拒绝更糟糕加载代码。
    【解决方案3】:

    如果您为 JVM 创建一种语言,那么您还有一个巨大的优势,那就是一个巨大的库就在您的脚下,可以在您的语言中轻松使用。如果您为 x86 编译,这很可能不是这种情况。我假设您无法包含例如您的语言中的 C 标头,无需 C 解析器。

    出于这个原因,Scala、Groovy 和其他软件如此成功。

    在 JVM 的当前开发阶段,以及支持脚本语言的新增强功能,我只会针对 JVM,因为您的语言执行速度可能会比您可以为自己创建的每个运行时库更快.

    【讨论】:

      【解决方案4】:

      如果您愿意让代码的运行时部分完全依赖于第三方代码并要求您的用户安装此类代码,那么您应该只针对 JVM,并且,JVM 将提供大量您无法合理开发自己或要求人们为此目的扩展的功能(例如 C++ 中的 OS 标头),,您对 JNI 作为本机代码的接口感到满意(因此,其他托管代码,如 .NET)。

      最终,这完全取决于您可用的资源以及您对语言互操作性的描述。如果您打算使用 JVM 来提供很多功能,并且您很高兴互操作性很糟糕,那么请使用它。否则,我认为您应该重新考虑。

      【讨论】:

        猜你喜欢
        • 2016-10-08
        • 2010-09-15
        • 2021-04-19
        • 2011-07-10
        • 2010-12-16
        • 1970-01-01
        • 2011-07-14
        相关资源
        最近更新 更多