术语“参考”的来源,如“通过参考”

时间:2009-12-06 21:30:05

标签: c# java c++ reference pass-by-reference

Java / C#语言律师喜欢说他们的语言通过值传递引用。这意味着“引用”是一个在调用函数时被复制的对象指针。

同时,在C ++中(以及在Perl和PHP中更动态的形式),引用是其他名称的别名(或动态情况下的运行时值)。

我对这里的词源感兴趣。什么是“参考”一词的早期用途?让我们来看看Java之前的版本,但是如果你知道C ++之前的版本,我也会对此感兴趣。

(我知道词汇变化等,但我只对历史感兴趣)。

9 个答案:

答案 0 :(得分:15)

1973年3月Richard E Fairley在"Semantic Models of Parameter Passing"的论文中提到了“引用书”的早期用法。

在早期,术语不一致。例如,Fortran 66 specification使用短语“按名称关联”和“按值关联”。我们现在将这些称为“按引用调用”和“按值调用”。相比之下,Algol 60 specification(1962)使用了“按名称呼叫”和“按价值呼叫”这两个术语......这些都不是我们目前称之为引用的呼叫。

编辑:对于那些希望将指定Fortran 66的先驱者标记为使用“按名称关联”这一短语的人,请考虑以下事项:

  1. Fortran 66是第一次尝试通过引用来指定一种语言(我们现在称之为)。

  2. 这是第二次尝试使用支持参数传递的子程序指定语言。

  3. Fortran 66的“名称关联”可被视为Algol 60的“名称呼叫”的限制(简并)形式。限制是在Fortran中,名称必须是一个简单的变量或数组名称,在Algol 60中它可以是任何表达式。

  4. 当时(1966)并不清楚Algol 60的“名字叫”注定会被抛弃作为一个坏主意。事实上,当我在1977年学习Algol 60作为本科生时,我不记得讲话者提出“名字叫”是一个坏主意。 (它被认为很难理解......但这是另一回事。)

答案 1 :(得分:11)

(此回复仅涉及C#,AFAIK)

不要告诉Eric Lippert引用是指针;-p它们发生在MS C#/ .NET中是相同的东西,但这是一个实现细节。引用是一个不透明,安全的“东西”,允许您定位对象。指针是内存地址。他们努力工作以确保你总能知道你的意思......

实现一个CLI和编译器是完全可行的,没有将两者视为相同;但是,您仍然会将引用传递给该值。

References are not addresses

答案 2 :(得分:3)

我认为您应该用于历史搜索的术语是“按引用调用”而不是“按引用传递”。例如,维基百科将“Pass-by-reference”重定向到“Evaluation Strategy”,其中列出了call-by-reference

在Google图书中使用“call-by-reference”作为搜索字词会找到一个代码段 “The Main Features of CPL”来自“计算机杂志”,1963年8月; 6:134 - 143(英国计算机学会)

  

可以使用三种参数调用模式;通过调用(相当于按值调用ALGOL),通过替换调用(相当于按名称调用ALGOL),并通过引用调用。在后一种情况下,实际参数的LH值被移交;这相当于Strachey和Wilkes(1961)提出的“简单名称”。注意三种初始化的对应关系......

后者“按名称调用”可能与Algol 60规范中使用的术语相同,而Stephen C早先在此主题中指出。

(我认为“Strachey and Wilkes”来自CACM 1961,但我无权访问任何要验证的源文本。)

答案 3 :(得分:2)

THINK 它可以追溯到PASCAL,可能更远。

原始FORTRAN通过引用传递参数:传递变量,数组或矩阵的地址。

ALGOL-60按名称或值传递。调用名称证明是一个巨大的错误,它教会编程语言设计师很多不该做的事情。 PASCAL按值或通过引用传递参数,具体取决于参数是否标记为VAR(通过引用传递)或不传递(按值传递)。

答案 4 :(得分:1)

我想你可以追溯到C已经(并且仍然有)pointers以及引用和解除引用运算符。

答案 5 :(得分:1)

“参照”中最早使用的术语“参考”可能在昏暗的古代中丢失。当然,FORTRAN通过引用传递其参数并始终完成。

提到“名字叫”让我想起了Nickolas Wirth(Pascal的发明者)的笑话(可能是唯一一个):

“教授,你怎么说出你的姓氏?”

“如果按名称拨打电话,则为V-I-R-T,但如果按值拨打,则为W-O-R-T-H”

人们说程序员没有幽默感!

答案 6 :(得分:1)

我一直认为这个想法是区分指针和引用。引用将指向对象,无论它在哪里。

指针指向内存中的地址,但是在托管语言中,这可能会发生变化。因此,您必须通过引用获得抽象,以确保您的代码始终有效。例如。当在托管语言中使用数组时,你不能只编写引用++,因为垃圾收集器可以移动你的数组。请注意我很清楚c#中的固定和不安全代码。)。

正如我的java导师也向我解释过的那样,另一个带有参考的关键“概念”就是你无法操纵它。指针是供程序员管理的,引用是供编译器/运行时管理的。

答案 7 :(得分:1)

术语“参考”的使用是和不一致的。

  • 在某些情况下,它是一个有形的实体,如Simula / Delphi / Java / C#对象引用。您可以比较它们(使用null和彼此)并将它们作为参数传递(按值或按引用)。
  • 大多数语言都以完全不透明的方式支持参考作为参数传递的模式。
  • C ++是唯一一种扩展这个不透明模型的语言(我知道),它允许你有引用字段和变量(int& r = i;)。

首先,这意味着C ++引用与C#引用非常不同。

我认为我们在这里缺少一些术语来区分这两种不同形式的“参考”。

另见SO: History of public/private/protected

答案 8 :(得分:0)

请注意,在60年代(是的,到70年代),“参考”意味着使用某物的名称。这与使用旧的哲学和语言术语“指称”和“参考”一致。来自Fortran 77

  

2.12参考

     

变量,数组元素或子字符串引用是变量数组的外观   元素或子字符串名称,分别位于需要该值的上下文中的语句中   在执行可执行程序期间使用的该实体的。当一个   执行对实体的引用,其当前值可用。在这个标准中,行为   定义实体不被视为对该实体的引用。

     

过程引用是上下文中语句中过程名称的外观   这需要在执行期间执行过程指定的操作   可执行程序。执行过程引用时,必须执行该过程   可用。