为什么大多数编程语言都会对传递给函数的参数使用急切的评估?

Pet*_*son 6 language-agnostic operator-precedence

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

对我来说,似乎只有在函数使用它们时才评估参数会更有意义,也就是说,懒惰.这对我来说更有意义,因为它似乎会带来性能上的好处:为什么要评估从未需要的东西?

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

object if(bool condition, object valueIfTrue, object valueIfFalse) {
  if(condition) return valueIfTrue;
  return valueIfFalse;
}
Run Code Online (Sandbox Code Playgroud)

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

也就是说,由于大多数编程语言都使用对函数参数的热切评估,我认为必须有一个理由为什么它通常以这种方式完成.这里有一些热切评估的好处,我忽略了,是因为它更容易以这种方式实现语言,它只是传统,还是什么?

RHS*_*ger 5

我看到了一些热切评估的原因,这两个原因都非常重要:

  1. 急切的评估意味着副作用会立即发生.如果你使用懒惰评估,你不能依赖你以前做过的事情的副作用才能生效.
  2. 懒惰的评估会带来一定的内存膨胀.存储计算结果通常比存储描述计算的thunk所需的内存少得多.这可能导致使用太多的内存(即时间与内存权衡),有时更重要的是,更难以确定程序/算法的内存特性.

懒惰评估可以是一个强大的工具,但它并非没有它的成本.纯功能语言倾向于避免问题#1,因为它们没有副作用(一般情况下),但有时仍被问题#2咬伤.允许延迟评估的语言(LISP宏是这种形式,虽然与懒惰评估不同)可以兼顾两个方面的优势,但代价是程序员更多的努力.