Происхождение термина «ссылка», как в «передача по ссылке» - PullRequest
13 голосов
/ 07 декабря 2009

Адвокаты языка Java / C # любят говорить, что их язык передает ссылки по значению. Это будет означать, что «ссылка» - это указатель на объект, который копируется при вызове функции.

Между тем, в C ++ (а также в более динамичной форме в Perl и PHP) ссылка представляет собой псевдоним другого имени (или значения времени выполнения в динамическом случае).

Меня интересует этимология здесь. Каковы были ранние использования термина «ссылка»? Давайте перейдем к pre-Java, но если вы знаете, как использовать pre-C ++, меня это тоже заинтересует.

(я знаю, что словарный запас меняется и т. Д., Но меня просто интересует история).

Ответы [ 9 ]

15 голосов
/ 07 декабря 2009

Существует раннее использование термина «вызов по ссылке» в статье «Семантические модели передачи параметров» , Ричард Фэйрли, март 1973 г.

В первые дни терминология была противоречивой. Например, в спецификации Fortran 66 используются фразы «ассоциация по имени» и «ассоциация по значению». Теперь мы бы назвали их «вызов по ссылке» и «вызов по значению». В отличие от этого, в спецификации Algol 60 (1962) использовались термины "вызов по имени" и "вызов по значению" ... и ни один из них не является тем, что мы в настоящее время называем вызов по ссылке.

РЕДАКТИРОВАТЬ : Для тех, кто хочет пометить пионеров, которые указали Fortran 66, как сбитых с толку использованием фразы «ассоциация по имени», подумайте:

  1. Fortran 66 был первой попыткой указать язык с (как мы теперь называем) вызовом по ссылке.

  2. Это была только вторая попытка указать язык с подпрограммами, поддерживающими передачу параметров.

  3. Фортран 66 «ассоциация по имени» можно рассматривать как ограниченную (вырожденную) форму «вызова по имени» Алгола 60. Ограничением является то, что в Фортране имя должно быть простой переменной или именем массива, где в Алголе 60 это может быть любое выражение.

  4. В то время (1966 г.) не было ясно, что «призыв по имени» Алгола 60-х годов был обречен на отказ от плохой идеи. Действительно, когда я изучал Algol 60 в качестве студента в 1977 году, я не помню, чтобы лектор представлял «звонок по имени» как плохую идею. (Это было представлено как трудно понять ... но это другое дело.)

11 голосов
/ 07 декабря 2009

(этот ответ относится только к C #, AFAIK)

Не говорите Эрику Липперту, что ссылки - это указатели ;-p Они случаются , что то же самое в MS C # / .NET, но это деталь реализации. Ссылка - это непрозрачная, безопасная «вещь», которая позволяет вам найти объект. Указатель является адресом памяти. Они упорно работали, чтобы убедиться, что вы всегда знаете, какие вы имеете в виду ...

Было бы вполне возможно реализовать CLI и компилятор, который не рассматривал бы оба как одно и то же; вы все равно будете передавать ссылку на значение.

Ссылки не являются адресами

3 голосов
/ 07 декабря 2009

Я думаю, что термин, который вы должны использовать для поиска по истории, это «вызов по ссылке», а не «переход по ссылке». Например, Википедия перенаправляет « Передача по ссылке » на « Оценочная стратегия », в которой перечисляется Вызов по ссылке .

Используя " call-by-reference " в качестве поискового запроса в Google Книгах, можно найти фрагмент из « Основные характеристики CPL » из журнала «Computer Journal», август 1963 года; 6: 134 - 143 (Британское компьютерное общество)

Возможны три режима вызова параметров; вызов по значению (что эквивалентно вызову ALGOL по значению), вызов по замене (эквивалентно вызову ALGOL по имени) и вызов по , ссылка . В последнем случае передается значение LH фактического параметра; это соответствует «призыву по простому имени», предложенному Strachey and Wilkes (1961). Обратите внимание на соответствие трем видам инициализации ...

Этот последний "вызов по имени", вероятно, имеет ту же терминологию, что и был использован в спецификации Algol 60, на которую Стивен С. ранее указывал в этой теме.

(я думаю, " Стрейчи и Уилкс " взяты из CACM 1961, но у меня нет доступа к любому исходному тексту для проверки.)

2 голосов
/ 07 декабря 2009

I ДУМАЮ это восходит к PASCAL, возможно, дальше.

Исходный FORTRAN передавал аргументы по ссылке: передавал адрес переменной, массива или матрицы.

Алгол-60 передается по имени или по значению. Обращение по имени оказалось огромной ошибкой, которая научила дизайнеров языка программирования МНОГО о том, что НЕ делать. PASCAL передал параметры по значению или по ссылке, в зависимости от того, был ли параметр помечен как VAR (передача по ссылке) или нет (передача по значению).

1 голос
/ 07 декабря 2009

Использование термина «ссылка» было и является непоследовательным.

  • В некоторых случаях это материальная сущность, например ссылки на объекты Simula / Delphi / Java / C #. Вы можете сравнить их (с нулем и друг с другом) и передать их в качестве параметров (по значению или по ссылке).
  • Большинство языков поддерживают ссылку как режим передачи параметров совершенно непрозрачным способом.
  • C ++ - единственный язык (который я знаю), который расширяет эту непрозрачную модель и позволяет вам иметь справочные поля и переменные (int& r = i;).

Во-первых, это означает, что ссылки на C ++ сильно отличаются от ссылок на C #.

Я думаю, что здесь не хватает жаргона, чтобы различать эти две разные формы «ссылки».

Также см. SO: История общего / частного / защищенного .

1 голос
/ 07 декабря 2009

Я всегда думал, что идея заключается в том, чтобы различать указатель и ссылку. Ссылки будут указывать на объект, где бы он ни находился.

Указатель указывает на адрес в памяти, однако в управляемых языках это может измениться. Таким образом, вы должны иметь абстракцию через ссылку, чтобы ваш код всегда работал. например. вы не могли просто написать ссылку ++ при использовании массивов на управляемом языке, поскольку сборщик мусора может перемещать ваш массив. Обратите внимание, что я хорошо осведомлен о закреплении и небезопасном коде в c #:).

Как мой преподаватель java объяснил мне это, другой ключевой «концепт» со ссылкой - это то, что вы не можете манипулировать им. Указатели предназначены для управления программистом, ссылки - для управления компилятором / средой выполнения.

1 голос
/ 07 декабря 2009

Самые ранние употребления термина «ссылка», например, «передача по ссылке», вероятно, утрачены в незапамятные времена. Конечно, FORTRAN передает свои параметры по ссылке и всегда делал.

Упоминание о «названии по имени» напоминает мне шутку Николаса Вирта (изобретателя Паскаля) (вероятно, единственную):

«Профессор, как вы произносите свою фамилию?»

«Если вы звоните по имени, это V-I-R-T, но если вы звоните по значению, это W-O-R-T-H»

И люди говорят, что у программистов нет чувства юмора!

1 голос
/ 07 декабря 2009

Я мог бы представить, что вы можете отследить его до C , который имел (и имеет) указатели , а также операторы ссылки и разыменования.

0 голосов
/ 07 декабря 2009

Обратите внимание, что в 60-х (да, в 70-х) «ссылка» означала использование имени чего-либо. Это согласуется с использованием более старых философских и лингвистических терминов «референт» и «референция». От Фортран 77 :

2.12 Ссылка

Переменная, элемент массива или ссылка на подстроку - это внешний вид переменной, массива имя элемента или подстроки, соответственно, в операторе в контексте, требующем значения этой сущности, которая будет использоваться во время выполнения исполняемой программы. Когда ссылка на сущность выполнена, ее текущее значение доступно. В этом стандарте акт определение объекта не считается ссылкой на этот объект.

Ссылка на процедуру - это появление имени процедуры в выражении в контексте. что требует выполнения действий, указанных в процедуре, во время выполнения исполняемая программа. Когда выполняется ссылка на процедуру, процедура должна быть имеется.

...