2

В настоящее время я беру курс на концепции языков программирования, где я наткнулся на вопрос, который оставил меня путают однажды (когда я смотрел на видео Martin Odersky's functional programming course on Coursera):Связаны ли разные значения отношения «по вызову»?

Термин «вызов по -значение»постоянно используется в двух различных контекстах:

Контекст 1: Оценка режима (Call по значению против вызова по имени)

Если функция передается выражение как аргументом, является то, что выражение сводится к значению (т. е. оценивается) перед идентификаторами параметра в тело функции заменено на него? Если это так, это называется «позывным», если нет, это вызов по имени. По крайней мере, так я это понимаю.

Контекст 2: передача параметров (Call по значению против вызова по ссылке)

Если функция передается идентификатор в качестве аргумента, это тело функции оценивается с новым имя привязки, которое указывает на копию того, на что указывает данный идентификатор, или может ли функция действительно вносить изменения в то, что указывает идентификатор, т. е. изменения, которые являются «видимыми» для вызывающего контекста? Опять же, первый вариант был бы по умолчанию, а второй - вызовом по ссылке. Если, я понял это правильно.

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

Кто-нибудь знает, почему один и тот же термин был выбран для двух (казалось бы, разных) вопросов?

+1

Вызов по ссылке - это вызов по значению со значением, являющимся ссылкой. – Sylwester

+0

Оба кажутся для меня очень похожими. Оба дела в основном сводятся к: * - это буквальная вещь, передаваемая в функцию, или только любое значение, которое буквально оценивает. * – deceze

+1

Да, кажется, что «значение» в обоих контекстах означает разные вещи. В первом случае «значение» является результатом оценки выражения. Принимая C++, который не использует позывной, в 'void f (int &i); int main() {f (* (новый int));}' значение "(как в первой категории) относится к объект/указывает на место хранения, но мы используем pass-by-reference, потому что во втором контексте «значение» означает то, что содержит место хранения, в отличие от самого местоположения. –

ответ

1

Ваш анализ верен, и я также нахожу перегрузку фразы «вызов по значению», чтобы ввести в заблуждение.

Приняв язык от relevant Wikipedia article, вызов по значению и вызов по ссылке можно рассматривать как два варианта «строгой оценки», в то время как вызов по имени является типом «нестрогой оценки».

Чтобы ответить на ваш вопрос, у меня есть гипотеза о том, что небрежное использование фразы «вызов по значению» для обозначения «строгой оценки» вообще возникает из-за того, что вызов по значению является тип строгой оценки, осуществляемый некоторыми из самых популярных императивных языков программирования. Некоторые old lecture notes from a PL course at UMD объединяют два контекста, которые вы описываете. Они ссылаются на защиту аргументов против модификации как «еще одну особенность» вызова по значению в C, C++ и Java (слайд 21), где подразумевается строгая оценка (ошибочно IMHO), которая является определяющей особенностью call-by- стоимость.

Смежные вопросы