[英]What are the semantic differences between `Set` and a `Map` in JavaScript?
[英]What are the key semantic differences between Ruby and Javascript
如果要在Javascript引擎之上实现Ruby(在浏览器中或在独立的V8或Spidermonkey之上),那么Ruby和JS对象模型之间的关键阻抗不匹配是什么?
最明显的是,ECMAScript是基于原型的,而Ruby是基于类加混合的。 此外,在Ruby中,封装是通过带有闭包的ECMAScript中的对象完成的。
但是,我的猜测是Ruby的控制流构造将比其对象模型更大的障碍。 毕竟, 詹姆斯Coglan的JS.Class基本上是在ECMAScript中Ruby的对象模型的实现,它不是那么大。
ECMAScript简直缺少在其上构建自己的控制流构造所需的工具。 通常,您需要GOTO
,continuation或正确的尾调用。 如果您有其中一个,您可以轻松实现其他所有内容:异常,循环,交换机,线程, Fiber
,生成器,协同程序......您的名字。
但ECMAScript没有它们(并且有充分的理由,至少在GOTO
的情况下)。 唯一的控制流构造ECMAScript具有足够的功能,能够在异常之上构建其他构造。 不幸的是,那些都很慢。 (尽管如此,它们已被用作实现基板,例如在Microsoft Live Labs Volta编译器中,它使用ECMAScript异常来实现.NET异常,迭代器,生成器甚至线程。)
所以,基本上你不得不实现至少你自己的调用堆栈,如果不是整个解释器(如HotRuby的情况),执行全局CPS转换或类似的东西。
基本上,你想要从运行在ECMAScript之上的Ruby引擎得到的是
throw
/ catch
,异常等), 不幸的是,当你不得不求助于管理你自己的堆栈,做CPS变换,建立在异常之上的技巧时......事实证明你只能选择三个目标中的两个。
JavaScript是图灵完备的,所以理论上你可以实现任何东西,包括其他编程语言。 实现(JavaScript)和目标语言(Ruby)有多么不同并不重要 。 Ruby和C之类的语言之间的阻抗不匹配是巨大的,你有Ruby,Python,Perl和JavaScript本身,都用C语言实现。
在JavaScript中实现Ruby应该比在较低级别的语言中更容易实现。 对于你的优势,你有很多Ruby和Ruby的标准库都是用Ruby编写的,所以一旦你得到一个基本的解释器,事情应该逐渐变得越来越危险。
在JavaScript中实现高效的 Ruby解释器可能更难,但它仍然是可能的。 您最终可能会将Ruby转换为JavaScript,因此可以使用优秀的优化器。
所以,不要考虑Ruby和JavaScript之间的差异。 看一下Ruby的标准实现,并考虑如何在JavaScript中实现它 。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.