使用JRuby / Jython实现Ruby / Python互操作性?

时间:2010-05-02 09:25:35

标签: python ruby jruby jython bytecode

很可能是一个愚蠢的问题,因为我对Java / Jython / JRuby /字节码不太了解,但是......

今天我偶然发现了_why's unholy ..它允许你从Ruby代码输出Python字节码。基本上允许它们生成相同的字节码..

Jython输出Java字节码,就像JRuby一样。由于这些都编译为相同的字节码,这是否意味着您可以使用Ruby中的任何Python库和Python中的Ruby库?

2 个答案:

答案 0 :(得分:7)

答案 1 :(得分:5)

有两种方法可以做到这一点。两者都提供静态编译代码并从脚本生成真正的Java类的能力。在这种情况下,Jython AFAIK生成Java源代码,然后通过jythonc脚本调用javac。但这需要编译。

对于两个解释器,您可以从脚本调用Java代码,并且可以将解释器嵌入Java应用程序中。

例如,从Python调用Java:

>>> from java.util import Random
>>> r = Random()
>>> r.nextInt()
501203849

要在Java中嵌入JRuby解释器,你可以这样做(注意,也有基于JSR223的方法,这是核心方法):

package vanilla;

import org.jruby.embed.ScriptingContainer;

public class HelloWorld {

    private HelloWorld() {
        ScriptingContainer container = new ScriptingContainer();
        container.runScriptlet("puts Hello world");
    }

    public static void main(String[] args) {
        new HelloWorld();
    }

你可以从Jyton做同样的事情(我想你需要正确地给出jruby路径):

import org.jruby.embed.ScriptingContainer
container = ScriptingContainer()
container.runScriptlet("puts Hello world")

反过来也可以这样做。

您不会通过导入将整个ruby stdlib导出到python解释器。您需要事先将ruby的stdlib预编译为字节码。

然而,通过上述技术,并添加了几个辅助脚本和已定义的接口,您可以将特定功能从一种语言桥接到另一种语言。