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

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

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

最佳答案

不,那是行不通的。至少不是您想的那样。
Jython和JRuby之间的互操作性与CPython和YARV之间的互操作性相同:它们都在同一平台上运行,因此它们可以使用该平台相互通信。
对于CPython和YARV,该平台是C/POSIX,因此它们可以使用C结构,intchar*和C函数调用相互通信。对于Jython和JRuby,该平台是JVM,因此它们可以使用JVM对象,JVM类,JVM接口(interface),JVM类型和JVM方法相互通信。
在这两种情况下,这些平台原语看起来都不像Python或Ruby对象。
对JRuby而言,Jython只是另一个Java程序。对Jython而言,JRuby只是另一个Java程序。
例如:在Ruby中,您可以随时动态地添加,删除和重新定义方法。在JVM上,可以动态添加和删除的最小代码单元是一个类。因此,Ruby方法实际上并不表示为Java方法。它表示为Java类。从逻辑上讲,具有两个方法的Ruby对象表示为没有方法的Java对象,只是一个Dictionary<String, RubyMethod>字段。 IOW:它在Java中是完全不可用的,并且,从JRuby的角度来看,Jython只是Java,因此在Jython中也不可用。
现在,有一些方法可以使它更好一些。您可以使用实际的Java类型在两者之间进行通信-两种实现都具有与Java的良好互操作性。因此,您无需将Ruby哈希传递给Python或将Python字典传递给Ruby,而应使用Ruby和Python中的Java Map。但是请注意,这要求您的Ruby和Python代码都必须专门编写才能在JVM上工作。 IOW:您不能只使用您在网上找到的任何Python或Ruby库。
@duncan在回答中提到的另一种可能性是:将Jython或JRuby作为脚本引擎嵌入到Ruby或Python应用程序中。再次重申,这并不能真正回答您有关使用Ruby中的任意Python库的问题,反之亦然。
那么,这是什么问题呢?
问题在于,为了使两个运行时进行通信,它们需要说相同的“语言”。在这种特殊情况下,这两个运行时唯一的共同语言是Java,或者说是严重残缺的Java子集。
因此,我们需要找到一种通用语言。定义这种语言的一种方法是让两个运行时都理解彼此的元对象协议(protocol)(MOP)。
MOP基本上是该语言的对象模型的对象模型。嗯,这很令人困惑,因为我们使用“对象模型”一词来表示两个不同的事物。让我改写一下:
MOP基本上是该语言的对象系统的域模型。就像银行系统的域模型包含代表现实世界的客户,帐户,余额,分类帐等的对象,以及代表现实世界的操作(如汇款,提款等)的方法一样,MOP包含代表以下对象的对象:代表语言 Action 的语言类,方法,变量,对象和方法,例如查找变量,调用方法,从类继承,构造类的实例。
通常,每个运行时都将其MOP保留为私有(private),并且每个运行时都有其自己的MOP。
如果JRuby和Jython彼此公开自己的MOP并了解彼此的MOP(或者甚至更好:他们将自己的MOP公开给JVM,并且都使用相同的MOP),那么您可以将其中一个疯狂的JRuby方法包传递给Jython。 ,它会知道如何查找属于该对象的方法以及如何调用它们,因为它可以询问JRuby的MOP如何做到这一点。
实际上,存在一个为JVM创建这样的MOP的项目:dynalang MOP是一个用于在JVM上运行的动态语言的共享的,标准化的MOP的项目。它是由Mozilla Rhino ECMAScript引擎的维护者Attila Szegedi创建的。目前,没有任何大型语言实现使用它,但是至少Rhino,JRuby,Jython和Groovy之间正在进行协作,以确保dynalang具有足够的通用性,可以支持所有不同语言的对象模型。
如果您想先睹为快,拥有这样一个共享MOP的世界将是什么样子,可以看看Microsoft的动态语言运行时(DLR)。 DLR包含这样的MOP,并且所有支持DLR的运行时(除了IronRubyIronPythonIronJSIronScheme这样的常见可疑对象,现在还包括C#4和Visual Basic.NET 10)几乎可以彼此无缝地互操作其他。
另一个类似的平台是Parrot Virtual Machine,它专门设计用于允许多种动态语言在同一运行时平台上进行互操作。有Python(Pynie)和Ruby(Cardinal)的实现,但是特别是Cardinal距离远程完成的Ruby实现还有很长的路要走。

10-07 16:24
查看更多