Термин «ссылочная прозрачность» происходит от аналитической философии , ветви философии, которая анализирует конструкции, утверждения и аргументы естественного языка, основанные на методах логики и математики. Другими словами, это самая близкая тема вне компьютерной науки к тому, что мы называем семантика языка программирования . Философ Уиллард Куайн был ответственен за инициирование концепции прозрачности ссылок, но это также подразумевалось в подходах Бертрана Рассела и Альфреда Уайтхеда.
По своей сути «ссылочная прозрачность» - очень простая и понятная идея. Термин «референт» используется в аналитической философии, чтобы говорить о вещи, к которой относится выражение . Это примерно то же самое, что мы подразумеваем под «значением» или «обозначением» в семантике языка программирования. Используя пример Эндрю Биркетта ( сообщение в блоге ), термин "столица Шотландии" относится к городу Эдинбургу. Это простой пример «референта».
Контекст в предложении является «ссылочно-прозрачным», если заменить термин в этом контексте другим термином, который относится к той же сущности не меняет значение. Например
Шотландский парламент собирается в столице Шотландии.
означает то же, что и
Шотландский парламент собирается в Эдинбурге.
Таким образом, контекст "Шотландский парламент встречается в ..." является ссылочно прозрачным контекстом. Мы можем заменить «столицу Шотландии» на «Эдинбург», не меняя смысла. Другими словами, контекст заботится только о том, к чему относится этот термин, и ничего более. В этом смысле контекст «ссылочно прозрачен».
С другой стороны, в предложении
Эдинбург является столицей Шотландии с 1999 года.
мы не можем сделать такую замену. Если бы мы это сделали, мы бы получили «Эдинбург был Эдинбургом с 1999 года», что является сумасшедшей вещью, и не передает того же значения, что и первоначальное предложение. Таким образом, может показаться, что контекст «Эдинбург был ... с 1999 года» является косвенно непрозрачным (противоположность ссылочно-прозрачным). По-видимому, его волнует нечто большее , чем то, к чему относится этот термин. Что это?
Такие вещи, как "столица Шотландии", называются определенными терминами , и они долго не причиняли головной боли логикам и философам. Рассел и Куайн разобрались с ними, сказав, что они на самом деле не являются «референтными», то есть ошибочно думать, что приведенные выше примеры используются для обозначения сущностей. Правильный способ понять, что «Эдинбург был столицей Шотландии с 1999 года» - это сказать
Столица Шотландии существует с 1999 года, и эта столица - Эдинбург.
Это предложение не может быть преобразовано в сумасшедшее. Задача решена! Суть Куайна состояла в том, чтобы сказать, что естественный язык является грязным или, по крайней мере, сложным, потому что он сделан удобным для практического использования, но философы и логики должны вносить ясность, правильно понимая их. Ссылочная прозрачность - это инструмент, который используется для обеспечения такой ясности значения .
Какое все это имеет отношение к программированию? Не очень, на самом деле. Как мы уже говорили, ссылочная прозрачность - это инструмент, который используется для понимания языка, то есть для назначения , означающего . Кристофер Стрейчи , который основал семантику языка программирования, использовал его в своем исследовании значения. Его основополагающая статья " Основные понятия в языках программирования " доступна в Интернете. Это красивая бумага, и каждый может ее прочитать и понять. Поэтому, пожалуйста, сделайте это. Вы будете очень просветленным. Он вводит термин «ссылочная прозрачность» в этом параграфе:
Одним из наиболее полезных свойств выражений является то, что Quine вызывает
прозрачность. По сути, это означает, что если мы хотим найти значение выражения, которое
содержит подвыражение, единственное, что нам нужно знать о подвыражении, это его
значение. Любые другие особенности подвыражения, такие как его внутренняя структура, число
и характер его компонентов, порядок, в котором они оцениваются, или цвет чернил
в котором они написаны, не имеют отношения к значению основного выражения.
Использование слова «по существу» предполагает, что Стрейчи перефразирует его, чтобы объяснить его простыми словами. Функциональные программисты, кажется, понимают этот абзац по-своему. Есть 9 других случаев "ссылочной прозрачности" в статье, но они, кажется, не беспокоятся ни о каких других. Фактически вся статья Стрейчи посвящена объяснению значения императивных языков программирования . Но сегодня функциональные программисты утверждают, что императивные языки программирования не референтно прозрачны. Стрейчи перевернется в своей могиле.
Мы можем спасти ситуацию. Мы сказали, что естественный язык «грязный или, по крайней мере, сложный», потому что он сделан удобным для практического использования. Языки программирования одинаковы. Они «грязные или, по крайней мере, сложные», потому что они сделаны так, чтобы их было удобно использовать на практике. Это не значит, что они должны нас смущать. Они просто должны быть поняты правильно, используя мета-язык, который является ссылочно прозрачным, чтобы у нас была ясность смысла. В статье, которую я цитировал, Стрейчи делает именно это. Он объясняет значение императивных языков программирования, разбивая их на элементарные понятия, нигде не теряя ясности. Важной частью его анализа является указание на то, что выражения в языках программирования имеют два вида «значений», называемых l-значениями и r-значениями . До статьи Стрейчи это не было понято, и воцарилась путаница. Сегодня определение C упоминает об этом регулярно, и каждый программист C понимает это различие. (Понятно ли это понимают программисты на других языках).
И Куайн, и Стрейчи были обеспокоены значением языковых конструкций, которые включают некоторую форму зависимости от контекста. Например, наш пример «Эдинбург является столицей Шотландии с 1999 года» означает тот факт, что «столица Шотландии» зависит от времени, в которое она рассматривается. Такая зависимость от контекста является реальностью, как на естественных языках, так и на языках программирования. Даже в функциональном программировании свободные и связанные переменные должны интерпретироваться с учетом контекста, в котором они появляются. Зависимость от контекста любого вида так или иначе блокирует ссылочную прозрачность. Если вы попытаетесь понять значение терминов без учета контекста, от которого они зависят, вы снова получите путаницу. Куайна интересовало значение модальной логики. Он считал, что модальная логика была непрозрачной по ссылкам, и ее следует очистить, переведя ее в ссылочно-прозрачную структуру (например, рассматривая необходимость как доказуемость). Он в значительной степени проиграл эту дискуссию. Логики и философы одинаково находили возможную мировую семантику Крипке совершенно адекватной. Подобная ситуация также царит с императивным программированием. Зависимость от состояния, объясняемая Стрейчи, и зависимость от запаса, объясняемая Рейнольдсом (аналогично возможной мировой семантике Крипке), вполне адекватны. Функциональные программисты мало знают об этом исследовании. Их идеи относительно ссылочной прозрачности должны быть приняты с большим количеством соли.
[Дополнительное примечание: Приведенные выше примеры иллюстрируют, что простая фраза, такая как «столица Шотландии», имеет несколько уровней значения. На одном уровне мы можем говорить о столице в настоящее время. На другом уровне мы могли бы говорить о всех возможных столицах, которые Шотландия могла иметь с течением времени. Мы можем «увеличить» конкретный контекст и «уменьшить», чтобы довольно легко охватить все контексты в обычной практике. Эффективность естественного языка использует нашу способность сделать это. Императивные языки программирования эффективны практически так же. Мы можем использовать переменную x справа от присваивания ( r-значение ), чтобы говорить о ее значении в определенном состоянии. Или мы можем говорить о его l-значении , которое охватывает все состояния. Людей редко смущают такие вещи. Однако они могут или не могут точно объяснить все слои значения, присущие языковым конструкциям. Все такие слои значения не обязательно являются «очевидными», и это вопрос науки, чтобы изучить их должным образом. Однако неспособность простых людей объяснять такие многоуровневые значения не означает, что они смущены ими.]
Отдельный "постскриптум" ниже связывает это обсуждение с проблемами функционального и императивного программирования .