如果要在Javascript引擎的基础上实现Ruby(无论是在浏览器上还是在独立的V8或Spidermonkey之上),那么Ruby和JS对象模型之间的关键阻抗不匹配是什么?
最明显的是,ECMAScript是基于原型的,而Ruby是基于类和mixin的。此外,在Ruby中,封装是通过对象完成的,在ECMAScript中则是通过闭包。
然而,我猜测Ruby的控制流构造将比其对象模型更具挑战性。毕竟,James Coglan's JS.Class本质上是在ECMAScript中实现了Ruby的对象模型,而它并不是很大。
ECMAScript缺乏构建自己控制流构造所需的工具。通常,您需要使用GOTO
、continuations或proper tail calls。如果您拥有其中之一,您可以轻松地实现其他所有内容:异常、循环、开关、线程、Fiber
、生成器、协同程序等等。
GOTO
的情况下有很好的理由)。ECMAScript 唯一拥有足够强大的控制流结构来构建其他结构的是异常。不幸的是,它们非常慢。(尽管如此,它们已被用作实现基础,例如在微软 Live Labs Volta 编译器中,该编译器使用 ECMAScript 异常来实现 .NET 异常、迭代器、生成器甚至线程。)throw
/catch
、异常等)的引擎,不幸的是,当你不得不采取一些技巧,比如管理自己的堆栈、进行CPS变换、建立在异常之上时,结果你只能选择其中的两个目标。
method_missing
、const_missing
和autoload
这样的钩子的兼容性也意味着每个方法调用或常量查找都必须被包装(比如说myobject._call_method_("foo", ..)
)。 - Marc-André LafortuneJavaScript是图灵完备的,因此理论上您可以在其中实现任何内容,包括其他编程语言。 无论JavaScript的实现和目标语言(Ruby)有多么不同。像Ruby和C这样的语言之间的阻抗不匹配非常巨大,所以你有Ruby、Python、Perl和JavaScript本身,所有这些都是用C实现的。
在JavaScript中实现Ruby应该比在低级语言中实现Ruby容易几个量级。你的优势在于Ruby和Ruby的标准库的很多部分都是用Ruby本身编写的,因此一旦你有了基本解释器,事情应该逐渐变得更加容易。
在JavaScript中实现一个高效的Ruby解释器可能会更难,但仍然有可能。您最终可能会将Ruby翻译成JavaScript,以便使用可用的优秀优化器。
因此,请不要考虑Ruby和JavaScript之间的差异。看看Ruby的标准实现,并考虑如何在JavaScript中实现那个。
nanojit
组成,这是一种独立于语言的JIT编译器,不是吗?如果你只想要一个带有跟踪JIT的Ruby实现,那么真的没有必要编译成ECMAScript,只需将nanojit
连接到Rubinius即可。或者在PyPy中编写一个Ruby实现,它的跟踪JIT非常棒。 (顺便说一句,PyPy有一个ECMAScript后端,因此您实际上可以一箭双雕。更像是四只鸟,因为在PyPy中编写的Ruby实现可以在本地、JVM、.NET和ECMAScript上运行。) - Jörg W Mittag