Ruby 是否执行尾部调用优化?

2023-12-15

函数式语言导致使用递归来解决很多问题,因此许多语言执行尾调用优化(TCO)。 TCO 导致从另一个函数(或本身,在这种情况下,此功能也称为尾递归消除,它是 TCO 的子集)调用函数,作为该函数的最后一步,不需要新的堆栈帧,这减少了开销和内存使用。

Ruby 显然从函数式语言中“借用”了许多概念(lambda、map 等函数等),这让我很好奇:Ruby 是否执行尾调用优化?


不,Ruby 不执行 TCO。然而,它也并不not执行 TCO。

Ruby 语言规范没有提及任何有关 TCO 的内容。它没有说你必须这样做,但也没有说你can't做吧。你就是不能rely on it.

这与Scheme不同,Scheme中语言规范requires that all实施must执行 TCO。但它也与 Python 不同,Guido van Rossum 在多个场合(最后一次是在几天前)非常明确地表示,Python 实现不应该执行 TCO。

松本幸弘同情TCO,他只是不想强迫all支持它的实现。不幸的是,这意味着您不能依赖 TCO,或者如果您这样做,您的代码将不再可移植到其他 Ruby 实现。

因此,一些 Ruby 实现执行 TCO,但大多数不执行。例如,YARV 支持 TCO,尽管(目前)您必须显式取消源代码中的一行并重新编译 VM,才能激活 TCO – 在未来版本中,在实现证明之后,它将默认启用稳定的。 Parrot 虚拟机本身支持 TCO,因此 Cardinal 也可以很容易地支持它。 CLR 对 TCO 有一定的支持,这意味着 IronRuby 和 Ruby.NET 可能可以做到这一点。鲁比尼乌斯或许也能做到。

但 JRuby 和 XRuby 不支持 TCO,而且很可能不会,除非 JVM 本身获得对 TCO 的支持。问题是这样的:如果你想要快速实现,并且与Java快速无缝集成,那么你应该与Java堆栈兼容,并尽可能使用JVM的堆栈。您可以很容易地使用 Trampolines 或显式连续传递风格实现 TCO,但是您不再使用 JVM 堆栈,这意味着每次您想要调用 Java 或从 Java 调用 Ruby 时,您都必须执行某种操作转换,速度很慢。因此,XRuby 和 JRuby 选择了速度和 Java 集成,而不是 TCO 和延续(基本上有相同的问题)。

这适用于想要与某些本身不支持 TCO 的主机平台紧密集成的所有 Ruby 实现。例如,我猜 MacRuby 也会有同样的问题。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Ruby 是否执行尾部调用优化? 的相关文章

  • 设计路由错误

    设置设备时我似乎无法克服此错误 Routing Error wrong constant name Devise registrationsController or Routing Error wrong constant name De
  • 在 Rails 控制器中存储对象的最佳方式(会话除外)?

    我有一个 Rails 控制器 class Controllername lt application def method1 obj API CALL session obj access token redirect to redirec
  • Coq:Type(n) 中的 Prop 与 Set

    我想考虑以下三个 相关的 Coq 定义 Inductive nat1 Prop z1 nat1 s1 nat1 gt nat1 Inductive nat2 Set z2 nat2 s2 nat2 gt nat2 Inductive nat
  • Scala 插入列表中的特定位置

    这是我确实解决的问题 但是作为一个完全命令式的 Scala 菜鸟 我觉得我发现了一些完全不优雅的东西 任何改进的想法表示赞赏 val l1 4 1 2 3 4 Nil original list val insert List 88 99
  • 使用 mongodb/mongoid 排序时,有没有办法将所有 nil 值放在最后?

    除了问题中已有的内容之外 确实没什么可说的 使用 monoid People asc age 我首先得到零值 有没有办法总是返回nillast 或者告诉 mongodb 将 nil 视为非常高 与回答的完全一样sql中同样的问题在这里 ht
  • F# 中灵活类型注释的用途是什么?

    我正在学习 F 我不明白灵活类型的目的 或者更好的是 我无法理解这样写的区别 set TextOfControl c Control s c Text lt s 并写下 set TextOfControl c T when T gt Con
  • 运行“bundle install”失败并要求我运行“bundle install”

    事实上 当从我从 git 存储库克隆的现有 Rails 应用程序内部运行时 所有与 gem 相关的命令都会导致相同的错误消息 bundle install Could not find tzinfo 0 3 27 in any of the
  • 葡萄错误处理策略?

    我正在使用 Grape 和 Rails 创建 REST API 我已经有了基本的架构 并且正在寻找可以 清理 东西的地方 其中之一是错误处理 处理 我目前正在修复整个 API 的 root rb GRAPE API 基类 文件中的错误 我对
  • 如何使用 STL 在 C++ 中复制映射、过滤和归约行为?

    我想我们可以使用 std transform 来复制 C 中的映射行为 如下所示 std vector
  • 无||假与假||红宝石中的零

    nil false回报false and false nil回报nil 有人对此有解释吗 在 Ruby 中 一切都是表达式 表达式将返回其中计算的最后一个值 对于您的两个示例 左侧 表达式的计算结果为假值 因此 Ruby 然后计算右侧并返回
  • 将对象数组转换为 ActiveRecord::Relation

    我有一个对象数组 我们称其为Indicator 我想运行 Indicator 类方法 def self subjects该数组上的种类 范围等 我知道在一组对象上运行类方法的唯一方法是让它们成为 ActiveRecord Relation
  • before_filter set_locale 除了控制器

    My routes rb MyApp Application routes draw do scope locale do all resources here end namespace blog do resources posts o
  • 安装 mysql2 时出错:无法构建 gem 本机扩展

    我在尝试安装时遇到一些问题mysql2Rails 的宝石 当我尝试通过运行安装它时bundle install or gem install mysql2它给了我以下错误 安装 mysql2 时出错 错误 无法构建 gem 本机扩展 我该如
  • 是否仍然可以在 Rails 4 中使用测试单元?

    从 Rails 3 2 升级到 Rails 4 后 我的应用程序可以运行 但我用测试单元编写的测试是一场灾难 据传 Minitest 与测试单元 兼容 然而 如果我尝试使用 现在捆绑的 Minitest 就会发现有很多差异 从断言 语句名称
  • Ruby 中的图像抓取

    如何使用 Nokogiri 抓取特定 URL 上存在的图像 如果有比 Nokogiri 更好的选择 请提出建议 css图像标签是 profilePic img 如果它只是一个 img 带有网址 PAGE http site com page
  • 在 Rails 6 上添加外部 js 文件

    我在 app gt javascript gt packs 下创建了一个名为 custom 的文件夹 并放置以下外部 js metisMenu min js startmin js 然后在 app gt javascript gt pack
  • Racket:识别尾递归?

    我在球拍中编写了两个不同的函数来确定数字列表是否升序 define ascending list if lt length list 1 t and lt car list car cdr list ascending cdr list d
  • 用于从 Open3.popen3 标准输出中提取值的正则表达式

    如何获取外部命令的输出并从中提取值 我有这样的事情 stdin stdout stderr wait thr Open3 popen3 path foobar configfile if exit 0 wait thr value to s
  • 将用户输入转换为整数

    所以我有一个用户可以输入价格的表格 我正在尝试创建一个 before validation 来规范化数据 如果用户放置 则剪裁它 before validation do unless self price blank then self
  • RVM 要求错误

    我安装了 OS X Mavericks 并且正在尝试运行rvm requirements在终端中 它给了我这个错误 Installing required packages autoconf automake libtool pkgconf

随机推荐

  • Xgboost 随机种子设置不能确保再现能力

    尽管设定了一个值random state and or seed参数 性能不可重现XgboostSklearn API 包装器 这是代码 from xgboost sklearn import XGBClassifier from skle
  • QWidget不绘制背景色

    我正在使用 PySide 1 2 1 和 Python 2 7 我需要一个小部件来绘制彩色背景 在 Qt Designer 中 我创建了一个简单的窗口 其中包含一个标签 一个包含三个其他项目的小部件和另一个标签 对于包含按钮 单选按钮和复选
  • 如何使 1 + 1 = 2 而不是 1 + 1 = 11 [重复]

    这个问题在这里已经有答案了 我试图以数学方式添加数字 但它不断添加后面的数字 它获取 id 编号 begen 然后获取另一个 div 内的编号 kacbegen var begen this attr id var kacbegen mat
  • 通过 CSS 选择器选择两个已知元素之间的所有元素

    我有两个已定义 id 的元素 它们之间有任何 html 例如 div Hello div div Example div hr a href Example a div World div 是否有 CSS 选择器可以选择 d1 和 d2 之
  • HTTP 状态 500 - Servlet appServlet 的 Servlet.init() 引发异常

    我想尝试一个简单的程序 但出现以下错误 我正在使用 Eclipse Kelper 和 Tomcat 7 0 尝试了很多事情 但没有什么对我有用 HTTP Status 500 Servlet init for servlet appServ
  • Firebase 安全规则阻止写入 Firebase

    注 此问题已标记 polymer 因为 Polymer 库用于生成 Javascript 这个问题是关于处理 Firebase 安全性的两个不同但相关的问题 在尝试让 Firebase 安全规则发挥作用时 问题 1 和问题 2 似乎提出了相
  • Javascript 通过匹配字符串对数组进行排序

    我有一个包含地理位置代码结果的数组 我想按与我搜索过的术语最接近的匹配项对其进行排序 例子 搜索 Pizza Array Pizza Uno Pizzeria Uno Burgers and Pizzeria Cino Pizzeria 排
  • 如何绕过 Swagger-UI 的身份验证?

    如何从浏览器绕过 Swagger UI 的令牌身份验证 我可以通过 Postman 向 Swagger UI 发出请求 当我从浏览器发出请求时 我收到错误 因为它请求令牌 http localhost 8080 swagger ui ind
  • 如何使用所需的 BSTR* 参数正确调用 IDispatch::Invoke

    有很多关于如何使用 BSTR 参数调用 IDispatch Invoke 的示例 我将此与许多其他 SomeType 参数一起使用 但无论我尝试什么 我要么得到类型不匹配的HRESULT E OUTOFMEMORY 要么得到访问冲突 在我看
  • 为什么我不能简单地将安装的 Perl 模块复制到其他机器上?

    我对 Perl 很陌生 但对动态语言还不太熟悉 我对模块的管理如此不直接感到有点惊讶 Sure cpan X理论上确实有效 但我正在从三台不同的机器和操作系统上处理同一个项目 在工作中 在家里 在外部环境中进行测试 在工作中 Windows
  • 使用内容值的更新方法

    Helper public boolean mMessagesSent String ID int Data SQLiteDatabase db this getWritableDatabase ContentValues contentV
  • 调用非对象上的成员函数 num_rows()

    我正在使用 CodeIgniter 并且我想从数据库中的表中获取一些数据 在我的模型中 我有这个功能 public function fetch cours limit start element id element this gt db
  • 使用 Python 请求在请求之间设置新的 cookie

    我现在正在这样做 但在最后一行失败了TypeError expected string or buffer import requests from urllib parse import urlparse url some url s r
  • Rake 无法迁移

    C Users MEGHA bbbb gt rake db migrate rake aborted SyntaxError C Users MEGHA bbbb db migrate 20140402130040 create comme
  • Python zip 单个列表元素

    我有这个 t 1 2 3 4 5 6 11 22 33 44 55 66 并想要得到这个 1 4 11 44 2 5 22 55 3 6 33 66 如何以Pythonic方式做到这一点 使用星号 它可以解压参数列表 gt gt gt zi
  • 创建表时出错

    在 MySQL 终端上粘贴以下 MySQL 命令后 出现以下错误 此代码是我从项目的生产环境中获取的 我想根据生产环境的数据库更新本地数据库 mysql gt CREATE TABLE cityguide pointofinterest g
  • 我可以将自己的jsp页面导入到另一个jsp页面中吗?

    我已经使用 netbeans 准备了一个静态 html 页面 我可以将该页面导入到另一个页面中 以便不再重新编写代码 然后进行相应的更改吗 您可以使用以下方法将 JSP 页面合并到另一个页面中 include像这样的指令 或通过使用
  • 按日期从 iPhone 删除本地通知

    iPhone 上的 LocalNotification 是否有可能在某个日期加载 我的问题是我为通知创建了一个事件 但在创建后释放了该对象 或者我可以创建一个具有相同数据的新对象来删除我的通知吗 对不起我的英语不好 预定的本地通知将为您提供
  • PHP 简单乘法的舍入误差[重复]

    这个问题在这里已经有答案了 PHP 在使用时似乎舍入不正确 int 来转换变量 为什么 multiplier 100000000 value 0 01020637 echo int value multiplier Output 10206
  • Ruby 是否执行尾部调用优化?

    函数式语言导致使用递归来解决很多问题 因此许多语言执行尾调用优化 TCO TCO 导致从另一个函数 或本身 在这种情况下 此功能也称为尾递归消除 它是 TCO 的子集 调用函数 作为该函数的最后一步 不需要新的堆栈帧 这减少了开销和内存使用