目前,我正在修读编程语言的概念,这是我遇到一个让我困惑的问题(当我在观看Martin Odersky's functional programming course on Coursera的视频时):
术语“按值调用”一直在两种不同的环境中使用:
背景1:评估制度(按价值调用与姓名呼叫)
如果函数正在作为参数传递一个表达式,那么在将函数体中的参数标识符替换为该表达式之前,该表达式是否被减少为一个值(即,已计算)?如果是这样,它被称为按值调用,如果不是,它是按名称调用。至少我就是这样理解的。
背景2:参数传递(按值调用与按引用调用)
如果一个函数被传递一个标识符作为参数,那么函数的主体是用一个新的名称绑定来评估的,该绑定指向给定标识符所指向的副本,或者该函数是否可以实际更改标识符的内容指向,即对调用上下文“可见”的更改?同样,第一个变体是按值调用,而第二个变量是按引用调用。 如果我当然是对的。
然而,即使我没有看到“按值调用”这两个用例之间的关系,但这两个场景中偶然使用的术语似乎过于巧合。
有人知道为什么选择相同的术语来描述两个(看似不同的)事项吗?
答案 0 :(得分:1)
您的分析是正确的,我也发现短语"按值调用"令人困惑。
采用relevant Wikipedia article中的语言,按值调用和按引用调用可以被视为"严格评估"的两种变体,而按名称调用是一种类型"非严格评估"。
为了回答你的问题,我有一个猜想,即大肆使用短语" call-by-value"参考"严格评估"总的来说,这是因为按值调用是一些最流行的命令式编程语言实现的严格评估的类型。有些old lecture notes from a PL course at UMD会混淆您描述的两种情境。它们指的是保护反对修改的论点,因为"另一个特征" C,C ++和Java中的值调用(幻灯片21),其中暗示严格的评估(错误地恕我直言)作为按值调用的确定特征。