【问题标题】:Why does truffleruby need C extensions?为什么 truffleruby 需要 C 扩展?
【发布时间】:2017-01-21 12:28:17
【问题描述】:

Current status of truffleruby says:

TruffleRuby 正在快速发展,但目前可能还没有准备好让您尝试在其上运行完整的 Ruby 应用程序。缺少对 OpenSSL 和 Nokogiri 等关键 C 扩展的支持。

为什么truffleruby 需要C 扩展?它建立在 GraalVM 之上,GraalVM 建立在 JVM 之上,it is in fact a fork of JRuby

TruffleRuby 是 JRuby 的一个分支,将它与来自 Rubinius 项目的代码相结合,还包含来自 Ruby 标准实现的代码,MRI。

难道他们不能使用 JRuby 世界 gem 而不是依赖于他们的 C 变体吗?

编辑链接到issue on github

【问题讨论】:

    标签: ruby jruby truffleruby graalvm


    【解决方案1】:

    运行 C 扩展程序很困难,因为 C 扩展程序 API 只是 MRI 的整个内部,作为头文件公开。您不是针对干净的 API 进行编程 - 您是针对 MRI 的所有实现细节和内部设计决策进行编程。

    JRuby 的 Java 扩展也有同样的问题! JRuby Java 扩展 API 只是 JRuby 的整个内部,您不是针对 API 进行编程,而是针对 JRuby 的所有实现细节和设计决策进行编程。

    我们计划最终以相同的方式解决这两个问题 - 即使用解释器在 C 或 Java 代码上添加另一个抽象级别,我们可以在需要时拦截和重定向,以便它相信它是针对 MRI 运行的或 JRuby 内部,但实际上我们将这些重定向到我们的内部。

    我们认为 C 扩展更为重要,因此我们首先解决这些问题。我们还没有真正开始使用 Java 扩展,但我们已经启动了我们将使用的 Java 底层解释器。

    这个视频解释了一切

    https://youtu.be/YLtjkP9bD_U?t=1562

    【讨论】:

    • 这让我感到惊讶,因为从 JRuby 调用 Java 代码非常简单,而从 Ruby 运行 C 代码要复杂得多,我的印象是 JRuby 与其扩展的集成要干净得多,我猜是其他方向更棘手?
    • 还有用户群问题,由于不熟悉 JVM 和高内存要求是 Heroku 和 EC2 上廉价 VM 的一个问题,人们远离 JRuby - 我猜 TruffleRuby 共享这些问题,这要归功于 JVM ?另一方面,吸引人们使用 JRuby 的一件事是访问 Java 生态系统,Stripe 的人们使用它是因为 EmvJ,我们仅在万事达卡项目迫使我们实现真正健壮的时候才使用它XML 签名在 MRI 世界和我们需要部署到 AS400 时根本不存在。
    • 这就是为什么我想知道,你正在创建一个超级棒的快速 ruby​​ 实现,但它需要你熟悉 JVM 管理、调试和内存使用,但同时,在至少在可预见的未来,放弃 Java 生态系统访问和超级可移植性的好处,这就是困扰我的地方。我还认为,既然你们分叉了 JRuby,那么沿着这条路走下去会非常简单r
    • 您可以使用 Truffleized JRuby、AFAIK 调用来自 Ruby 的 Java 代码和来自 Java 的 Ruby 代码。不起作用的是 JRuby 扩展。在 Chris 链接的视频中,他解释说 JRuby 扩展接口与 YARV 扩展接口存在相同的问题:没有。他还解释说,他们已经解决了 C 扩展的“难题”,而 JRuby 扩展的解决方案基本相同:在 Truffle 中编写一个 JVM 字节码解释器。所以,据我了解,他们选择先做 C,因为它同时更难,也更有益。
    • @JörgWMittag 也许是我缺乏理解,但什么是 JRuby 扩展,而不是从 Ruby 执行的一段 Java 代码?如果他们支持从 Ruby 运行 Java 代码,这基本上意味着他们支持人们插入到他们的 gem 中的所有 Java 扩展,不是吗?
    【解决方案2】:

    项目负责人本人已经给出了很好的回答,但我想提供不同的观点:

    为什么 truffleruby 需要 C 扩展?

    它不需要它们。但它们确实存在,并且有使用它们的代码,能够运行该代码肯定会很好。

    【讨论】:

    • 是的,但有趣的是他们选择先进行 C 扩展,然后考虑到代码在 JVM 中运行,然后选择 Java 扩展,不是吗? :)
    • 嗯,人们依赖很多 C 扩展。没有多少 JRuby 扩展没有 C 或 Ruby 等价物。反之则不然。
    猜你喜欢
    • 2014-11-03
    • 2014-04-20
    • 2018-03-17
    • 1970-01-01
    • 2011-02-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-02-05
    相关资源
    最近更新 更多