使用Ruby中的Java:JRuby与Rjb

时间:2012-02-10 02:34:42

标签: java ruby jruby rjb

您能否就以下方面的优缺点发表评论:

  • 表现(基准?)
  • Java功能的覆盖范围
  • 跨平台兼容性

1 个答案:

答案 0 :(得分:1)

我没有使用过 rjb ,但它在概念上似乎与我用 使用的Python-Java桥接器类似。两者似乎都将JVM运行时作为共享对象或DLL加载到正在运行的Python或Ruby解释器中。

根据我的经验,这种方法运行良好,直到它没有,当它不起作用时,它往往会灾难性地失败。我遇到的与JPype相关的问题与Java运行时和Python运行时对操作环境的不同假设有关。关注的领域包括:

  • 垃圾收集模型。 JVM的垃圾收集模型与Python不同 和Ruby的。如果你不小心,这可能(理论上,无论如何)会引起问题。
  • 主题。对于我来说,这对我来说是一个真正的问题,几年前我用它。 JVM的线程模型与Python发生冲突,导致奇怪的运行时错误。

我对这种方法有过不好的经历,我对此很警惕。

尽管如此, rjb 不是JPype,而Ruby不是Python。与Python线程模型相比,Ruby线程模型可以与JVM共存更好。此外,我已经两年多没有玩过这样的技术了,所以事情可能已经发生了变化。

底线:它可能工作正常,但要小心。

关于您的具体问题:

<强>性能

我甚至不会在这里猜测,因为这两种方法的性能特征在很大程度上取决于你正在做什么,而你没有概述你对这两种技术的预期用途。

跨平台

任何纯Java(例如,JRuby)都可以在任何有Java VM的地方干净地移植。对于 rjb 解决方案,这不一定是正确的。例如,您可能会遇到不兼容的共享库问题。您可能会发现必须在平台上构建 rjb ,因此必须先构建其他许多东西。等

另一方面,JRuby遇到的问题是很多宝石都不可用。在Java世界中,JNI(即,桥接到C或C ++代码)通常是不受欢迎的。 “最佳”代码是100%Java。在Ruby世界(以及,就此而言,Python世界),桥接到C API是常见的做法。大量的宝石就是这样做的(例如,数据库驱动程序,利用现有开源C API的一些宝石,一些真正想要踢屁股性能的宝石)。 C-Ruby和C之间的桥梁与Java和C之间的桥梁完全不同。为C-Ruby编写的用C代码链接的Gems根本不起作用,就像在JRuby中一样。因此,将代码从C-Ruby移植到JRuby可能会有问题。

Java功能的覆盖范围

由于 rjb 将JVM加载到Ruby解释器中,它应该能够支持JVM支持的任何东西 - 尽管Ruby和Java之间的接口可能变得笨重,至少根据文档。由于JRuby实际上完全是用Java实现的,因此JRuby和Java之间的接口往往更加清晰。