您能否从以下方面评论每个方面的优势和劣势:
- 性能(基准?)
- Java 特性的覆盖范围
- 跨平台兼容性
我没有使用rjb,但它在概念上似乎与 JPype 相似,JPype 是我使用过的 Python-Java 桥接器。两者似乎都将 JVM 运行时作为共享对象或 DLL 加载到正在运行的 Python 或 Ruby 解释器中。
根据我的经验,这种方法效果很好,直到它不起作用,当它不起作用时,它往往会灾难性地失败。我在使用 JPype 时遇到的问题与 Java 运行时和 Python 运行时对操作环境所做的不同假设有关。关注的领域包括:
我对这种方法有足够的糟糕经历,我对此保持警惕。
话虽如此,但是rjb不是 JPype,Ruby 也不是 Python。Ruby 线程模型可能比 Python 线程模型更好地与 JVM 共存。另外,我已经两年多没有玩过这样的技术了,所以事情可能已经改变了。
底线:它可能工作正常,但要小心。
至于你的具体问题:
表现
我什至不会在这里冒险猜测,因为这两种方法的性能特征在很大程度上取决于你在做什么,而且你还没有概述你对这两种技术的预期用途。
跨平台
任何纯Java(例如,JRuby)都可以干净地移植到任何有Java VM 的地方。rjb解决方案不一定如此。例如,您可能会遇到不兼容的共享库问题。你可能会发现你必须在一个平台上构建rjb,首先需要构建很多其他的东西。等等。
另一方面,您在使用 JRuby 时会遇到的问题是很多 gem 不可用。在Java 世界中,JNI(即桥接C 或C++ 代码)通常不受欢迎。“最好的”代码是 100% Java。在 Ruby 世界(以及就此而言,Python 世界),桥接 C API 是常见的做法。大量的 gem 可以做到这一点(例如,数据库驱动程序,一些利用现有开源 C API 的 gem,一些真正需要出色性能的 gem)。C-Ruby 和 C 之间的桥梁与 Java 和 C 之间的桥梁完全不同。为 C-Ruby 编写的在 C 代码中链接的 Gem 根本无法正常工作,就像在 JRuby 中一样。因此,将代码从 C-Ruby 移植到 JRuby 可能会出现问题。
Java 特性的覆盖范围
由于rjb将 JVM 加载到 Ruby 解释器中,它应该能够支持 JVM 支持的任何东西——尽管 Ruby 和 Java 之间的接口可能会变得笨拙,至少根据文档是这样。由于 JRuby 实际上是完全用 Java 实现的,所以 JRuby 和 Java 之间的接口往往更简洁一些。