如果要在 Javascript 引擎之上(在浏览器中或在独立的 V8 或 Spidermonkey 之上)实现 Ruby,那么 Ruby 和 JS 对象模型之间的关键阻抗不匹配是什么?
最佳答案
最直接的显然是 ECMAScript 是基于原型(prototype)的,而 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 引擎是
- RubySpec 的忠实实现(特别是控制流结构,例如线程、纤程、
throw
/catch
、异常等), - 性能和
- 与 ECMAScript 紧密集成(即能够在两种语言之间来回传递对象和调用方法)。
不幸的是,当您不得不求助于诸如管理自己的堆栈、进行 CPS 转换、在异常之上构建等技巧时……事实证明您只能选择三个目标中的两个。
关于javascript - Ruby 和 Javascript 之间的主要语义差异是什么,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5515786/