javascript - Ruby 和 Javascript 之间的主要语义差异是什么

标签 javascript ruby programming-languages v8 spidermonkey

如果要在 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 引擎是

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

不幸的是,当您不得不求助于诸如管理自己的堆栈、进行 CPS 转换、在异常之上构建等技巧时……事实证明您只能选择三个目标中的两个。

关于javascript - Ruby 和 Javascript 之间的主要语义差异是什么,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5515786/

相关文章:

data-binding - 初学者问题 : What is binding?

javascript - 如何在 eslint/tslint 中配置忽略单行语句?

javascript - x-ray-phantom认证,无法有效登录

ruby - 扩展线程类

ruby-on-rails - 在 Rails 中,对常量使用模型方法而不是 Active Record 列有什么缺点?

c - 使用指针和动态存储在启动时传递未知大小的字符串的程序

javascript - Django 中的 Bootstrap 异常慢(40 秒以上): Why?

javascript - webpack 无法解析 node_modules Material 图标

mysql - Rails MySQL 查询单表继承 N+1 问题

user-interface - 对于非 Java 的 Windows GUI 应用程序来说,什么是好的编程语言?