Что именно означает «семантически наблюдаемый» побочный эффект?

11

У меня есть вопрос относительно чистых функций. Согласно странице Википедии, один из необходимых компонентов для чистой функции:

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

Теперь, что это действительно значит. Или, скорее, как я могу сделать побочный эффект, который не является семантически наблюдаемым?

Хенрик Соммерланд
источник
2
Вы не должны придавать слишком большой вес волнистым вещам, которые можно найти в Википедии.
Андрей Бауэр
1
@AndrejBauer А? Что с этим связано? Возможно, не на уровне исследований (я не против, если это перенесено в компьютерные науки ) - хотя, учитывая вашу реакцию, возможно, нет.
Жиль "ТАК - перестань быть злым"
Я думаю, что мне просто не нравится фраза "семантически наблюдаемая".
Андрей Бауэр
1
Позвольте мне сказать по-другому: в чем разница между «семантически наблюдаемым» и «наблюдаемым»? «Семантически» - это просто модное слово, которое здесь не имеет смысла.
Андрей Бауэр
«семантика», по-видимому, имеет какое-то особое значение в различных областях теории программирования, возможно, заимствована из лингвистики / философии, где она насчитывает десятилетия, иначе как «синтаксис против семантики» .... может быть, это другой вопрос прямо здесь ....
vzn

Ответы:

11

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

Чрезвычайно подробная модель выполнения программы будет моделировать физическое поведение компьютера, на котором она выполняется, включая время выполнения, энергопотребление, электромагнитное излучение и т. Д. Такие аспекты очень редко принимаются во внимание, поскольку они очень редко актуальны. Тем не менее, они иногда имеют значение: полезная модель автопилота самолета должна включать информацию о времени выполнения, полезная модель безопасности кредитной карты должна включать электромагнитное излучение, ...

В типичной семантике такие побочные эффекты, как синхронизация и энергопотребление, игнорируются. Даже если в обычной настройке, где вы вводите выражение в приглашении интерпретатора Haskell, печать результата является побочным эффектом (если вы пытаетесь распечатать бесконечный объект, это имеет значение). Если интерпретатору Haskell не хватает памяти, это также является наблюдаемым побочным эффектом в модели «реального мира», но не в идеализированной модели Haskell, которая эффективно допускает неограниченные вычисления.

Наблюдаемый побочный эффект является тем , которая моделируется в семантике. В типичных моделях языков программирования потребление памяти не моделируется, поэтому вычисления, для которых требуется 1 ТБ памяти, могут быть чистыми, даже если вы попытаетесь запустить их на своем ПК, это может привести к сбоям.

Другой вид ненаблюдаемого побочного эффекта - тот, который является внутренним для функции. Это то, о чем думает большинство семантиков, говоря о ненаблюдаемых побочных эффектах. Рассмотрим вычисление, которое использует изменяемые данные внутри себя, но не разделяет эти изменяемые данные с какой-либо другой частью программы. Например, функция сортировки списка, которая создает массив с теми же элементами, что и список, сортирует массив на месте и возвращает список, содержащий элементы в виде массива в их окончательном порядке: семантическая модель подвыражений этой функции демонстрирует сторону эффекты (модификации массива), но сама функция не имеет внешних побочных эффектов, поэтому она чистая.

Для более тонкого примера рассмотрим функцию, которая записывает некоторые данные во временный файл и очищает после себя. В семантике, где всегда достаточно места для временных файлов, а программы не разделяют временные файлы, функция не имеет побочного эффекта; временный файл действует как дополнительная память, используемая функцией. В семантике, которая учитывает полные условия файловой системы, функция имеет побочный эффект - она ​​может завершиться ошибкой из-за внешних обстоятельств. В семантике, которая позволяет машине аварийно завершить работу, функция имеет побочный эффект: если во время выполнения функции происходит сбой, временный файл может остаться позади. В семантике, которая позволяет одновременно выполняемым программам видеть и, возможно, изменять временный файл, функция имеет побочный эффект.

Жиль "ТАК - перестань быть злым"
источник