Mirroring Call-by-Need, or Values Acting Silly
本文引入了一种退化的“call-by-silly”演算,该演算对称地结合了按名调用(call-by-name)与按值调用(call-by-value)中最差的特性,旨在证明按值调用的上下文等价性对效率是盲目的,同时也提供了一个相应的策略、抽象机以及紧凑的多类型系统,以证明其计算的是最大长度的求值序列。
原始论文采用 CC BY 4.0 许可(http://creativecommons.org/licenses/by/4.0/)。 这是对下方论文的AI生成解释。它不是由作者撰写或认可的。如需技术准确性,请参阅原始论文。 阅读完整免责声明
想象一下你是一位繁忙厨房里的厨师,正试图寻找准备一道复杂菜肴的最有效方法。在计算机科学领域,特别是在一个叫做“编程语言理论”的领域中,这些“厨师”实际上是研究计算机运行时如何“思考”的数学家和逻辑学家。他们并不在烹饪食物,而是在操纵符号和指令。他们提出的核心问题是:“当计算机看到一项任务时,它应该立即执行工作,还是应该等到绝对必要的时候再做?”
为了理解这个答案,请想象两种不同的烹饪风格。第一种风格被称为“按需调用”(Call-by-Name),就像一位懒惰的厨师,除非食谱明确要求,否则拒绝切洋葱。如果食谱说“扔掉洋葱”,这位懒惰的厨师甚至连刀都不会拿起,从而节省了时间和精力。对于“丢弃”(擦除)而言,他是“明智的”;但对于“切菜”(复制)而言,他是“愚蠢的”,因为如果食谱要求两次洋葱,这位懒惰的厨师就会切两次,从而浪费时间。第二种风格是“按值调用”(Call-by-Value),像是一位过度准备的厨师,在食谱开始之前就把每一种食材都切好了。因为他们只切一次,所以在“切菜”方面是“明智的”;但在“丢弃”方面则是“愚蠢的”,因为他们可能会切好一个随后在食谱中被要求忽略的洋葱。
几十年来,科学家们一直对一种被称为“按需调用”(Call-by-Need)的第三种风格感到着迷,它试图成为完美的厨师:它会等到必要时才切菜(明智的擦除),但即使需要多次,也只切一次(明智的复制)。但如果我们想要研究完全相反的情况呢?如果我们想看看当一个厨师在“切菜”和“丢弃”两方面都表现得很糟糕时会发生什么?这就是名为《镜像按需调用,或价值表现得愚蠢》(Mirroring Call-by-Need, or Values Acting Silly)这篇论文所要回答的奇特而有趣的问题。
作者贝尼阿米诺·阿卡托利(Beniamino Accattoli)和艾德里安·兰塞尔(Adrienne Lancelot)决定设计一种全新的、刻意低效的烹饪风格,他们称之为“按愚蠢调用”(Call-by-Silly)。在这个世界里,厨师即使在不需要使用食材时也会切菜(愚蠢的复制),并且即使食材还没被处理过也会将其丢弃(愚蠢的擦除)。这听起来像是灾难性的配方,作者也承认它是“极其低效的”。然而,他们并不关心是否能做出好菜;他们关心的是理解厨房本身的规则。通过构建这个“愚蠢”的系统,他们可以证明“明智”的系统(Call-by-Need)确实是“按名调用”的一个完美的优化版本,并且他们发现了一个关于“准备型”系统(Call-by-Value)的惊人事实。
论文证明,如果你观察一道菜的最终结果,“准备型”厨师(Call-by-Value)和“愚蠢型”厨师(Call-by-Silly)实际上会产生完全相同的成果,尽管愚蠢型厨师做了大量的无用功。这揭示了我们衡量计算机程序时的一个隐藏盲点:标准的检查两个程序是否“相同”的方法,无法区分一个聪明的厨师和一个愚蠢的厨师,只要两者的区别仅仅在于做了多少额外的工作。事实证明,在纯粹的、无副作用的厨房里,标准的等价规则是“对效率盲目的”。
为了证明这一点,作者不仅仅是靠猜测;他们构建了一个数学机器,一个被称为“Silly MAM”的“机器人厨师”,它遵循愚蠢的规则逐步运行。他们还使用了一种利用“多类型”(multi-types,可以理解为一张非常详细的食谱卡,用于追踪食材被触碰的具体次数)的特殊计数系统。他们利用这个系统记录了愚蠢机器人采取的每一个步骤。他们发现,愚蠢策略实际上采取了完成任务的最长路径。虽然“按需调用”机器人采取的是最短路径,但“按愚蠢调用”机器人采取的是完成任务所需的最大步数。
这篇论文是一项严密的数学证明,而非仅仅是模拟。作者构建了一个新的演算系统(一套操纵符号的规则),证明了它的行为是一致的,并使用了一个形式化类型系统来测量所采取的精确步数。他们证明了他们的“愚蠢”系统实际上是“需求”系统的完美镜像。正如“需求”系统结合了两个世界的优点,“愚蠢”系统则结合了两个世界的缺点。
该论文最重要的发现是,这种“愚蠢”行为暴露了我们对标准“按值调用”语言定义程序等价性的局限性。论文表明,两个程序可以是数学等价的,即使其中一个做了大量的无用功,而另一个则毫无多余动作,前提是它们不与外界交互(比如修改文件或打印屏幕)。这表明,我们目前用于检查程序是否“相等”的工具可能忽略了一个关键细节:它们没有计算浪费的精力。
最后,这篇论文并不是告诉我们要开始编写“愚蠢”的代码。相反,它利用这个荒诞且低效的系统作为一面镜子,来帮助我们更好地理解高效的系统。它向我们展示了,虽然“按需调用”是一种卓越的优化,但“按值调用”在看待等价性时存在一个隐藏的缺陷:它不在乎你是聪明还是愚蠢,只要你能把工作完成即可。作者成功地在计算机科学的地图上建立了一个“愚蠢”的角落,以帮助我们更清晰地观察整个景观,证明了有时,为了理解做事的最佳方式,你必须研究最糟糕的方式。
您所在领域的论文太多了?
获取与您研究关键词匹配的最新论文每日摘要——附技术摘要,使用您的语言。