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

Nic*_*ain 12 javascript ruby programming-languages v8 spidermonkey

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

Jör*_*tag 7

最明显的是,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引擎得到的是

  1. 忠实地实现RubySpec(特别是控制流构造,如线程,光纤,throw/ catch,异常等),
  2. 表现和
  3. 与ECMAScript紧密集成(即在两种语言之间来回传递对象和调用方法的能力).

不幸的是,当你不得不求助于管理你自己的堆栈,做CPS变换,建立在异常之上的技巧时......事实证明你只能选择三个目标中的两个.