如果要在Javascript引擎之上(在浏览器中或在独立的V8或Spidermonkey之上)实现Ruby,那么Ruby和JS对象模型之间的关键阻抗不匹配是什么?
答案 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引擎想要的是
throw
/ catch
,异常等),不幸的是,当你不得不求助于管理你自己的堆栈,做CPS转换,建立在异常之上的技巧时......事实证明你只能选择三个目标中的两个。
答案 1 :(得分:3)
答案 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中实现 。