Происхождение термина "ссылка", как в "передаче по ссылке",
Юристы языка 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 Ссылка
Переменная, элемент массива или ссылка подстроки - это вид переменной, массив элемент или имя подстроки, соответственно, в заявлении в контексте, требующем значения этого объекта, который будет использоваться во время выполнения исполняемой программы. Когда выполняется ссылка на объект, его текущее значение доступно. В этом стандарте акт определение объекта не считается ссылкой на этот объект.
Ссылка на процедуру - это появление имени процедуры в заявлении в контексте который требует действий, указанных процедурой, которая должна быть выполнена во время выполнения исполняемая программа. Когда выполняется обращение к процедуре, процедура должна быть доступны.