Ruby和Javascript之间的关键语义差异是什么

时间:2011-04-01 15:53:28

标签: javascript ruby programming-languages v8 spidermonkey

如果要在Javascript引擎之上(在浏览器中或在独立的V8或Spidermonkey之上)实现Ruby,那么Ruby和JS对象模型之间的关键阻抗不匹配是什么?

3 个答案:

答案 0 :(得分:7)

最明显的是,ECMAScript是基于原型的,Ruby是基于类加混合的。此外,在Ruby中,封装是通过带有闭包的ECMAScript中的对象完成的。

然而,我的猜测是Ruby的控制流构造将比其对象模型更大的障碍。毕竟,James Coglan's JS.Class 基本上是ECMAScript中Ruby对象模型的一个实现,并没有那么大。

ECMAScript简直缺乏在其上构建自己的控制流构造所需的工具。通常,您需要GOTO,延续或正确的尾调用。如果你有其中一个,你可以轻松实现其他一切:异常,循环,开关,线程,Fiber,生成器,协同程序,...你的名字。

但是ECMAScript没有它们(并且有充分的理由,至少在GOTO的情况下)。唯一的控制流构造ECMAScript具有足够的功能,能够在异常之上构建其他构造。不幸的是,那些都很慢。 (尽管如此,它们已经被用作实现基板,例如在Microsoft Live Labs Volta编译器中,它使用ECMAScript异常来实现.NET异常,迭代器,生成器甚至线程。)

所以,基本上你不得不实现至少你自己的调用堆栈,如果不是整个解释器(就像HotRuby那样),执行全局CPS转换或类似的事情。

基本上,你在ECMAScript之上运行的Ruby引擎想要的

  1. 忠实地实现RubySpec(特别是控制流构造,如线程,光纤,throw / catch,异常等),
  2. 表现和
  3. 与ECMAScript紧密集成(即能够在两种语言之间来回传递对象和调用方法)。
  4. 不幸的是,当你不得不求助于管理你自己的堆栈,做CPS转换,建立在异常之上的技巧时......事实证明你只能选择三个目标中的两个。

答案 1 :(得分:3)

  1. Ruby具有局部变量的块级范围,JavaScript具有功能级别范围
  2. Ruby的继承+ mixin可能只是使用JavaScript的原型继承来实现
  3. Ruby的arity检查方法/ lambda调用,并且比JavaScript的许可传递更严格
  4. Ruby具有真实的强制常量; JavaScript可能不会(取决于解释器使用的版本)
  5. 类变量(ugh)在JaveScript中没有等效,因此需要特殊处理
  6. Ruby的核心是绿色线程,JavaScript不是

答案 2 :(得分:2)

JavaScript是图灵完备的,所以理论上你可以实现任何东西,包括其他编程语言。 实现(JavaScript)和目标语言(Ruby)的差异并不重要。 Ruby和C之类的语言之间的阻抗不匹配是巨大的,你有Ruby,Python,Perl和JavaScript本身,都是用C语言实现的。

在JavaScript中实现Ruby应该比在较低级别的语言中更容易实现。对你有利,你有很多Ruby和Ruby的标准库都是用Ruby自己编写的,所以一旦你得到一个基本的解释器,事情就会逐渐变得越来越危险。

在JavaScript中实现高效的 Ruby解释器可能更难,但它仍然可能。您最终可能会将Ruby转换为JavaScript,因此可以使用优秀的优化器。

所以,不要考虑Ruby和JavaScript之间的差异。看看Ruby的标准实现,并考虑如何在JavaScript中实现