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 是否执行尾部调用优化? 的相关文章

  • 回滚后是否应该删除迁移

    我对 ruby 和 Rails 相当陌生 刚刚开始了解迁移 我的问题是回滚后删除迁移的最佳实践或正确时间是什么 到目前为止 我读到的内容是回滚后是否删除迁移的观点问题 但是在团队中工作时删除迁移是否有任何重大影响 以及保留迁移文件相对于删除
  • 在 Java 8 中使用映射函数时类型转换不起作用

    我正在比较两个列表 List allUserGroups UserBC getAllGroupsForUser userId deptID List
  • 将名称绑定到值与将值分配给变量

    阅读 Bartosz Milewski 的文章完整的 https www fpcomplete com school starting with haskell basics of haskell 3 pure functions lazi
  • Rspec to have(n).items undefined 方法

    我正在尝试遵循指南关于代码 tuts http code tutsplus com tutorials ruby for newbies testing with rspec net 21297我不断收到错误 这是我的库规范 require
  • 随机采样数组的唯一子集

    如果我有一个数组 a 1 2 3 如何随机选择数组的子集 以使每个子集的元素都是唯一的 也就是说 对于a可能的子集是 1 2 3 1 2 2 3 1 2 3 我无法生成所有可能的子集 因为 a 的实际大小非常大 因此有很多很多子集 目前 我
  • Ruby on Rails Webpacker 找不到 asset_pack_path 下的图像

    我在使用 Ruby on Rails Webpacker 在视图中包含图像时遇到问题 当我尝试使用 html img 标签和 asset pack path 在我的视图中插入图像时 出现错误 我的图像位于app javascript ima
  • 何时使用node.js、sinatra、rails? [关闭]

    Closed 这个问题是基于意见的 help closed questions 目前不接受答案 这 3 种语言 框架的最佳用途是什么 混合所有 或 2 个 有用吗 如果您正在构建一个完整的 Web 应用程序 您可能应该使用 Rails 因为
  • 生成源映射时出错 - grunt 和 sass 配置

    我正在尝试将 sass 与 grunt 一起使用 我已经在我的路径中安装了 ruby sass 和 grunt 版本是 节点 0 10 20npm 11 3 1grunt cli 0 1 13咕噜声 0 4 5萨斯 3 4 4 我的包 js
  • 有没有办法避免自动更新 Rails 时间戳字段?

    如果您有数据库列created at and updated at当您创建和更新模型对象时 Rails 将自动设置这些值 有没有办法在不接触这些列的情况下保存模型 我正在引入一些旧数据 我想根据 不同名称的 旧数据字段中的相应值设置这些值
  • 设计 React Hooks 可防止 React-hooks/exhaustive-deps 警告

    我正在设计一个钩子 仅当钩子依赖项发生变化时才获取数据 它按预期工作但我收到了 linter 警告 React Hook useEffect was passed a dependency list that is not an array
  • 我应该用不可变或可变的数据结构来表示数据库数据吗?

    我目前正在使用 Scala 进行编程 但我想这适用于任何函数式编程语言 或者更确切地说 任何建议不变性并可以与数据库交互的编程语言 当我从数据库中获取数据时 我将其映射到模型数据结构 在函数式编程中 数据结构往往是不可变的 但是数据库中的数
  • 对范围值进行排序

    我想对表示数值范围的字符串数组进行排序 如下所示 b 0 5 100 250 5 25 50 100 250 500 25 50 使用sort我得到的方法 b sort gt 0 5 100 250 25 50 250 500 5 25 5
  • 添加两个 ActiveRecord::Relation 对象[重复]

    这个问题在这里已经有答案了 如何将两个关系添加在一起 当我尝试 运算符时 它返回一个数组 但我需要它来返回关系 谢谢 麦克风 Try new relation relation merge another relation
  • 自动加载常量时检测到循环依赖

    我将 Rails 从版本 3 1 2 运行良好 升级到 4 0 并遇到以下错误 circular dependency detected while autoloading constant Foo 我创建了一个类ProductFactor
  • 我应该如何使用 alias_method_chain 作为构建方法?

    我正在使用 Ruby on Rails 3 2 13 我想正确使用alias method chain build option name声明 因为我收到一个奇怪的错误 那是 在我的控制器文件中我有 class Articles Comme
  • 如何使 Yard `@macro` 应用于多个文件

    如果我有在one file下列 module Something class Resource Defines a new property param String name the property name param Class t
  • 如何检查字符串是否为有效日期

    我有一个字符串 31 02 2010 并想检查它是否是有效日期 最好的方法是什么 我需要一个方法 如果字符串是有效日期 则返回 true 如果不是 则返回 false require date begin Date parse 31 02
  • Haskell 中的所有图形和 Web 库是如何实现的?

    我才开始学习Haskell 我读到它是一种纯函数式语言 其中的所有内容都是不可变的 因此 输入输出 写入和读取数据库之类的事情会导致状态的可变性 我知道 Haskell 中有一种叫做 monad 的东西 它允许在 Haskell 中使用命令
  • Gem 在 irb 中可用,但在 Rails 控制台中不可用

    我正在尝试在我的 Rails 项目中使用 RedCloth gem 当我使用irb我可以加载宝石 require rubygems require RedCloth 它工作正常 但是当我在 Rails 控制台中尝试相同的操作时 我收到一条错
  • “heroku”命令存在于以下 Ruby 版本中:

    我在使用 heroku 工具带时遇到了重大问题 我正在使用 cedar 14 堆栈 当我尝试使用不是的 ruby 版本时ruby 2 0 0 dev我收到这个错误 rbenv heroku command not found The her

随机推荐

  • 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 的子集 调用函数 作为该函数的最后一步 不需要新的堆栈帧 这减少了开销和内存使用