Nic*_*ain 12 javascript ruby programming-languages v8 spidermonkey
如果要在Javascript引擎之上实现Ruby(在浏览器中或在独立的V8或Spidermonkey之上),那么Ruby和JS对象模型之间的关键阻抗不匹配是什么?
最明显的是,ECMAScript是基于原型的,而Ruby是基于类加混合的.此外,在Ruby中,封装是通过带有闭包的ECMAScript中的对象完成的.
但是,我的猜测是Ruby的控制流构造将比其对象模型更大的障碍.毕竟,詹姆斯Coglan的JS.Class 是基本上在ECMAScript中Ruby的对象模型的实现,它不是那么大.
ECMAScript简直缺少在其上构建自己的控制流构造所需的工具.通常,您需要GOTO,延续或正确的尾调用.如果你有其中一个,你可以轻松实现其他一切:异常,循环,开关,线程,Fibers,生成器,协同程序,......你的名字.
但ECMAScript没有它们(并且有充分的理由,至少在这种情况下GOTO).唯一的控制流构造ECMAScript具有足够的功能,能够在异常之上构建其他构造.不幸的是,那些都很慢.(尽管如此,它们已被用作实现基板,例如在Microsoft Live Labs Volta编译器中,它使用ECMAScript异常来实现.NET异常,迭代器,生成器甚至线程.)
所以,基本上你不得不实现至少你自己的调用堆栈,如果不是整个解释器(如HotRuby的情况),执行全局CPS转换或类似的东西.
基本上,你想要从运行在ECMAScript之上的Ruby引擎得到的是
throw/ catch,异常等),不幸的是,当你不得不求助于管理你自己的堆栈,做CPS变换,建立在异常之上的技巧时......事实证明你只能选择三个目标中的两个.