Происхождение термина "ссылка", как в "передаче по ссылке",

Юристы языка Java/С# любят говорить, что их язык передает ссылки по значению. Это означало бы, что "ссылка" является указателем объекта, который копируется при вызове функции.

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

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

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

Ответы

Ответ 1

Существует раннее использование термина "вызов по ссылке" в документе "Семантические модели прохождения параметров" Ричарда Э Фэрли, Март 1973 года.

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

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

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

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

  • Связь Fortran 66 по имени "может рассматриваться как ограниченная (вырожденная) форма Algol 60 "вызов по имени". Ограничение в том, что в Fortran имя должно было быть простой переменной или именем массива, где в Algol 60 это могло быть любое выражение.

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

Ответ 2

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

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

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

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

Ответ 3

Я думаю, что термин, который вы должны использовать для исторических поисков, - это "вызов по ссылке", а не "передача по ссылке". Например, Wikipedia перенаправляет " Pass-by-reference" в " Стратегия оценки", в котором перечислены call-by-reference.

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

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

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

(я думаю, Strachey and Wilkes" из CACM 1961, но у меня нет доступа к любому исходному тексту для проверки.)

Ответ 4

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

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

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

Ответ 5

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

Ответ 6

Самое раннее использование термина "ссылка", как в "переходе по ссылке", вероятно, потеряно в тусклой древности. Конечно, FORTRAN передает свои параметры по ссылке и всегда делал.

Упоминание "призыв по имени" напоминает мне анекдот Николаса Вирта (изобретателя Паскаля) (возможно, единственный):

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

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

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

Ответ 7

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

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

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

Ответ 8

Использование термина "ссылка" было и несовместимо.

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

С одной стороны, это означает, что ссылки на С++ сильно отличаются от ссылок на С#.

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

Также см. SO: История публичных/частных/защищенных.

Ответ 9

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

2.12 Ссылка

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

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