如果要在
JavaScript引擎(在浏览器中或在独立的V8或Spidermonkey之上)实现Ruby,Ruby和JS对象模型之间的关键阻抗不匹配是什么?
解决方法
最显眼的是ECMAScript是基于原型的,而Ruby是基于class-plus-mixin的.此外,在Ruby中,封装是通过对象进行的,ECMAScript中带有闭包.
但是,我猜测Ruby的控制流构造将比对象模型更大一些.毕竟,James Coglan’s JS.Class基本上是在ECMAScript中Ruby的对象模型的实现,而不是那么大.
ECMAScript简单地缺乏在其上构建自己的控制流构造所需的工具.通常,您需要GOTO,继续或适当的尾部呼叫.如果您有其中之一,您可以轻松地实现其他任何事情:异常,循环,开关,线程,光纤,发电机,协程,…您的名字.
但是ECMAScript没有它们(由于很好的理由,至少在GOTO的情况下).唯一的控制流构造ECMAScript具有足够的强大能够构建其他构造,除了是异常.不幸的是,这些都很慢. (尽管如此,它们已被用作实施基础,例如在Microsoft Live Labs Volta编译器中,它使用ECMAScript异常来实现.NET异常,迭代器,生成器甚至线程.)
因此,基本上,如果不是整个解释器(如HotRuby的情况),执行全局CPS转换或类似的操作,基本上您将停止至少实现自己的调用堆栈.
基本上,你想要的是从运行在ECMAScript之上的Ruby引擎
> RubySpec的忠实实现(特别是线程,throw / catch,异常等控制流构造)
>表现和
>与ECMAScript紧密集成(即在两种语言之间来回传递对象和调用方法的能力).
不幸的是,当你必须采取诸如管理自己的堆栈的技巧,做CPS转换,除了例外之外,你可以选择三个目标中的两个.