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

Mic*_*man 20 ruby java jruby

根据Charles Nutter的说法,Duby

一种使用Ruby语法和Java类型系统的静态类型语言.迪比支持所有Ruby的文字,使用本地类型推断(唯一的参数类型必须声明),并以最快的速度运行,如Java(因为它产生几乎相同的字节码).但随着invokedynamic的出现,Duby需要一个玩伴.

1.什么是invokedynamic,为什么Duby"需要一个玩伴"?

另一方面,朱比

打算基本上像Duby,因为它使用Java的类型和Ruby的语法.但它利用新的invokedynamic操作码是100%动态的.Juby是一个动态的Duby,或者是一个带有Ruby语法的动态Java.理解起来并不难.

实际上很难理解.

有人可以详细说明这种区别是什么吗?

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

Jör*_*tag 50

我将从最简单的问题开始回答问题:

有人可以详细说明这种区别是什么吗?

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

实际上,由于这个原因,有一个小细节:Surinx语法是Ruby语法的严格子集,即每个语法上有效的Surinx程序也是语法上有效的Ruby程序.Duby OTOH 几乎是一个语法子集,除了它的强制方法参数类型注释:

def foo(bar => Integer, baz => String) => Array
  # ...
end
Run Code Online (Sandbox Code Playgroud)

这在Ruby中是非法的.

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

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

那么,为什么Charles Oliver Nutter创造了Duby?他是JRuby Ruby实现的首席开发人员,该实现是JVM 的Ruby编程语言的实现.像大多数Ruby实现一样,它是用底层平台的主流编程语言编写的:MRI,YARVtinyrb在C中实现100%,MacRuby主要在C中实现,有点Objective-C,Ruby.NETIronRuby 100%in C#,HotRubyECMAScript中,红太阳在ActionScript,红衣主教在PIR和NQP等.(包含大量Ruby代码的唯一Ruby实现是Rubinius(大约70%Ruby,30%C++)和MagLev(未知数量的RubySmalltalk).)当然,XRubyJRuby在Java中实现100%.

现在,有趣的是,查理来到Ruby,因为他不喜欢他的日常工作,做Java开发.现在,他仍然整天编写Java代码!当然,他不喜欢这样,因此他正在寻找另一种编程语言来实现JRuby的核心.一种选择肯定是在Ruby中编写所有内容,但是通过元外实现,通常会出现收益递减的情况,其中实现会退化为学术手淫.重写库,提前编译器(实际上,已经完成)和Ruby中的一些核心类肯定是有意义的,但引擎核心的某些部分更好地编写在更靠近执行的地方JVM本身的模型.

Charlie正在研究可用的选项:Scala,Groovy,Fan,Clojure,Nice,但它们都有一个显着的缺点:相当大的语言运行时.JRuby运行时的大小在内存消耗和启动延迟方面已经是一个大问题(特别是与MRIYARV相比,如果你真的在测量中包含了JVM本身,甚至更多),并用添加的语言重写它它自己的运行时间对于那个权重来说简直就是不行.不幸的是,没有编程语言满足Charlie正在寻找的两个基本标准:没有运行时和编译到JVM字节码,至少与等效的Java一样有效.

所以,他决定创造自己的.他之所以选择使用类似于Ruby的语法,实际上非常简单:他不需要为它编写解析器,Duby只使用JRuby现有的解析器,只需要一个小修改就可以支持方法参数类型注释.(实际上,他也喜欢Ruby的语法,这当然也是一个因素.)

如您所知,语法实际上是编程语言中最不重要的部分.(它的不相关性并不总是从争论数量来看显而易见的,但这只是因为语法是你唯一可以争论而不必实际理解你所谈论的内容.)比语法更重要的是类型系统和评估语义.这就是诀窍:Duby也没有!它只有语法!它就像一个寄生虫:它只是从其底层平台"借用"类型系统和语义.这意味着在JVM上,Duby的类型系统 Java类型系统,而Duby的语义 Java的语义.换一种方式:迪比是不是一种编程语言,在所有的,而它是"只是"为Java的替代语法.

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

所以,那是杜比.

为了解释Surinx,我将首先回答您的第一个问题:

1.什么是invokedynamic,为什么Duby "需要一个玩伴"?

invokedynamic特别是一个新的字节码,它将被添加到JVM规范的第3版,并将在JDK7中发布.但是,更invokedynamic常见的是通常用作引用一大堆功能的替身,其实际 invokedynamic字节码只有一个,目前正在JSR-292"支持Java上的动态类型语言"的保护伞下开发.平台".而更普遍的名字invokedynamic被用作战略无论是在太阳和JCP作为一个整体来打开Java平台为通用语言平台,为各种语言的一般变化的绰号.

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

Surinx是一种动态类型的编程语言,基本上做同样的事情,迪比:像迪比,它具有唯一的语法,像迪比,它使用了Java类型系统.但不同于 迪比,它并没有使用Java的方法调用的语义,而是使用invokedynamic小号的方法调用的语义.IOW:它是动态类型并使用动态调度.

那就是Surinx.

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

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

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


有两件事情我离开了:迪比实际使用的局部变量的类型推理,那么,Java不同,你只需要申报的各类方法的参数,但一切都的方法将是类型推断.

其次,DubySurinx实际上并没有与JVM联系在一起.因为它们只是从底层平台窃取它们的语义和类型系统,所以它们几乎可以移植到任何地方,在那里你可以从Ruby语法到平台概念进行粗略的映射.在我的头脑中,我可以想象Duby的端口是C,C++,Objective-C(iPhone,任何人?),D,CLI和ActionScript以及Surinx的端口到DLR,Smalltalk,Parrot,ECMAScript,Python,Perl,PHP和Objectice-C.事实上,DubyC端口已经开始了.


jsi*_*ght 6

Mirah(以前称为Duby)存在,因为静态类型可以通过Java/Hotspot显着提高性能.Surinx(以前称为Juby)是一回事,除了它还利用JDK7中的新性能功能来进一步提升性能.

性能特征通常称为"invokedynamic",Nutter的博客也提供了很好的解释.

  • @Michael:我怀疑它是出于对实验的渴望以及缺乏invokedynamic的可用性.Duby现在很有用(在JDK7之前),Juby可以用于JDK7 +. (2认同)
  • Duby和Surinx*不是*"同一件事"!事实上,在某种意义上,它们几乎是对立的:Duby是静态类型的,Surinx是动态类型的.整个答案或多或少完全弥补了.甚至不好. (2认同)