繁体   English   中英

Ruby和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引擎得到的是

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

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

  1. Ruby具有局部变量的块级范围,JavaScript具有功能级别的范围
  2. Ruby的继承+ mixins可能只是使用JavaScript的原型继承来实现
  3. Ruby的arity检查方法/ lambda调用,并且比JavaScript的允许传递更严格
  4. Ruby具有真实的强制常量; JavaScript可能不会(取决于解释器使用的版本)
  5. 类变量(ugh)在JaveScript中没有等价物,因此需要特殊处理
  6. Ruby的核心是绿色线程,JavaScript没有

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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM