Duby和Juby有什么区别,为什么我需要他们中的任何一个?

2022-09-02 05:09:23

根据查尔斯·纳特(Charles Nutter)的说法杜比

一种具有Ruby语法和Java类型系统的静态类型语言。Duby支持Ruby的所有文字,使用局部类型推断(只有参数类型必须声明),并且运行速度与Java一样快(因为它产生几乎相同的字节码)。但随着调用动力学的出现,Duby需要一个玩伴。

1. 什么是调用动力学,为什么杜比“需要一个玩伴”?

另一方面,朱比

它基本上像 Duby 一样,因为它使用 Java 的类型和 Ruby 的语法。但它利用了新的调用动态操作码,使其100%动态。Juby是一个动态的Duby,或者可能是一个具有Ruby语法的动态Java。这并不难理解。

其实很难理解。

2. 有人可以更详细地阐述一下这种区别是什么吗?

3. 为什么我们需要(需要!)另一种与 Ruby 相关的语言?或者,更确切地说,还有两种与 Ruby 相关的语言?


答案 1

我将按顺序回答问题,从最简单的问题开始:

2. 有人可以更详细地阐述一下这种区别是什么吗?

Duby是静态类型的,Surinx(这是短时间内称为Juby的最终名称)是动态类型的。这已经是它的全部了。

实际上,有一个小细节是这样做的结果:Surinx语法是Ruby语法的严格子集,即每个语法上有效的Surinx程序也是一个语法上有效的Ruby程序。杜比OTOH几乎是一个语法子集,除了它的强制性方法参数类型注释:

def foo(bar => Integer, baz => String) => Array
  # ...
end

这在 Ruby 中是非法的。

3. 为什么我们需要(需要!)另一种与 Ruby 相关的语言?

首先:除了句法相似性之外,这些语言与Ruby没有任何关系,形状或形式。

那么,为什么查尔斯·奥利弗·纳特(Charles Oliver Nutter)创造了杜比呢?他是JRuby Ruby实现的首席开发人员,JRuby Ruby实现是JVM的Ruby编程语言的实现。像大多数Ruby实现一样,它是用底层平台的主导编程语言编写的:MRIYARVtinyrb在C中100%实现,MacRuby主要在C中实现,带有一点Objective-C,Ruby.NETIronRuby在C#中100%,HotRubyECMAScript中,Red Sun在ActionScript中,Cardinal在PIR和NQP中等等。(唯一包含大量Ruby代码的Ruby实现是Rubinius(约70%Ruby,30%C++)和MagLevRubySmalltalk的未知数量)。当然,XRubyJRuby是100%在Java中实现的。

有趣的是,Charlie 来到 Ruby,因为他不喜欢他的日常工作,做 Java 开发。而现在,他仍然整天都在写Java代码!当然,他不喜欢这样,所以他正在寻找另一种编程语言来实现JRuby的核心。一种选择当然是用Ruby编写所有内容,但是对于元循环实现,通常会有一个收益递减的点,实现会退化为学术自慰。重写库,提前编译器(实际上,这已经完成了)和Ruby中的一些核心类当然是有意义的,但是引擎核心的某些部分最好写在更接近JVM本身的执行模型中。

Charlie正在寻找可用的选项:ScalaGroovyFanClojureNice,但所有这些都有一个明显的缺点:相当大的语言运行时间。JRuby运行时的大小在内存消耗和启动延迟方面已经是一个大问题(特别是与MRIYARV相比,如果你实际上在测量中包含JVM本身,那就更是如此),并且用一种语言重写它,将自己的运行时添加到该权重中是行不通的。不幸的是,没有一种编程语言可以满足Charlie正在寻找的两个基本标准:没有运行时,并且编译为至少与等效Java一样有效的JVM字节码。

所以,他决定创建自己的。他选择使用类似于Ruby的语法的原因其实很简单:他不需要为它编写解析器,Duby只是使用JRuby已经存在的解析器,并进行一次微小的修改来支持方法参数类型注释。(实际上,他也喜欢Ruby的语法,这当然也是一个因素。

如您所知,语法实际上是编程语言中最不重要的部分。(从争论的数量来看,它的无关紧要并不总是很明显,但这只是因为语法是你唯一可以争论的事情,而不必真正理解你在说什么。比语法更重要的是类型系统和评估语义。诀窍来了:Duby也没有!它只有语法!它就像一个寄生虫:它只是从其底层平台“借用”类型系统和语义。这意味着在JVM上,Duby的类型系统Java类型系统,Duby的语义Java的语义。换句话说:Duby根本不是一种编程语言,而是“只是”Java的替代语法。

这意味着Duby和Java之间没有映射,没有转换开销,也没有速度差异。这意味着JRuby的内部可以用Duby编写,而不会丢失任何功能。

所以,那是杜比

为了解释苏林克斯,我首先回答你的第一个问题:

1. 什么是调用动力学,为什么杜比“需要一个玩伴”?

invokedynamic是一个新的字节码,它将被添加到JVM规范的第3版中,并将在JDK7中发布。然而,更一般地说,invokedynamic通常被用作一大堆功能的替身,其中实际的调用动力学字节码只是其中之一,这些功能目前正在JSR-292“支持Java平台上的动态类型语言”的保护伞下开发。更一般地说,invokedynamic 这个名字被用作 Sun 和整个 JCP 中策略的一般变化的绰号,以将 Java 平台变成各种语言的通用语言平台。

JSR-292(这是Charlie在他的博客文章中提到的)的具体目的是使动态方法调度更快 - 实际上,至少在最好的情况下,几乎与Java中的静态调度一样快。

Surinx是一种动态类型的编程语言,它基本上与Duby做同样的事情:像Duby一样,它也只有语法,像Duby一样,它也使用Java类型系统。但与 Duby 不同的是,它不使用 Java 的方法调用语义,而是使用 invokedynamic的方法调用语义。IOW:它是动态类型的,并使用动态调度。

这就是苏林克斯

现在,我可以回答你第三个问题的后半部分:

3.为什么我们需要(需要![...]另外两种与 Ruby 相关的语言?

我已经回答了Duby,这是Surinx的答案:这就是Groovy应该成为的 - 一种轻量级(实际上是权重)的动态表达性脚本语言。此外,它是目前玩弄调用动力学内部工作原理的最简单方法。(JRuby 1.4的当前开发快照也支持它,但这是一个更复杂的项目。


我遗漏了两件事:Duby实际上使用局部变量类型推断,因此,与Java不同,您只需要声明方法参数的类型,但方法的所有内容都将进行类型推断。

其次,DubySurinx实际上都与JVM无关。由于它们只是从底层平台窃取其语义和类型系统,因此它们几乎可以移植到任何地方,从Ruby语法到平台概念的粗略映射。在我的头顶上,我可以想象Duby到C,C++,Objective-C(iPhone,有人吗?),DCLI和ActionScript的端口,以及SurinxDLRSmalltalkParrotECMAScriptPythonPerlPHP和Objectice-C的端口。事实上,Duby的C端口已经开始。


答案 2

Mirah(以前称为 Duby)之所以存在,是因为静态类型可以显著提高 Java/Hotspot 的性能。Surinx(以前称为Juby)也是一样的,除了它还利用JDK7中即将推出的新性能功能来进一步提高性能。

性能功能通常被称为“invokedynamic”,Nutter的博客上也有很好的解释。


推荐