【问题标题】:Does sbcl consider whether a function has side-effects when optimizing?sbcl 在优化时是否考虑函数是否有副作用?
【发布时间】:2013-07-15 09:19:56
【问题描述】:

我最近一直在阅读SBCL User Manual 并开始想知道标题问题。 显然,一些 lisp,例如 clojure,禁止所有副作用,因此它们可以轻松地并行化代码。 Common Lisp 允许副作用,所以我想知道给定函数是“脏”还是“干净”的事实是否会影响它的编译。

例如在the CMUCL compiler manual 中,let 优化展示了在许多情况下使用“let”绑定新变量将比使用“setq”修改更有效。我想我是在问是否对函数调用做了类似的事情。

我已阅读 sbcl 手册的相关部分,并在 stackoverflow 上提出了问题,但找不到答案。

【问题讨论】:

  • Clojure 不会(不能)禁止所有副作用。例如(println "Hello World") 是一个副作用。要完全禁止他们,他们要么需要 1. 不使用该语言。 2. 被一个非常强大的类型系统分隔。其他任何事情都意味着停机问题
  • 谢谢,我应该更清楚一点。
  • 将您的问题写入 sbcl-devel 邮件列表。如果您向他们提出一个好而明确的问题,我相信他们会给您一个好的答案。
  • @PaulNathan:干杯我会再读一些,然后可能会这样做。
  • @Baggers 如果您的问题已得到解答,请将其作为此问题的答案发布。

标签: common-lisp sbcl


【解决方案1】:

简短: 没有更快。有时实际上更慢。

长:

根据来自 SBCL-devel 的 Stas Boukarev,

SBCL 甚至不知道函数没有副作用,所以,不。 此外,大多数时候有副作用是最优化的 方式。

我知道像nreverse 这样的破坏性函数往往比非破坏性函数更快(在这种情况下reverse 是非破坏性版本)。他们也带来了许多的挫折。正如彼得西贝尔所说:

每个回收功能都是一个指向脚下的上膛枪。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-08-15
    • 1970-01-01
    • 2017-01-08
    • 1970-01-01
    • 1970-01-01
    • 2014-07-02
    • 2017-11-01
    • 2012-07-03
    相关资源
    最近更新 更多