language-agnostic - 为什么大多数编程语言对传递给函数的参数使用预先求值?

标签 language-agnostic operator-precedence

在大多数编程语言中,传递给函数的参数在函数使用它们之前被评估,也就是说,它们被急切地评估。

对我来说,似乎只有在函数使用它们时才评估参数更有意义,也就是说,懒惰。这对我来说更有意义,因为它似乎具有性能优势:为什么要评估甚至从来不需要的东西?

此外,假设您想实现一个 if接受一个 bool 值的函数,如果 bool 值为真则返回一个对象,如果 bool 值为假则返回另一个对象:

object if(bool condition, object valueIfTrue, object valueIfFalse) {
  if(condition) return valueIfTrue;
  return valueIfFalse;
}

在急切地评估参数的语言中,即使函数总是只需要其中一个对象,也总是会评估两个对象,这充其量会产生轻微的不必要的开销,最坏的情况会导致无限循环。

也就是说,由于大多数编程语言都使用对函数参数的急切求值,我认为通常这样做肯定是有原因的。我忽略了这里的急切评估有什么很大的好处,仅仅是因为以这种方式实现语言更容易,这只是传统,还是什么?

最佳答案

我已经看到了急切评估的几个原因,这两个都很重要:

  • 急切的评估意味着副作用会立即且始终发生。如果您使用惰性求值,则不能依赖之前所做的事情的副作用来生效。
  • 惰性求值会带来一定的内存膨胀。与存储 thunk 相比,存储计算结果所需的内存通常要少得多。描述计算。这会导致使用过多内存(即时间与内存的权衡),有时更重要的是,更难弄清楚程序/算法的内存特性。

  • 惰性评估可以是一个强大的工具,但它并非没有代价。纯函数式语言倾向于避免问题 #1,因为它们没有副作用(通常),但有时仍会被问题 #2 咬住。允许延迟求值的语言(LISP 宏是这种形式的一种形式,虽然与惰性求值不同)可以两全其美,但代价是程序员付出了更多的努力。

    关于language-agnostic - 为什么大多数编程语言对传递给函数的参数使用预先求值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8797980/

    相关文章:

    php - 我该如何理解嵌套? : operators in PHP?

    sql注入(inject) bool 语法

    C 程序和宏

    security - 您在编写自己的密码学方法时使用哪些技术?

    math - float 学有问题吗?

    perl - 有没有办法将 epub 格式转换为图像?

    c++ - 后缀递增和递减是从左到右关联还是相反?

    string - 如何找到最长的不重复字符的子串?

    java - 如何使物体沿其旋转方向移动?

    c++ - 在 std::cout 中递增变量时指针不显示更新值